I've read NAT路由器“假设如果在一段时间内没有发送数据,则终止连接。”
I've also read TCP keepalive数据包通常不应包含任何数据。
所以我的问题是:
我问这个是因为我需要在两个端点之间建立可靠的连接,这两个端点都必须能够检测并解决连接问题。我知道我可能只是自己实现了一个keepalive机制,但我想知道TCP实现是否可以用于此。
答案 0 :(得分:2)
我确实认为第二个语句是指有效载荷(最短的TCP / IP数据包长度为40个字节 - TCP标头为20个字节,IPv4标头为20个字节)。
关于第一个,这是RFC 2663的引用:
TCP,UDP和其他人的会话结束
当FIN被确认时,检测到TCP会话结束 会话的两半或任何一半接收到一个段 TCP标志字段中的RST位。但是,因为它是不可能的 NAT设备,以了解它看到的数据包是否实际上是 传送到目的地[...] NAT设备无法安全地假设 包含FIN或SYN的段将是最后一个包 会议[...]因此,可以假设一个会话 在此之后的4分钟后才终止 检测。 RFC中描述了对延长等待期的需求 793 [参考文献7],建议TIME-WAIT持续时间为2 * MSL(最大值 分段寿命)或4分钟。
参考:http://tools.ietf.org/html/rfc2663
根据我的理解,识别会话的任何数据包都会重置TTL计数器 - 但这在很大程度上取决于实现,因为“数据”可以理解为“数据包”(最小40字节)或“数据包有效负载”。尽管如此,@ CodeCaster仍然是现货;永远不要假设一个连接存在,确保它在发送之前(如果可能的话,并且根据重要性,确认收到。)