Ping经过路由器的运行过程解析

闲来无事,就用Packet Tracer 5.0搭建网络环境模拟一下Ping的运行过程,以此来捋顺ARP、ICMP等协议在TCP/IP网络体系各层上的详细流程。 用Packet Tracer 5.0搭建如下图所示的简化网络环境: 

PS:以上模拟环境搭建后,arp –a 查看主机A、B都无ARP记录。A和B都配置正确的网关。然后PCA执行ping PCB动作,PCA:>ping 192.168.1.2 –n 1
 一、在主机PCA端:  

1. Ping处理进程产生一个 ICMP回应请求(ICMP Echo Request message),ICMP把这个数据段发给网络层协议进行ip封装。 
2. IP协议创建一个数据包,其中包含源和目的ip地址、协议字段0x01(告诉接收方主机IP协议,应把这个包中的DATA交由ICMP来处理)。  

3. 数据包创建后,在发出之前,IP协议判断目的IP,发现192.168.1.2不是本地网络的地址也不是广播地址。

4. 在IP判定数据包是发往远程网络的之后,就要把数据包发给默认网关处理.

5. 主机A的默认网关被配置为192.168.0.1,即Router0的F0/0端口。本地局域网通信都是根据MAC地址的,要将数据包发给Router0的F0/0就要知道它的MAC地址。启动ARP协议。

6. ARP进程查询PCA主机上的ARP缓存,发现ARP缓存表中没有192.168.0.1对应的MAC条目。这时ARP暂存数据包并产生一个ARP请求。

7. ARP请求被封装成帧后被广播出去,在同一个网络内的网络设备都接收这个帧(因为MAC为广播地址)。

二、在Router0端:

8. 和PCA同一子网内的Router0的F0/0网卡接口接收上面到的ARP数据封装帧后,进行帧校验(不正确丢弃)后,该帧将被传送给设备驱动程序。设备驱动程序判断这是ARP类型数据,就交给ARP协议,ARP协议读取这个ARP数据,判断其中TARGET IP(不是自己的丢弃)是不是发给自己的数据。 

9. 目标IP:192.168.0.1,是给自己的数据,ARP进程则读取数据中的Opcode(操作码)判断这是一个ARP请求。然后根据数据里的SOURCE地址把对方的IP-MAC映像写入本地ARP缓存表里,然后产生一个ARP回应给192.168.0.2(PCA)。 


10. ARP进程把产生的ARP回应交给数据链路层封装成帧(看上图),然后交给物理层一位一位发出去。过程类似上面的过程。
  

三、回到主机PCA端:

11. 网卡收到ARP回应帧后,判断这个帧,过程类似Router0端接收ARP请求过程。ARP进程从这个回应数据中读取source IP-MAC地址映象并写入本地ARP缓存中。ARP进程将之前暂存的IP数据包和Router0的f0/0的MAC地址交给数据链路层,封装成帧后发出。如下图:


四、再到Router0端

12. Router0的f0/0接到上面的数据帧后,帧校验正确后,检查Destination MAC是给自己的,且TYPE指示帧中数据部分是是IP数据包,所以就把其中的数据部分交给IP协议。IP进程读取数据包中的目标地址:192.168.1.2,发现它和该路由器配置的任一个接口的IP地址都不匹配。

13. 接下来,路由器在其路由表中查找目的地址192.168.1.2的网络地址192.168.1.0的表项(如果查不到丢弃并回应一个目标不可达的ICMP给源IP),这里查到目标网络是和f0/1接口直接相连的,不需要路由协议,直接把数据包交换到F0/1接口的缓冲区中。注意:交换数据包的过程不改变IP数据包的内容,只把TTL-1=127(因为经过了一跳)。
 

14. 同样的,f0/1得到这个数据包后,也要先找到目标IP的MAC地址才能把它交给数据链路层封装成帧。ARP进程查询路由器上的ARP缓存,发现ARP缓存表中没有192.168.1.2对应的MAC条目。这时ARP暂存数据包并产生一个ARP请求。过程同PCA主机寻找默认网关MAC,不在详述。

15. f0/1ARP进程取得目标主机的MAC后,把PCB的映像写入ARP缓存。并把数据包和目标MAC交给数据链路层封装成帧,发出去。 

 
五、在PCB主机端

16. 在15步之前,PCB收到Router0F0/1(192.168.1.1)的ARP请求后,把F0/1的IP-MAC地址写入该机ARP 缓存表。

17. PCB接收到Router0 f0/1发来的数据帧后。帧校验正确后,检查Destination MAC是给自己的,且TYPE指示帧中数据部分是是IP数据包,所以就把其中的数据部分交给IP协议。

18. IP进程读取数据包中的目标地址:192.168.1.2,发现是给自己的数据,然后发现PROTOCOL字段(0x01)是ICMP。则把该包中数据部分交给ICMP协议,ICMP进程读取数据。

19. ICMP进程发现TYPE: 0x8是一个Ping回应请求。它就应邀产生一个TYPE: 0x0的ICMP(Ping请求响应),然后交给IP协议,IP进程把之前数据包的源IP当目的IP进行封装,之后检查这个IP是远程网络的。就要交给默认网关处理。调用ARP协议,ARP进程查本机ARP缓存,发现有192.168.1.1(网关)的条目。IP协议从ARP进程得到网关的MAC后,把数据包和MAC地址交给数据链路层封装成帧。然后由物理层发出去。


六、在Router0端

20. F0/1接口收到这个帧后(其实这里忽略了物理层),经过校验和检查MAC,判断是给自己的正确的帧,且数据内容是IP数据包,就把数据交给IP协议。IP进程发现目标IP不是本地网络,就查路由表,查到它的网络地址连接在f0/0接口,就把数据包中TTL-1后交换到F0/0的缓存中。

21. f0/0接口的IP进程检查从F0/1转过来的数据包的目的IP,发现在它在自己网络内。ARP进程从ARP缓存中查到目标ip的MAC后提供给IP协议,IP协议把数据包和MAC再交给数据链路层封装成帧。
  

七、在PCA端

22. PCA主机网卡接口收到f0/0发来的帧后(其实这里忽略了物理层),经校验和确认MAC是自己的后,读取帧类型,发现是IP数据包,就交给IP协议。IP核对目的IP地址后发现数据包协议字段是ICMP的,就把数据包中数据部分(ICMP报文)交给ICMP协议。ICMP进程发现报文中类型字段是对Ping请求的响应(0x00),然后就把处理响应的结果显示给正在等待的Ping请求的用户的屏幕上.


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章