我有一个连接,数据只从服务器以相当高的速率发送到客户端。
那么你将永远看不到保持活动状态信息。当"线上静音"时,才会发送保持活动状态信息。
RFC1122解释了一些关于保持活动状态信息的内容。
"保持活动"机制定期探测连接的另一端,在连接处于空闲状态时,即使没有要发送的数据也会进行探测。
回到你的问题:
有些其他来源表示这是连接空闲的时间,但它们没有进一步定义这意味着什么。
这是TCP在向对等方发出"嘿!还活着吗?"之前等待的时间。
$ cat /proc/sys/net/ipv4/tcp_keepalive_time
7200
换句话说,您一直在使用TCP连接,效果非常好。然而,在过去的两个小时里没有任何数据需要发送。假设该连接仍然存在合理吗?假设中间所有的中间盒子仍然保留有关您的连接的状态也是合理的吗?不同意见不断变化,而保持活动状态并不是RFC793的一部分。
TCP规范不包括保持活动状态的机制,因为这可能会导致:(1)在短暂的互联网故障期间导致完全良好的连接中断;(2)消耗不必要的带宽(“如果没有人使用连接,谁在乎它是否仍然存在?”)。
为了测试保持连接功能,我们拔掉了客户端网卡上的电缆。
这不是在测试保持连接功能。这是在测试TCP重传策略,即TCP尝试多少次以及多久才能成功传递消息。在Linux系统中,这(可能)最终会测试
net.ipv4.tcp_retries2
:
重试多少次才能杀死活动的TCP连接。RFC 1122表示,该限制应该比100秒更长。这是一个太小的数字。默认值15对应于RTO取决于13-30分钟。
但是
RFC5482 - TCP用户超时选项提供了更多影响它的方法。
回到问题:
在重传期间是否发送保持连接探测包是正确的吗?
很合理:TCP已经试图从另一个对等方获取响应,空的keepalive将是多余的。
TCP_KEEPCNT
在断开连接之前,TCP应发送的最大心跳探测数。
TCP_KEEPIDLE
如果在此套接字上设置了SO_KEEPALIVE
套接字选项,则连接需要保持空闲的时间(以秒为单位),然后TCP开始发送心跳探测。
TCP_KEEPINTVL
在各个心跳探测之间过去的时间(以秒为单位)。
TCP_USER_TIMEOUT
在TCP强制关闭连接之前,传输的数据可以在未得到确认的情况下保留的最长时间(以毫秒为单位)。
因此,例如您的应用程序可以使用此选项来确定当没有连接时连接保持的时间(类似于您的NIC拔出示例)。例如,如果您有理由相信客户端会回来(也许他们关闭了笔记本电脑盖子?网络连接不稳定?),您可以指定一个12小时的超时时间,当他们回来时,连接仍将正常运行。