我们使用的手机,网络公司的服务器往往都采用了NAT技术,因此,做网络系统开发绕不开这个问题。IM系统中的心跳,直播系统等跟NAT息息相关。
一个简单的NAT结构如下图,内网用户主机PC(192.168.1.3)向外网服务器(1.1.1.2)发送的IP报文通过NAT设备。(怎么看IP报文,可以参考另一篇文章《IM系统开发中如何调试TCP协议》,做超链接都需要权限……)
发报文过程:NAT设备查看报头内容,发现该报文是发往外网的,将其源IP地址字段的私网地址192.168.1.3转换成一个可在Internet上选路的公网地址20.1.1.1,并将该报文发送给外网服务器,同时在NAT设备的网络地址转换表中记录这一映射。
收报文过程:外网服务器给内网用户发送的应答报文(其初始目的IP地址为20.1.1.1)到达NAT设备后,NAT设备再次查看报头内容,然后查找当前网络地址转换表的记录,用内网私有地址192.168.1.3替换初始的目的IP地址。
这就是基本的NAT结构及消息收发过程,实际网络环境下,NAT有很多改进方式,比如将多台Host(多个IP)映射为一个公网IP。但是基本原理就是这样,最多是映射表(路由表)复杂一些。
看一个具体的业务场景。我们用手机打开微信,微信服务器给我们发消息。消息流程如下图
消息从微信服务器,经过网络,到达基站。基站在这里可以认为是一个NAT设备,基站通过查询NAT路由表确定这条消息是发给哪个手机的。最终,消息成功发送到手机的微信程序中。
手机类的设备移动很强,比如天安门的基站,每天可能有数十万甚至上百万人会连接(游客,一会就去别的地方了),基站没有那么多资源(端口,内存等)一直保留100万个手机的路由表,因此基站会将长时间不收发消息的手机从路由表中清除,如果此时微信给你发消息,基站将无法找到你的手机,你就收不到消息了(NAT失效)。
怎么确保手机不被基站从路由表中清除了,时不时发一条数据,这就是IM类软件心跳的一个重要作用。移动、联通NAT失效时间是5分钟,电信失效时间约30分钟(良心企业啊),这就是为什么微信每隔4.5分钟一定会有一个心跳(或别的消息)的原因。
NAT基本原理已经说明,这个结构中,需要手机先向微信服务器发送报文,基站才能建立NAT路由表。如果手机不访问微信服务器,微信服务器就没有办法找到手机。但是向实时视频类的功能,需要躲在两个NAT设备后的手机能够互相发现,这就需要NAT穿透的技术,下一篇文章将进行介绍。