理解HTTP | 青训营笔记

64 阅读5分钟

HTTP(Hypertext Transfer Protocol)是一种用于在网络上传输超文本的协议,常用于在Web浏览器和Web服务器之间传输数据。HTTP使用TCP/IP协议进行数据传输,其中,客户端发送HTTP请求给服务器,服务器返回HTTP响应给客户端。 HTTP请求和响应的格式如下: HTTP请求:

<method> <request-URI> <HTTP-version>
<headers>
<entity-body>

HTTP响应:

<HTTP-version> <status> <reason-phrase>
<headers>
<entity-body>

其中,method代表请求方法,例如GET、POST、PUT、DELETE等;request-URI代表请求的资源地址;HTTP-version代表HTTP协议的版本号。headers包含请求或响应的各种头信息,例如Content-Type、Content-Length等;entity-body包含请求或响应的实体数据。

在HTTP/1.0协议中,HTTP连接默认采用短连接模式,即每个HTTP请求和响应之间都会关闭连接,因此每次请求都需要重新建立连接,这对于Web服务器和客户端的性能和资源消耗都有很大的影响。

为了解决HTTP/1.0的性能问题,HTTP/1.1引入了长连接模式。长连接模式意味着HTTP连接可以在一个TCP连接上保持打开状态,直到客户端或服务器决定关闭它。这样,在同一个连接上可以传输多个HTTP请求和响应,避免了每次请求都需要重新建立连接的问题。

HTTP/1.1的长连接模式可以通过在请求头中添加"Connection: keep-alive"字段来实现,这样在服务器端会保持该连接长时间打开状态,直到客户端发出"Connection: close"关闭请求,或者由于超时或其他原因而被服务器关闭。

需要注意的是,长连接并不是永久保持打开状态,它仍然有可能因为超时、空闲或者其他原因而被关闭。同时,在长连接模式下,由于多个HTTP请求和响应都共用同一个TCP连接,因此需要特别注意请求和响应的顺序,以避免出现队头阻塞问题,影响性能。

队头阻塞是HTTP/1.1中的一个性能问题,也称为“线头阻塞”(Head-of-Line Blocking),指在使用长连接模式时,多个HTTP请求共享同一个TCP连接,在前一个请求的响应没有被完全接收之前,后续请求必须等待,因为HTTP/1.1要求HTTP响应必须按照请求的顺序返回。这就导致在一个TCP连接上,某个请求的响应被延迟了,后续请求就会被阻塞等待,导致性能降低。

队头阻塞的原因是HTTP/1.1中的长连接模式,它使得多个HTTP请求共享同一个TCP连接,因此后续请求必须等待前一个请求的响应完成,才能发送下一个请求。而如果前一个请求的响应很慢或被阻塞,后续请求就会一直等待,影响了性能。 为了避免队头阻塞问题,可以采用以下方法:

  1. 使用HTTP/1.1的管道化技术,它允许在同一个连接上发送多个请求,而不必等待前一个请求的响应。但是管道化技术存在缺陷,它要求服务器必须按照请求的顺序返回响应,因此仍然可能出现队头阻塞的问题。
  2. 使用HTTP/2协议,它引入了多路复用技术,可以在一个连接上并行处理多个请求和响应,避免了HTTP/1.x中的队头阻塞问题。

HTTP/2是HTTP协议的一个新版本,它相较于HTTP/1.x有很多提升:

  1. 多路复用:HTTP/2允许在同一个连接上同时进行多个请求和响应,避免了HTTP/1.x中的队头阻塞问题,提高了并发性能。
  2. 二进制分帧:HTTP/2将HTTP报文拆分成多个二进制帧,每个帧都有一个帧头和帧体,使得网络传输更加高效,减少了报文头的重复传输。
  3. 头部压缩:HTTP/2使用HPACK算法对HTTP头部进行压缩,减少了头部的大小,节省了网络带宽。
  4. 服务器推送:HTTP/2支持服务器推送,即服务器可以在客户端请求前主动推送资源到客户端,避免了客户端重复请求,提高了响应速度和性能。
  5. 安全性:HTTP/2强制使用TLS加密传输数据,提高了数据传输的安全性和保密性。

HTTP/3是HTTP协议的一个新版本,它相较于HTTP/2有很多提升:

  1. 基于QUIC协议:HTTP/3使用QUIC协议作为传输层协议,QUIC在UDP协议的基础上添加了可靠性、多路复用和头部压缩等特性,能够减少连接建立和关闭的延迟,提高了网络传输的效率和可靠性。
  2. 0-RTT连接:HTTP/3支持0-RTT连接,即在第一次建立连接时就可以发送数据,避免了TCP建立连接和TLS握手的延迟,提高了响应速度。
  3. 头部压缩:HTTP/3使用QPACK算法对HTTP头部进行压缩,相较于HTTP/2的HPACK算法,QPACK可以在客户端和服务器端进行动态压缩和解压缩,减少了头部的大小,节省了网络带宽。