pc1的ip地址为1.1.1.1,pc2的ip地址为1.1.1.2,两者通过交换机sw1连接。
在pc1上ping pc2,即pc1向 pc2发起icmp请求。此时pc1上生成一个icmp请求报文,来判断pc2的存在性(根据数据包封装原理,要生成icmp请求需要有目的IP地址和目的MAC地址,此处即pc2的地址,其中pc2的ip地址是pc1上发起ping时我们写入的。因此需要找到pc2的MAC地址即可。
即:pc1若要将这个ICMP协议封装的请求发送给目标主机pc2就必须要使用IP协议来“运输”该请求。这样,IP协议这个时候就充当了一个邮差的角色,将ICMP这个数据包写上发送者(pc1)的IP地址和接收者(pc2)的IP地址,然后就可以根据这个目标地址(pc2的地址)来“投递”这个数据包了)。
在pc1封装的时候pc1会查看自己的arp表中是否有pc2的MAC地址,由于是一个新连接的网络,pc1发现自己没有pc2的MAC地址,但是icmp请求报文又必须需要。
1)pc1会生成一个arp请求包,请求pc2的MAC地址(pc1触发ARP协议来请求pc2的MAC地址,补全自己的arp表项)。arp请求包的目的MAC(Dst MAC)为全f,全f的MAC地址是广播MAC,能在自己的广播域中达到任何一个网口上,arp请求包广播出去后到达交换机sw1。
2)sw1收到arp请求包:
先把pc1的mac地址,添加到自己的mac表中,以方便转发需要(交换转发属于链路传输层转发,主要依靠mac表,让到达不同mac地址的数据包在对应的接口上转达出去)。
然后发现此arp请求中目的mac为广播mac,sw1将报文从除feth10口之外的其余接口广播出去到达pc2 。
3)pc2收到arp请求包,对此数据包进行解析(查看arp数据部分)
先把pc1的mac,加入自己的arp表中。
查看arp请求包的请求数据部分。
若被请求mac(Target MAC address)对应的ip地址(Target IP address)是自己的,则pc2生成对应的arp应答包以单播方式回应pc1的arp请求;
若PC2查看到收到的请求地址不是自己,PC2只更新自己的arp表不进行回应。
4)pc2发出的arp应答包到达sw1,将此arp应答包从feth10发送出去。
首先sw1更新自身mac表,添加pc2的mac地址。
然后sw1需要转发此arp应答包。此包为单播包,sw1需要查自身的mac表找到对应的接口转发。由于在arp请求包经过sw1时已经添加了pc1的mac地址,在mac表项中能够找到对应的转发接口:feth10。
5)pc1收到目的mac地址为自身的此arp应答包,进行解封装。
首先pc1记录pc2的mac地址添加到自身的arp表中。
没有完成的icmp请求包就可以在自身的arp表中找到pc2的mac地址从而继续封装icmp请求报文。
6)sw1收到pc1发来的icmp请求包,从feth11发送出去给pc2。
sw1先查找自己的arp表
发现目的mac在自己的arp表中对应的接口为feth11
将icmp请求包发出去。
7)pc2收到icmp请求包,回应pc1的询问。
pc2查看icmp请求包
发现目的mac为自己,将包解封装,发现目的ip是自己的。
继续解封装,发现这是一个icmp请求包,查看自己是否存在。
pc2作为一个正常电脑,生成对应的icmp应答包回应pc1。
8)sw1查找自己的arp表,将icmp请求包从feth10发送出去到达pc1。
9)pc1收到icmp应答包
查看icmp应答包,发现目的mac为自己的地址,将包解封装,发现目的ip也是自己。
继续解封装,查看数据部分正是pc2对自己的icmp请求包发出的icmp应答包。
10)pc1获取应答数据产生屏幕显示,告诉我们探测结果。
此时PC1 ping PC2就完成了。
pc1的ip地址为1.1.1.1 默认网关为1.1.1.254
pc2的ip地址为1.1.2.2 默认网关为1.1.2.254 网关地址均位于路由器r1上。
1)pc1向pc2发出ping,即pc1向 pc2发起icmp请求(此时需要pc1上封装成一个icmp请求报文,判断pc2的存在性)。
2)pc1会生成一个arp请求包,请求pc2的MAC地址(新组的网络pc1上没有pc2的mac地址,因此需要发出arp请求)。
对于pc1发出的arp请求包来说,Dst MAC为全f,全f的MAC地址是广播MAC,能在自己的广播域中达到任何一个网口上。此时的组网是路由环境,pc1和pc2的掩码运算后发现不是同一网段的地址,全f的Dst MAC到达r1上,r1是不支持转发扩散。
需要pc1(发起端)对于探测不同网段ip地址时做出一定的判断,pc1的icmp请求报文的目的mac只要封装成网关的就足够(体现出路由转发环境端机要设置网关的必要性)。
3)pc1添加了路由器r1上feth10接口的mac(通过arp协议),封装完成了icmp请求包。
icmp请求包的源地址自身的mac和ip,目的地址是网关的mac和pc2的ip。
4)r1收到pc1发来的icmp请求包,然后发一个ARP请求包。
r1查看icmp请求包,发现目的mac为自己的mac地址
将包解封装,发现探测的目的ip是pc2。
r1通过自己的直连路由转发出去(r1上配置有pc2同网段的ip地址)
但r1并不知道pc2的mac,r1首先要发一个ARP请求包,询问pc2的mac地址。
5)pc2收到r1的arp请求包,pc2发出arp应答包到达r1。
首先添加r1的mac到自己的arp表中。
然后查看此arp请求包(发现是要请求自己的mac地址)
于是pc2封装对应的arp应答包给r1(基于arp协议规则)。
6)r1收到arp应答包,对pc1发出的icmp询问包进行路由转发封装。
首先添加pc2的mac到自己的arp表中。
然后根据生成的对应arp表项,继续对pc1发出的icmp询问包进行路由转发封装。需要通过pc2的直连路由从feth11发出到pc2(根据路由器r1的路由表可知)
此时该icmp询问包的源地址是pc1的mac和ip,目的ip是pc2的ip不会变,目的mac变成了pc2的mac。
7)pc2收到icmp请求包,解封装查看自己是否存活,向pc1发送icmp应答包
查看icmp请求包,发现目的mac为自己
将包解封装,发现目的ip也是自己
继续解封装,发现这是一个icmp请求包,查看自己是否存活。
pc2向pc1发送icmp应答包(目的ip为pc1的ip,目的mac为网关mac,源ip为自己的ip,源mac是自己的mac)。
8)r1收到icmp应答包(pc2发来的),封装好通过直连路由转发给pc1。
此时arp缓存表中已经有了pc2的mac。
然后查看icmp请求包,发现目的mac为自己的mac地址
将包解封装,发现目的ip为pc1的ip地址,通过自己的直连路由转发出去。
r1将icmp应答包封装好以后再转发给pc1。
9)pc1收到icmp应答包
发现目的mac为自己的mac地址
开始将包解封装,发现目的ip是自己的ip
继续解封装,发现pc2对自己发出的icmp请求包对应的icmp应答包。10)pc1产生屏显告知pc2的探测结果。
10)此时PC1 ping PC2就完成了。