# 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)请求。