向上跳过程:
路由器从LAN口接收到报文后,报文的srcIP被路由器修改为路由器WAN口的IP,srcPort也被修改为动态分配的端口号;路由器记录下
srcIP和srcPort,并与动态分配的端口号绑定。动态端口号、srcIP、
srcPort这三项将作为NAT表格的一行添加进NAT表。
报文的dstIP和dstPort不会改变。
往下穿过程:
路由器从WAN口接收到报文后,根据报文的dstIP和dstPort查找NAT表
(此时dstPort对应向上跳过程中动态分配的端口号,dstIP对应条目中的srcIP项),找到该条目之后,就用条目中记录的srcIP和srcPort替换报
文的dstIP和dstPort,并将该报文投递给LAN口。
报文的srcIP和srcPort不会改变。
总结:
根据以上原理可知,公网服务器不在乎内网
用户的存在,它所接收到的报文都来自于直接相连的路由器。
而内网的计算机则无视路由器的存在,它尽管认为跟它直接相连的就是具有目标IP的服务器即可。
(注:ICMP穿透也类似,虽然ICMP不具有Port,但路由器利用了ICMP报头的ID和SEQ字段 作为类似端口号的操作;
只是各操作系统对ICMP的处理不同,比如Windows不会改变ICMP的ID字段,而是改变SEQ;
而类Unix系统会改变ID字段。其实这也不是操作系统的不同,而是其ping实用程序的不同罢了。
路由器必须同时支持这两种方案。)NAT的实现完全依赖于路由器,所以购买路
由器的时候需要注意。NAT原理是P2P的基础,所幸的是当前的路由器产品几乎都支持NAT。