# HTTP连接管理
# 短连接、长连接
在HTTP(0.9/1.0)中,客户端和服务器之间产生一次请求响应之后,就会断开连接,不会保持长时间的链接状态,这种被称为短连接
(short-lived connections)。长连接则是使多个请求公用一个TCP连接和关闭。
# 短连接
TCP在建立和关闭连接的时候,都会非常耗时。建立连接时,三次握手,需要发送3个数据包,耗时1个RTT,关闭连接时,四次挥手,需要发送4个数据包,耗时2个RTT。
# 长连接
多个请求/响应公用一个TCP连接。
当客户端发送第一个请求,服务器可以通过响应头Connection: keep-alive
告诉客户端,服务器是支持长连接,客户端将会复用第一个请求的TCP发送数据。
长连接长时间开启不关闭,也会耗费服务器的资源,需要主动去关闭。客户端可以通过请求头Connection:close
,进行关闭。服务器可以通过设置keepalive_timeout
(长连接时间)、keepalive_requests
(长连接最大请求数),进行主动关闭。
TIP
RTT(Round-Trip Time)往返时间延迟,表示发送端从发送数据开始,到发送端收到接收端的确认时间周期。
RTT = 传播时延(往返) + 排队时延(路由器和交换机) + 数据处理时延(应用程序)。
TCP只有1RTT是因为,第三次握手没有构成一个完整的往返。
# 队头阻塞(Head-of-line blocking)
HTTP规定报文只能一发一收,这就形成了串行的对列表,在队列中,排在前面的会优先处理。这就导致,后面的请求必须要等到前面的请求结束了才能处理,如果前面的接口超时,后面的接口很可能也会超时。
并发链接
,客户端可以同时发送多个(通常为6-8)请求。