【问题标题】:Windows TCP keepalive sending 1 byte messages with no PSH [closed]Windows TCP keepalive 发送没有 PSH 的 1 字节消息 [关闭]
【发布时间】:2012-10-15 19:05:48
【问题描述】:

我有一个来自我认为是 Windows 客户端的流量捕获。我注意到它有时会发送 Wireshark 识别为“TCP Keep-Alive”的内容,但它不仅设置 ACK 并且不发送任何数据,而是将 SEQ 备份一个八位字节并重新发送该数据。

(C = 客户端,S = 服务器,相对 seq / ack)

(connected, data transferred back and forth)
1  C: PSH      Seq=21, Ack=41, Len=12
2  S: PSH ACK  Seq=41, Ack=33, Len=12
3  C:     ACK  Seq=33, Ack=53
4  S: PSH ACK  Seq=53, Ack=33, Len=1
5  C:     ACK  Seq=33, Ack=54
   ... 3 seconds pass ...
6  C:     ACK  Seq=32, Ack=54, Len=1 (resends the last octet from #1)
7  S:     ACK  Seq=54, Ack=33
   ...

这是发送 TCP keepalive 时 Windows 堆栈的正常行为吗?

【问题讨论】:

    标签: windows networking tcp winsock


    【解决方案1】:

    这就是保持活动的部分。它不是一个单独的协议,它只是一个带有已经确认的序列号的冗余发送,以触发一个带有当前序列号的 ACK 作为回复。也不需要设置 PSH 标志。

    【讨论】:

    • 据我了解,TCP keep-alive 不应该发送任何数据。我猜windows的实现是不同的,仅此而已。
    • @Wade 没有keepalive 的“Windows 实现”之类的东西。只有keepalive,这就是它的实现方式。你需要接受这样一种观念,即你的先入之见并不准确。
    • 不要太挑剔,我非常感谢您的回答,但肯定有一个“Windows 实现”发送 len=1,而 Linux 实现发送 len=0。
    • @Wade 这正是 TCP keepalive 数据包应该看起来的样子。已确认的一字节数据。
    • @user207421 IETF 并不完全同意您的看法。 RFC 1122 说:“一个实现应该发送一个没有数据的保活段;但是,为了与错误的 TCP 实现兼容,它可以配置为发送一个包含一个垃圾八位字节的保活段。”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 2021-01-13
    • 1970-01-01
    • 2015-01-09
    • 2016-07-31
    • 1970-01-01
    相关资源
    最近更新 更多