关于内网客户端与服务器的通信,这样理解对不对

关于内网客户端与服务器的通讯,这样理解对不对?
一个处在内网中的客户端,与服务器连接,如果用的是UDP的话,必须每隔一段时间,由客户端或者服务器发一个心跳包,这个心跳包的作用是维持NAT Sesion。否则有可能被网关断掉。

如果是TCP连接的话,是不会被网关断掉NAT Sesion的,这种连接可以长期存在(即使不发任何数据),但是,如果两边有一边因为死机、断电突然断掉的话,这种连接会长期保持,而另一边无法察觉。这此,还是需要发送心跳包,不过此心跳包的作用不是维持Nat Session,而是为了防止出现“僵尸连接”。

我这样理解对吗?

------解决思路----------------------
网关的设备种类无数, 你的理解, 如果是刚入门,那么可以认为是正确的
大部分网关确实会这么处理
如果你的代码要投入实际应用,那么可能会遇到比较频繁的意外

tcp的连接, 如果2边长时间都没有通讯 ,例如两边同时系统崩溃, 要是网关还那么白痴一样的维持nat session, 那就有问题了
所以实际上, 除了对 ftp 这样的常见标准协议 ,当数据连接进行时,会自动维持指令连接 session外, 其他的都是根据设置来进行的, 比较常见的参数是6小时, 如果6个小时内, 内网这边的物理链路始终保持连接状态,并且没有出现同一个端口发起新的连接,即使没有任何数据或者新跳包 , 网关也会给你保持nat session [tcp] .  但是6个小时后, 无任何数据的nat session,除非是已知长连接协议,否则会被清理掉.
而udp就更复杂了, 网关的处理,除非已经识别的协议, 否则一般都会在5分钟内,如果没有udp数据包的话,就kill掉这个session
有些udp端口采用一对多发送, 网关会误判,例如cisco, 默认每一对连接都重新分配一个端口, 会导致即使维持2分钟发送一个数据包,实际也会在大约3分钟被强制清理掉.

总之, 你编写代码要按你最开始的理解去写,但是实际处理的时候,需要加入各种容错, 一味的认为应该怎么样或者肯定怎么样,只会走进死胡同.