TCP长连接和HTTP长连接
1. TCP长连接
TCP长连接是一种保持TCP连接的机制。当一个TCP连接建立之后,启用TCP Keep Alive的一端便会启动一个计时器,当这个计时器到达0之后,一个TCP探测包便会被发出。这个TCP探测包是一个纯ACK包。
Keep Alive 技术是TCP中的一个可选项,因为不当的配置可能导致TCP连接被提前概念比,因此默认关闭
2. HTTP长连接
在HTTP中,当一个网页的内容变得复杂之后,包含了大量的图片,css等资源,如果每个资源都需要建立一次http连接,那么回导致资源的浪费。因此引入了HTTP persistent connection 概念,也成为HTTP长连接
TCP连接建立之后,HTTP协议使用TCP传输HTTP协议的请求(Request)和响应(Response)数据,一次完整的HTTP事务如下图:
从图中可以看出,一个完整的HTTP事务,有连接的建立、请求的发送、响应接收、断开连接这四个过程早期通过HTTP协议传输的数据以文本为主,一个请求可能就把所有要返回的数据取到。但是,现在要展现一张完整的页面需要很多个请求才能完成,如图片、JS、CSS等,如果每一个HTTP请求都需要新建并断开一个TCP,这个开销是完全没有必要的。
开启HTTP长连接能够复用已有的TCP连接
当前一个请求已经响应完毕,服务器端没有立即关闭TCP连接,而是等待一段时间接收浏览器端可能发送过来的第二个请求,通常浏览器在第一个请求返回之后会立即发送第二个请求。如果某一时刻只能有一个连接,同一个TCP连接处理的请求越多,开启KeepAlive能节省的TCP建立和关闭的消耗就越多。
当然通常会启用多个连接去从服务器器上请求资源,但是开启了keep-alive之后,仍然能加快资源的加载速度。HTTP/1.1之后默认开启keep-alive,在HTTP的头域中增加Connection选项。当设置为Connection: keep-alive表示开启,设置为Connection: close表示关闭。
3. TCP长连接和HTTP长连接比较
TCP的keepalive是侧重在保持客户端和服务端的连接,一方会不定期发送心跳包给另一方,没有断掉一方的定时发送几次心跳包。如果间隔发送几次,对方都返回的是RST,而不是ACK,那么就释放当前连接。
HTTP的keep-alive一般我们都会带上中间的横杠,普通的HTTP连接是客户端连接上服务端,然后结束请求后,由客户端或者服务端进行http连接的关闭。下次再发送请求的时候,客户端再发起一个连接,传送数据,关闭连接。这么个流程反复。但是一旦客户端发送connection: keep-alive头给服务端,且服务端也接受这个keep-alive的话,这个连接就可以复用了。一个HTTP处理完之后,另外一个HTTP数据包也直接从这个连接发送。减少新建和断开TCP连接的消耗。
二者的作用简单来说:
HTTP协议的keep-alive意图在于短时间内连接复用,希望可以短时间内在同一个连接上进行多次请求/响应。
TCP的KeepAlive机制意图在于保活、心跳、检测连接错误。当一个TCP连接两端长时间没有数据传输时(通常默认配置是2小时),发送keepalive探针,探测链接是否存活。
总之,记住HTTP的Keep-Alive和TCP的KeepAlive不是一回事。
TCP的keepalive是在ESTABLISHED状态的时候,双方如何检测连接的可用性。而HTTP的keep-alive说的是如何避免进行重复的TCP三次握手和四次挥手的环节。