每次客户端发送或接收数据包时,通过 NAT 的 UDP 连接的超时是否会重置,或者是否存在任何(常见的)实现要求客户端主动发送某些内容以保持连接处于活动状态?
我正在开发一个 UDP 流应用程序,我想知道如果没有有效负载数据,我是否必须让客户端除了服务器已经发送的心跳之外还发送定期心跳。
答案1
NAT 需要状态表,即原始元组到重写元组的映射(src_ip, src_port)
。在某些实现中,该表还将包括(dst_ip, dst_port)
。
理论上,从该状态表中删除条目的超时时间将是重置每次有新数据包时发送从 NAT 内部到外部。它可能每次有新数据包时也会重置已收到相反的方向,但RFC 3022在这一点上没有具体说明。它只说会话结束后状态将被删除,但没有定义什么是会话。
因此,只要您继续向外发送流量,它就应该继续流动。
然而,如果主要交通流是入站它可能有必要偶尔从客户端向服务器发送出站心跳包。
答案2
UDP 是一种无连接协议:没有超时,也没有启动/终止消息。通常,它对 NAT 也非常不友好,特别是因为无法知道连接何时终止以及 NAT 设备何时可以删除转发规则。
所以是的,如果您通过 NAT 使用 UDP,则需要发送心跳,以便让 NAT 设备知道映射仍在使用中。不过,发送心跳消息的频率会因设备和设置而异。