每当客户端发送或接收数据包时,是否通过NAT重置UDP连接的超时时间,或者是否有任何(通用)实现要求客户端主动发送某些内容以保持连接的活跃?
我正在开发一个UDPstream应用程序,我想知道如果我不得不让客户端发送周期性的心跳,除了服务器已经发送,如果没有有效载荷数据。
NAT需要一个状态表 , (src_ip, src_port)原始(src_ip, src_port)元组映射到重写的元组。 在一些实现中,该表还将包含(dst_ip, dst_port) 。
从理论上讲,每当新的数据包从NAT内部发送到外部时,从该状态表中删除条目的超时将被重置 。 每当接收到一个新的数据包时,它也可能会被重置,但RFC 3022在这一点上并不具体。 它只是说,一旦会话结束,状态将被删除,但是它没有定义会话的构成。
因此,只要你不断地发送stream量,它应该保持stream动。
但是,如果主要业务stream入站,则可能需要从客户端向服务器发送临时出站心跳包。
UDP是一种无连接协议:没有超时和没有启动/终止消息。 通常情况下,NAT也是非常不友好的,因为无法知道连接何时终止以及NAT设备何时可以丢弃转发规则。
所以是的,如果你通过NAT使用UDP,你将需要发送心跳,以便让NAT设备知道映射仍在使用中。 但是,您需要发送心跳消息的频率在每个设备和设置上会有所不同。