【问题标题】:Does TCP keepalive refresh the timeout on a NAT?TCP keepalive 是否刷新 NAT 上的超时?
【发布时间】:2013-12-10 15:09:33
【问题描述】:

I've read NAT 路由器“如果在特定时间段内没有发送数据,则假定连接已终止。”

I've also read TCP keepalive 数据包通常不应该包含任何数据。

所以我的问题是:

  1. 以上说法属实吗?
  2. NAT 路由器在重新排序/清理其表时是否考虑空 TCP keepalive 数据包?

我问这个是因为我需要两个端点之间的可靠连接,它们都必须能够检测到连接问题并做出反应。我知道我可能只是自己实现了一个保活机制,但我想知道 TCP 实现是否可以用于此。

【问题讨论】:

  • 这取决于路由器。永恒的联系是一个乌托邦;只需确保检测到断开的连接并重新连接即可。

标签: sockets tcp nat


【解决方案1】:

我确实相信第二个语句是指有效负载(可能的最短 TCP/IP 数据包长 40 个字节 - TCP 标头 20 个字节 + IPv4 标头 20 个字节)。

关于第一个,这里引用 RFC 2663:

TCP、UDP 和其他的会话结束

当 FIN 被确认时检测到 TCP 会话的结束 会话的两半或当任何一半收到一个片段时 TCP 标志字段中的 RST 位。但是,因为不可能 一个 NAT 设备来知道它看到的数据包是否真的是 传送到目的地 [...] NAT 设备无法安全地假设 包含 FIN 或 SYN 的段将是最后一个数据包 会话 [...] 因此,可以假定会话已经 仅在此之后的 4 分钟后终止 检测。 RFC 中描述了对这种延长等待期的需求 793 [Ref 7],这表明 TIME-WAIT 持续时间为 2 * MSL(最大 段生命周期)或 4 分钟。

参考:https://www.rfc-editor.org/rfc/rfc2663

据我了解,任何标识会话的数据包都会重置 TTL 计数器 - 但这在很大程度上取决于实现,因为“数据”可以理解为“数据包”(最少 40 个字节)或“数据包有效负载”。尽管如此,@CodeCaster 是正确的。永远不要假设连接是活动的,在发送之前确保它是活动的(并且,如果可能并根据关键性,确认接收。)

【讨论】:

  • 感谢您的参考。现在我想知道为什么要使用 TCP keepalive 但我认为这是另一个问题......
  • 我认为 keep-alive 存在的理由在于防止不必要的连续握手 - 这样做是有代价的,所以如果你打算发送几个小数据包,那么保持连接比这样做更好一切从头再来。
  • 是的,当然是。我的意思是 built-in keepalive 与每 x 分钟/秒发送 ping-pong-packets 的自制实现相比;)
  • 啊 - 我现在明白你的意思了,把它归咎于缺乏咖啡。 =) 说实话,在我过去工作过的大多数套接字实现中,即使有一点 QoS,待办事项列表上的第一件事就是保持活动机制。
猜你喜欢
  • 2012-05-20
  • 2013-12-29
  • 1970-01-01
  • 2014-10-29
  • 1970-01-01
  • 2021-11-17
  • 1970-01-01
  • 2013-08-09
  • 2018-10-20
相关资源
最近更新 更多