阶段1、学习nat的四种映射模式。
阶段2、有人提出ping用了udp协议,我说没有,用的是icmp;被反驳:如果没有用到端口,那么路由器如果映射到局域网的pc?愣了一下,无话可说。
阶段3、上网搜索,有提到,利用icmp头的第5、6两个字节的"标识符",路由器用它代替了端口。有了点头绪。
阶段4、开了N个ping程序,wireshark抓包,发现所有的"标识符"都相同,所不同的只有"序号";(发现序号居然是同步递增的,难道ping程序做了进程间的同步?);于是开始怀疑上一条的结论,估计路由器是用 “序号”代替了端口。
阶段5、无意中发现rawsock可以接受所有icmp,也就是网卡收到一条icmp消息,所有rawsocket都可以接收它;(奇怪的是,自己写的rawsocket收不到ping程序的icmp回显信息。这又是一个新的疑问点。)
结论:
路由器转发icmp包时,确实用“标识符”代替了端口号;如果是用sequence代替,那么路由器端口的压力会太大,所以不成立。
至于多个ping可以分别接收不同的icmp返回信息,估计是根据sequce字段来判断是否处理的。