【问题标题】:Can I make TCP Keep-Alive symmetric?我可以使 TCP Keep-Alive 对称吗?
【发布时间】:2014-09-12 00:51:35
【问题描述】:

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

【问题讨论】:

    标签: linux windows sockets nginx tcp


    【解决方案1】:

    TCP Keep-Alives 是一种后来添加到协议中的 hack。

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

    4.2.3.6 TCP 保持活动

    [...剪辑...]

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

    [...剪辑...]

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

    如 RFC 中所述,在某些情况下,TCP 实现将无法正确响应此类请求,除非它包含至少一个 八位字节 数据。我不知道哪些(微软?)...

    此外,文档说只有服务器端才能使用 Keep-Alive 功能。当然,如果您知道服务器开启了 Keep-Alive,那么您就无需在客户端中使用它。

    【讨论】:

      猜你喜欢
      • 2016-09-07
      • 1970-01-01
      • 2013-03-25
      • 1970-01-01
      • 1970-01-01
      • 2017-03-23
      • 1970-01-01
      • 2017-02-19
      • 1970-01-01
      相关资源
      最近更新 更多