Posted by lily's blog on September 20, 2024

从输入URL到页面显示发生了什么

简洁步骤

  1. 浏览器使用DNS协议查找URL对应的IP地址,生成Http请求报文
  2. 客户端通过ip和端口号向服务端发起建立TCP连接
  3. 在TCP连接的基础上向服务端发送http请求报文
  4. 服务端接收到请求报文并解析,生成对应的html页面发送给客户端
  5. 客户端解析http请求,渲染并展示html页面,同时根据Html中的其他资源的url(例如图片,css等)再次发起http请求,获取完整资源内容

    使用到的协议

  6. 应用层:DNS协议,Http协议
  7. 传输层:TCP协议
  8. 网络层:IP协议,OSPF(开放最短路径优先协议), ARP协议(ip地址寻找转换为MAC地址)
  9. 网络接口层

HTTP状态码

  1. 1xx:正在处理请求
  2. 2xx:成功处理
  3. 3xx:重定向
  4. 4xx:客户端错误
  5. 5xx:服务端错误

Http与Https有什么区别

  1. 端口号:http默认为80,https默认443
  2. URL前缀
  3. https具有安全性:https是运行在SSL/TLS之上的HTTP协议,ssl协议运行在TCP协议之上,所有传输内容都经过对称加密,但对称加密的密钥用服务方的证书进行了非对称加密
  4. SEO(搜索引擎优化):搜索引擎会更优先使用https协议

Http1与http1.0区别

  1. 连接方式:http1.1支持长连接。http协议的长短连接实质上是TCP协议的长短连接
  2. 状态响应码:http1.1中新增了大量的状态码,比如100(continue)在请求大资源前的预热请求
  3. 缓存机制:HTTP/1中主要使用header的 if-modified-since,Expires作为缓存是否可用的标准,Http/1.1引入了更多的缓存控制策略例如Entity tag,if-Unmodified-Since,If-Match,If-None-Match等更多的请求头控制缓存策略
  4. 带宽:http1.1在请求头中引入了range头域,它允许只请求资源的某个部分
  5. Host头:http1.1引入了host头字段,允许在同一ip地址上托管多个域名,从而支持虚拟主机的功能。

Http/2

http1.1与http2.0区别

  1. 多路复用:http/2在同一连接上可以同时传输多个请求和响应,互不干扰。http1.1使用串行方式,每个请求和响应都需要独立的连接
  2. 二进制帧:http2使用二进制帧进行数据的传输,http1.1使用文本格式的报文
  3. 头部压缩:http1.1支持body压缩,header不支持压缩,http2使用HPACK算法压缩头部
  4. 服务器主动推送:客户端使用奇数Stream号发起请求,服务端使用偶数号Stream进行主动推送

Http2和http3的区别

  1. 传输协议:
    1. http2是基于tcp协议实现的,而http3在http2的基础之上新增了QUIC(quick UDP Internet Connections)协议来实现可靠传输。QUIC可以看作UDP的升级版本,在其基础上增加了加密,重传等。
  2. 连接建立:
    1. Http2由于底层是TCP协议,需要经过三次握手过程,需要3个RTT来实现连接的建立和通信。而http3由于底层是QUIC协议(如果使用TLS1.3传输,TLS1.3支持1个RTT握手,还支持0个RTT握手),连接的建立仅需要1个或0个RTT。
  3. 对头阻塞
    1. Http2由于多个请求复用一个tcp连接,一旦发生丢包,会阻塞所有的Http请求。由于QUIC协议本质上是多路复用+轮询机制,一个连接建立多个不同的数据流,这些数据流之间独立互不影响,在一定程度上解决了对头阻塞问题。
  4. 错误恢复:
    1. Http3具有更好的错误恢复机制,当出现丢包、网络延迟等问题时可以更快地进行恢复和重传。http2需要依赖TCP地错误恢复机制。
  5. 安全性:
    1. HTTP2使用TLS协议进行加密,而http3基于QUIC协议,包含了内置的加密和身份验证机制,可以提供更强的安全性。

      Http1,hhttp2,http3对比

      协议栈对比 ![[Pasted image 20240616104511.png]]

http2的升级

  1. 兼容http1.1
  2. 只在应用层做了改变,仍然基于TCP协议传输,但是把http分解为了【语义】和【语法】两部分
    1. 语义层与http/1.1一致,请求方法,状态码,头字段等规则保持不变
    2. 语法层面做了很多改造

      头部压缩

      http报文是由header+body构成的,header部分有很多重复的占字节量大的字段,因此需要采用HPACK算法对header部分做改造。

  3. 需要压缩:很多固定字段,Cookie,User Agent,Accept等
  4. 减少重复字段
  5. 字段为ASCII编码,有必要改成二进制编码

    HPACK算法

    三个组成部分

  6. 静态字典:包含61组index–header name–header value的维护关系,例如index=2代表采用post请求
  7. 动态字典:静态表只包含了61种高频出现的头字符串,不在静态表范围内的字符串需要自行构建动态表
  8. Huffuman编码(压缩算法) 客户端与服务端都会建立和维护【字典】,用索引号表示重复的字符串,再用Huffman压缩数据,可达到50%-60%的压缩率。

二进制帧

把http/1.1中的文本格式改成二进制格式传输数据,提高了传输与解析数据的效率 http/2把传输报文分为两类帧,headers和DATA帧。这两种帧都分别有各自的格式。

并发传输

http/1.1对头阻塞:1.1是基于请求-响应模型的,如果上一个事务未响应,则后续事务需要等待,这就会造成队头阻塞 通过Stream设计,多个Stream复用一条TCP连接,从而达到并发效果。

Stream的格式

一个stream里有多个Message,Message中对应Http的请求或响应(由头部和包体构成) Message中包含一条或多条Frame,Frame是Http/2的最小单位,以二进制格式压缩存放Http/1中的内容 ![[Pasted image 20240604211951.png]]

意义

  1. Stream帧可以乱序发送,但内部的帧必须是有序的
  2. Stream帧头部会携带Stream ID信息,用于组装Http消息
  3. 效果: 当http/2实现100个并发Stream时,只需要建立一个TCP连接,http/1.1需要建立100个TCP连接。

    服务器主动推送资源

  4. 客户端使用奇数Stream号发起请求,服务端使用偶数号Stream进行主动推送。
  5. 服务端会通过PUSH_PROMISEZ帧传输Http头部,并通过promised Stream ID 字段告知客户端,接下来会在哪个偶数号Stream中发送包体。

URL和URI的区别

  • URI(Uniform Resource Identifier) 是统一资源标志符,可以唯一标识一个资源。
  • URL(Uniform Resource Locator) 是统一资源定位符,可以提供该资源的路径。它是一种具体的 URI,即 URL 可以用来标识一个资源,而且还指明了如何 locate 这个资源。 URL 是一种具体的 URI,它不仅唯一标识资源,而且还提供了定位该资源的信息。

Cookie和Session的区别

todo

GET和POST的区别

  1. 语义:
    1. get通常用于资源的查询和获取资源,POST请求通常用于创建或修改资源。
  2. 幂等:
    1. GET请求是幂等的,即多次请求不会改变资源的状态,而POST请求不幂等,每次执行可能会产生不同的结果或影响资源的状态。
  3. 格式
    1. Get请求的请求数据是拼接在URL之后的,形成查询字符串,post请求通常放在请求体中(body),可以有多种编码格式。
    2. get请求参数长度受到浏览器和服务器的限制,而Post请求的body没有明确的大小限制。
  4. 缓存
    1. 由于get请求是幂等的,所以可以被一些浏览器或其他中间节点(代理,网关)缓存起来,以提高效率和性能。post不适合被缓存,因为每次的执行可能需要实时的响应。
  5. 安全性
    1. 其实如果二者使用http协议都不安全,但是get请求比post请求更加容易泄露敏感数据,因为get请求的参数通常放在URL中

      Http协议与RPC协议

Websocket

什么是webSocket

websocket是一种基于TCP连接的全双工通信,服务端和客户端可以同时发送和接收数据。 它本质上是应用层的协议,弥补了http协议在持久通信能力上的不足。客户端和服务器 仅需要一次握手,而这就可以创建持久性的连接,进行双向数据传输。

websocket与http的区别

  1. websocket双向实时的通信协议,http单向通信协议。http只能由客户端发起,服务端无法主动通知客户端
  2. websocket协议前缀ws://,http前缀http://
  3. websocket通信数据格式比较轻量,数据包头相对较小,http每次通信都要携带完整的头部

Websocket工作过程

  1. 客户端向服务端发送http请求,请求头中包含:Upgrade: websocket 和 Sec-WebSocket-Key 等字段,表示要将协议升级为ws协议
  2. 服务器收到请求,支持升级协议,会回复一个HTTP101状态码,响应头中包含Connection: Upgrade和 Sec-WebSocket-Accept: xxx 等字段、表示成功升级到 WebSocket 协议
  3. 连接建立,可以进行双向的数据传输,数据以帧的形式进行传输。发送端会将消息切割成多个帧发送给接收端,接收端再重新组装
  4. 二者可以主动发送一个关闭帧,表示断开连接,另一方收到回复一个关闭帧,双方关闭TCP连接。