宿舍用路由器的NAT原理,我以为我懂了原来没懂
以前学习过NAT的原理,今天要写一程序模拟这功能,但仔细思考,发现原来我有点地方不明白.当年太想当然了!
拿以下的一个TCP包来说:
192.168.1.17:12345 -----> 202.192.88.22:80
通过路由器,路由器会把源IP改成公网IP,并且记住12345端口是192.168.1.17占用了.
当web服务器返回数据时,发现端口是12345,就知道这是给192.168.1.17的,会把路由器公网IP改成192.168.1.17.
以上是我以前的理解,但今天我突然发现了一些问题:
1,当同时有另一台机192.168.1.100:12345同时发数据呢?同时用一样的端口12345,路由器如何处理?
2,何时删除这种端口与IP间的映射关系?维持时间.
3,要维护端口与私有IP的映射关系会不会太大数据量了?如果有好多台电脑同时上网,这个映射数据会很大,应该很影响上网速度吧~
不知道我的理解对不对,请大家指正
[解决办法]
3元关系:(remote ip:port) (nat port) (local ip:port)
1,外网过来的包:(remote ip:port) 可用
2,内网过来的包:(local ip:port) 可用
核心大致如下:
内网A,B连接外网ip:port相同(外网server)的情况下, 可知外网过来的包具有歧义.
如何消除歧义就是NAT的作用了, NAT只能通过NAT PORT来区分歧义.
1, A,B的的src PORT本来就不同,那么形成两个元组:
1) (remote ip:port)(nat a_port)(local ip_a:a_port)
2) (remote ip:port)(nat b_port)(local ip_b:b_port)
2,更复杂的情况就是A,B的src port相同,那么NAT需要做额外的记录工作:
首先根据Local_ip:same_port,为两个Local_ip生成两个尚未使用的映射port_a,port_b。
之后的内容和第一种相同。
3,步骤1我一开始没有说冲突问题,就是A,B的src PORT已经其他内网计算机NAT映射过而被占用,那怎么办,一样,换个空闲的PORT,做一下额外的记录即可。
[解决办法]
纯属个人理解.