有次,有个网友在Windows命令行敲了个“ping 10.196.255.2”,这可把大家都惊呆了!居然要经历整整36道关卡,才能把ICMP Echo Request从PC1传到PC2。首先,ICMP收到命令,就把这个请求塞进IP层,给它加上一个“邮袋”,里面放着源IP、目标IP,还有协议字段。接下来,IP层会先看看这个邮袋该交给谁。如果是同一个子网,就直接发过去;要是跨了子网,就只能交给默认网关了。 因为PC1的路由表里只有一条默认路由,指向192.168.1.254,所以这个邮袋就被贴上了“外出”标签。不过,要想把数据送到以太网上,还得先找到网关的MAC地址。这时候,Windows就会查一下缓存,发现里面没记录,就只能广播一个ARP请求:“谁是192.168.1.254啊?”结果路由器R1马上回复了自己接口的MAC地址。PC1把这记录存进缓存里,以后就不用再问了。 LAN驱动接过IP数据报后,又给它裹上一层“糖衣”——以太网帧。源MAC填的是PC1自己的网卡地址,目的MAC填的是刚才查到的网关MAC地址,还有以太类型、CRC校验码。物理层把这个帧甩上双绞线,电流就沿着网线飞奔而去。 帧在局域网里跑了一圈后,所有主机和交换机都要把它拆开看看。先用CRC校验一下,如果对不上号就直接扔了;要是对上了就继续看目标MAC地址。因为目标是R1,所以交换机就只把它往R1口里塞,别的口都封死了。 路由器R1拿到这个帧后先翻路由表,发现有一条指向E0/0/1的条目,准备把它发出去。不过出接口也得知道MAC地址才行啊!于是R1又广播了一句:“谁有10.196.255.1啊?”结果PC2听到了立马回复了自己的MAC地址。R1把它存起来备用。 这回R1把目标硬件地址换成PC2的MAC地址,源硬件地址换成自己E0/0/1的接口MAC地址,又封装成一个新的帧扔了出去。结构还是老样子,只不过目的地换成了PC2的MAC。 PC2收到这个帧后也做了一遍CRC校验和目标MAC确认,发现确实是给它的IP报文。IP层再一看协议字段是0x01(代表ICMP),就把它交给ICMP处理。ICMP一看是个请求立马回了个Echo应答。 回程也跟去程差不多了!ICMP应答→IP封装→ARP反向→帧封装→物理层发送。只是这次源IP变成了PC2的地址,目标IP变回了PC1的地址;剩下32道关卡全是反过来跑的。 最后用户就能看到“Reply from”的提示了!双方各自清理缓存、释放资源……这一趟下来可真是不容易啊!