pc1---ping ---pc2 也就是pc1:192.168.1.1 ping pc2:192.168.1.2 属于同一网段的ping过程
步骤1、ping开始------------------------------------------即后台运行192.168.1.1 ping 192.168.1.2
解释:ping过程是源主机ICMP协议发送一个ICMP协议报文给目的主机的ICMP协议,目的主机收到ICMP报文后,ICMP协议规则规定收到请求报文要强制回一个应答报文给源主机。源主机收到应答报文后一次完整的ping过程才算完成。ICMP(internet-control-message-protocol)网际控制信息报文---名字就说明此报文的用途,发送一些网络间控制信息的报文。比如ping中强制应答就是控制信息。ICMP属于TCP/IP网际层,调用同样位于网际层的IP协议,只是比IP层更接近上层而已,ICMP协议号是1。
步骤2、PC1开始封包---------------------------------------确切说是pc1的TCP/IP协议簇开始封包
解释:封包就是把要发送的数据封装在有固定头部格式的协议内方便传输中识别和控制。比如实时语音包(手机打电话的数据)就要求特别对待优先处理;再比如你发送1G的数据,不可能一次一个包发送完,要根据规则分割成一小块一小块的数据进行多次发送。再比如你发送的是银行密码和存款金额,就要求稳定传输和保密传输,这些控制的规则信息、加密的规则信息、都在封包的包头里有对应的标识。此处ping命令对应的操作实际是ICMP协议调用同层(调用也不全是上层调用下层)的IP协议向目的地址发包,IP协议会通过协议号1来标注是ICMP协议让我发包的,到目的地后以这个协议号为依据把包交给ICMP协议。IP协议封装源IP和目的IP,也就是ping命令中源和目的IP地址,然后把包交给下层即数据链路层,数据链路层会用协议号0x0800标注是IP协议让我发的这个包,以便传到目的地址时交给对方的IP协议。因为此过程一直没用到四层的端口号,所以ICMP属于三层协议。数据链路层会检查包的头部封装的目的IP,然后到pc1的mac地址表中找目的IP对应的二层mac地址。因为二层设备在发送过程中是不认识IP地址的(因为IP属于三层的编址,二层设备不识别),只认MAC地址,mac地址是烧录在网卡中的全球唯一,每个交换机接口也有一个全球唯一的mac地址。数据链路层在pc1的mac地址表中找目的IP对应的mac发现找不到,封装失败。
步骤3.没有目的Mac---封包失败,开始找目的IP的Mac地址--------------------------------------即ARP找目的Mac
解释:ARP(address resolution protocol)---地址解析协议-----就是通过IP地址找Mac地址的过程。PC1的TCP/IP协议簇的数据链路层调用ARP协议完成地址解析。ARP协议发送一个目的IP为192.168.1.2,源地址为192.168.1.1,目的Mac为全0,源Mac地址为pc1mac的ARP请求包。目的Mac为全0的二层广播就像IP地址主机位全为F的广播一样,交换机收到此广播后,会向网络内所有接口发送-也叫泛洪。在此过程,交换机1学到了如下信息(交换机1接口1-------IP:192.168.1.1---mac:pc1mac)。PC2的Mac地址表学到如下信息(IP:192.168.1.1-----mac:pc1mac)。备注,此过程路由器1接口1也会收到泛洪包,检查目的地址不是自己随即丢弃包,并不做任何回应。----这也体现了广播或者泛洪的坏处,白干活,没效果(拆包--检查---丢弃)。
同一网络内主机收到此arp请求数据包(此时叫frame---二层数据包标准称呼),会拆包检查三层的IP地址,不一致的丢弃,一致的回ARP-reply包。arp-reply包内容自动填自己的mac地址为源mac。此处为PC2发送,包的头部如下:sourcemac:pc2mac--destinationmac:pc1mac--sourceIP:192.168.1.2--destinationIP:192.168.1.1。pc1会收到此包,拆包,填pc2的mac地址和IP在mac地址表中。在此过程,交换机1学到了如下信息(交换机1接口2-------IP:192.168.1.2---mac:pc2mac)。PC1的Mac地址表学到如下信息(IP:192.168.1.2-----mac:pc2mac)。
步骤4.重新封包发送
解释:pc1封包如下:smac:pc1mac--dmac:pc2mac--sip:192.168.1.1--dip:192.168.1.2,从网卡发包给交换机1接口1,交换机在ARP过程学到红字标注的信息,建立了自己的mac地址转发表。查看收到pc1的包头目的Mac地址为PC2Mac直接从接口2转发出去。PC2收到包后核对目的mac和自己一致,开始解包,根据包头标注上层协议号0x0800把包头丢掉,数据传给IP协议,IP协议检查IP地址一致后根据上层协议号1把包头丢掉,数据传给ICMP,ICMP根据数据中的type=0code=0得知是echo-request即要回应的请求报文,就会立即发送一个返回的ICMP报文的echo-reply即回应应答报文。
简述:1.pc1-ping -pc2-------2.pc1准备封包发送--------3.发现没pc2的Mac-------4.ARP请求PC2的Mac(发请求时交换机1学到接口1连接pc1,回请求时交换机1学到接口2连接pc2)------5.重新封包--------6.pc1发包给交换机1接口1-----7.交换机1根据转发表从接口2发出------8.pc2收到包,并按要求回包-------9.pc2发包给pc1-----10.pc1收到回包,一次完整内网ping包过程完成。
外网ping过程:(此例为:pc1--ping--pc3----------192.168.1.1--ping --172.16.1.1)
1.ping开始
2.ICMP协议检查目标IP不在同一网段,直接发包给网关
3.封包时,有网关Mac直接封包,如果没有网关Mac
4.arp网关IP,请求网关mac,此例为arp 192.168.1.254
5.完成封包,发包给网关(目的Mac:路由器1接口1Mac--源Mac:pc1网卡mac--目的IP:172.16.1.1--源IP:192.168.1.1)
6.路由器1接口1收到包后,检查包头目的Mac和自己接口1Mac一致拆包,不一致丢弃。
7.检查Mac一致后,拆开二层包头后丢弃包头,转交给包头中标注的上层协议IP协议处理,IP协议检查三层包头,根据目的IP找路由表对应下一跳接口,此处路由表中有172.16.1.0网络条目(每个途径的路由器的路由条目都应该有目的IP的路由,否则会因为路由不可达而ping不通,路由条目一般由路由协议动态获得,如网络简单也可手工静态建立,现实网络中在路由协议建立邻居的时候其实已经获得邻居的mac地址,完成了地址表的建立,ping包会自动在网络中畅通传输,不需要每一步都arp,只有在首尾两端客户机上才偶尔会用到arp)
8.如果路由表中没有目的IP对应的出口,则丢弃包,并返回给源IP一个relay报文,告知对方报文不可达。
9.路由器1找到下一跳后重新封包,(目的Mac:路由器2接口1Mac--源Mac:路由器1接口2Mac-目的IP:172.16.1.1--源IP:192.168.1.1)
10.如果mac地址表(路由器也有此表)中没有下一跳接口地址对应的mac,ARP查询获取后封包。
11.路由器2从接口1收到包后,核对目的Mac和接口1的mac一致,拆包,丢包头,根据包头协议号,把包转给上层协议IP协议处理。
12.IP协议检查目的IP,找路由表对应条目(此条目包含下一跳IP或根据出接口能递归查询到下一跳IP地址)发送出去,发送前封包(目的Mac:路由器3接口1Mac--源Mac:路由器2接口2Mac-目的IP:172.16.1.1--源IP:192.168.1.1)
13.路由器3接口1收到包,查包目的Mac和接受接口1mac,不一致,拆包,一致,拆包,丢掉二层包头,交给上层协议IP处理,IP根据目的IP,找到出口,arp获得或查表得下一跳Mac,封装,发给下一跳。(目的Mac:pc2网卡Mac--源Mac:路由器3接口2Mac-目的IP:172.16.1.1--源IP:192.168.1.1)
14.pc2网卡收到包后,查mac一致,拆包,丢包头,转给上层协议(IP协议)处理,IP检查目的IP和自己IP一致,拆包,丢包头,根据包头指定协议号把包转给上层协议ICMP,ICMP根据协议规则查看type=0code=0是个echo-relay报文,立即给源地址发送echo-relay报文。
15.pc1接受到echo-relay报文得知网路畅通。ping一次完整过程完成。
总结:ping包在传递过程中,是一跳一跳转发的,每经过一个交换机,不停留不拆包直接按目的mac转发,每进过一个路由器拆封包一次。更换二层包头,去掉上一网段Mac地址,换成下一网段Mac地址。在ping包的整个传输过程中,源IP和目的IP始终不变。
————————————————
版权声明:本文为CSDN博主「Wheeler.Liu」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wyunller/article/details/89464611
- 开发板要解析百度的域名,获取到百度主机的IP地址,涉及到DNS协议,传输层用的是UDP协议
- DNS主机利用UDP协议,回复百度的IP给开发板(涉及ARP协议)
- 开发板要发送Ping请求包给百度主机,但发现百度主机IP与自己不在同一个网段,因此要发送Ping请求包给默认路由
- 要发送给默认路由的时候,忽然发现并没有默认路由的MAC地址,因此发送一个ARP广播包,经过交换机转发给了默认路由,然后路由单播自己的MAC地址给开发板
- 这样开发板可以把Ping包发送给默认路由了
- 默认路由经过路由协议,经过一个个路由的转发,最后发送到了百度的主机上,百度主机检测到IP是自己的IP,接收并处理Ping请求,接着百度主机发送一个Ping回应报文给开发板
谈到这个问题,我们首先想到的就应该是分情况考虑:
一、同一网段内的ping操作
假设主机A的IP为:1.1.1.1
主机B的IP为:1.1.1.3
主机A去ping同一网段的主机B,它会封装二层报文,首先去查本地MAC地址表,发现没有B的地址,此时就会发送ARP报文。
目的MAC:源MAC:OP:发送端MAC:发送端IP:目的端MAC:目的端IP
FFFFF:A的MAC:1:A的MAC:1.1.1.1:0000000:1.1.1.3
通过观察报文发现:外面封装了目的MAC地址为FFFFF,源地址为A的MAC的头部,里面的部分意思是:我的MAC和IP都在了,你的IP也有了,返回给我你的MAC地址。
交换机收到A的ARP请求后,就会将查找自己的MAC地址表,如果有,则直接返回给A;如果没有则从所有端口将该报文广播出去;B接收到报文后,给A返回如下格式的报文:
目的MAC:源MAC:OP:发送端MAC:发送端IP:目的端MAC:目的端IP
A的MAC:B的MAC:1:B的MAC:1.1.1.3:A的MAC:1.1.1.1
这样A就学到了B的MAC地址;
下面就可以愉快的进行ICMP报文通信了。
A封装ICMP报文,发送给B,格式如下:
目的地址:源地址:目的IP:源IP:ICMP报文
B的MAC:A的MAC:1.1.1.3:1.1.1.1:request
将学到的MAC地址封装到报文头部,利用MAC地址进行通信;
B收到后,回复报文格式如下:
目的地址:源地址:目的IP:源IP:ICMP报文
A的MAC:B的MAC:1.1.1.1:1.1.1.3:Echoc answer
整个过程就是:先利用ARP学习到B的地址,然后再利用MAC地址发送ICMP报文。
二、不同网段的ping
此时网络中还有一个主机C,IP地址为:2.2.2.2(够2的!)
ApingC的过程如下:
首先A想发报文给C,查找MAC地址表发现,没有C的MAC地址,同时发现C与自己不在一个网段,于是它先发送一个ARP请求,学习到网关的MAC地址;这里可以把网关理解为同一网段的B;
然后再把ICMP报文封装好,发送给网关;
目的地址:源地址:源IP:目的IP:ICMP报文
网关的MAC:A的MAC:1.1.1.1:2.2.2.2:request
报文到达网关之后,路由器根据目的地址查找路由表,找到转发出口。
去掉原来的MAC头部。换成如下的头部:
目的地址:源地址:
C的MAC:另一侧网关的MAC 其他的不变
如果路由器也没有C的MAC地址,则从转发端口先发送ARP报文,学习C的MAC地址。
C收到ICMP报文后,应答如下:
目的地址:源地址:目的IP:源IP:ICMP
网关的MAC:C的MAC:1.1.1.1:2.2.2.2:echo answer
总结
跨网段ping时,可以理解为:两个同网段的过程,通过路由器连接起来了。
最终A学到的也只是网关的MAC地址,这就够了,报文能够顺利转发出去了。
-----------------------------------
©著作权归作者所有:来自51CTO博客作者yangshanyang的原创作品,请联系作者获取转载授权,否则将追究法律责任
ping的过程详解
https://blog.51cto.com/u_3303362/3797958