我可以使TCP Keep-Alive对称吗?

时间:2014-09-12 00:51:35

标签: linux windows sockets nginx tcp

我有一个服务器(Ubuntu上的nginx),它有listen 80 so_keepalive=4m::;。我有一个Windows客户端,我用http://msdn.microsoft.com/en-us/library/windows/desktop/dd877220(v=vs.85).aspx设置TCP保持活动超时。我将服务器超时设置为4分钟,将客户端超时设置为5分钟。我现在注意到,使用Wireshark捕获它们之间的数据是4分钟后服务器发送TCP Keep-Alive然后一分钟后(从开始5分钟开始),客户端发送自己的TCP Keep-Alive。收到服务器Keep-Alive数据包后,为什么不重置定时器?有没有办法改变这种行为?

1 个答案:

答案 0 :(得分:0)

TCP Keep-Alives是一种黑客,后来被添加到协议中。

关于您有问题的相关RFC-1122段落:

  

4.2.3.6 TCP保持活动

     

[... snip ...]

     

为确认空闲连接仍处于活动状态,这些实现发送了一个探测段,旨在引起对等TCP的响应。这样的段通常包含SEG.SEQ = SND.NXT-1,并且可以包含或可以不包含一个垃圾八位字节的数据。请注意,在安静的连接SND.NXT = RCV.NXT上,此SEG.SEQ将在窗口之外。因此,该探测使接收方返回一个确认段,确认连接仍然有效。如果对等方由于网络分区或崩溃而中断了连接,它将以RST而不是确认段作为响应。

     

[... snip ...]

换句话说,TCP Keep-Alive段使用旧的序列号(SND.NXT-1),并期望得到有效的答复。确实没有其他任何东西可以将该段与正常段区分开。另一端的TCP堆栈不需要执行任何特殊操作即可知道已发送Keep-Alive段。只要协议正确实施,无论是否启用“保持活动”功能,它都将透明起作用。

如RFC中所述,在某些情况下,TCP实现除非包含至少一个 octet 数据,否则将无法正确回答此类请求。我不知道是哪一个(微软?)...

此外,文档还指出,只有服务器端才应使用Keep-Alive功能。当然,如果您知道服务器已打开Keep-Alive,则无需在客户端中安装它。