TCP keepalive 包

下面是一段网络上抓取的TCP keepalive包,接下来看看TCP keepalive包的内容。

 

根据规范,TCP keepalive保活包不应该包含数据,但也可以包含1个无意义的字节,比如0x0。

TCP保活探测包Seq号是将前一个TCP包的Seq号减去1。

当然,也有人认为保活定时器不合理,给出了不使用保活定时器的理由:

在出现短暂差错的情况下,这可能会使一个非常好的连接释放掉

耗费了不必要的带宽

在按分组计费的情况下会在互联网上花掉更多的钱

HTTP Keep-Alive

在HTTP早期 ,每个HTTP请求都要求打开一个TCP连接,并且使用一次之后就断开这个TCP连接。

这种方式会带来一些问题,尤其是包含图片,JS,CSS的复杂网页,一个完整的页面需要很多个请求才能完成,如果每一个HTTP请求都需要新建并断开一个TCP,这样就会消耗很多服务器的TCP连接资源。

为了缓解这个问题,HTTP 1.1中出现了Keep-Alive这个特性,开启HTTP Keep-Alive之后,能复用已有的TCP链接,当前一个请求已经响应完毕,服务器端没有立即关闭TCP链接,而是等待一段时间接收浏览器端可能发送过来的第二个请求,开启Keep-Alive能节省的TCP建立和关闭的消耗。

 

下面看看我访问一个网页后,通过Wireshark抓取的数据包。

HTTP/1.1之后默认开启Keep-Alive, 在HTTP的头域中增加Connection选项。当设置为"Connection:keep-alive"表示开启,设置为"Connection:close"表示关闭。

在上图中,服务器经过了大概2分钟的时间,然后发出关闭TCP连接的请求。

现在,基本所有的应用服务器都支持设置打开Keep-Alive,以及Keep-Alive timeout的设置。

总结

本文介绍了TCP中的4种定时器,并详细的介绍了坚持定时器和保活定时器。

在保活定时器的介绍中,对比介绍了HTTP的Keep-Alive特性。HTTP协议的Keep-Alive意图在于连接复用;TCP的keepalive机制在于保活、心跳,检测连接错误,两者的作用完全不同。

因为TCP keepalive不能满足实时性的要求,很多应用程序会在应用层实现heart beat(心跳包)来确认TCP连接的可用性。




相关内容