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始终不变。