这篇文章主要是对数据包在同网段和不同网段的转发流程梳理,使用 ping 命令进行实际抓包测试。
网关的概念:
对于像 PC 等终端设备来说,通过交换机可以实现同网段的通信。但如果想要给其他网段发生数据,就不行了,因为本身没有路由的功能,不知道该发给谁。这时就提出了一个网关的概念,为这些终端设备配置上,当想要实现跨网段的通信时,就把数据发送到配置的网关地址上。一般来说,默认配置的网关地址都是路由的接口地址。
ARP什么是 ARP?
ARP - Address Resolution Protocol. 在封装数据帧-链路层的数据包时,由于上层已经有了目的 IP 地址。而在链路层需要封装 SMAC 和 DMAC,但目的 MAC 如何获取呢?就是通过 ARP 协议,完成 IP 地址到物理地址的映射。但需要注意的是,ARP 不能穿越路由器,也就是跨网段传输。
ARP 原理假设这里出现的设备均是第一次启动。把路由器的路由功能关闭,这里的 R1 代表的就是 PC 了,否则是 Ping 不通.
这里 R1 想要给 PC 发送 IP 数据包,只有按照要求封装成 2 层数据帧的格式才可以,步骤如下:
发现目前有源 MAC 地址,却没有目的 MAC 地址,那么封包不成功,暂时将包缓存。
接着发送 ARP 广播(将 ARP 广播添加帧头部发送),交换机转发该广播到该网络的每一个主机,
每个主机收到后开始解封装,进而查看到 ARP 报文中的目的 IP,如果该 IP 和自己的 IP 一致,那么做出 ARP 响应报文(单播),否则丢弃。
R1 收到 PC 的响应报文后,开始解封装,并查看 ARP 报文中的目的 IP,添加到缺少的目的 MAC,最后再发送到数据到 PC。
ARP 分类标准 ARP:用于获取 MAC 的 ARP 协议。
代理 ARP:正常来说,如果某个接口收到的网络层 IP 不是自己的话,就会把包丢掉。但如果在路由器的上接口配置了代理 ARP,路由器在收到数据包后,会先查看自己的路由表,看能不能到达,能到达的话。就将自己接口的 MAC 地址回复给请求方。注意真的 MAC 可能是另一网段的设备。其实这里就是一种欺骗行为,欺骗发送者自己的 IP 和 MAC.
无故(免费) ARP:用于检测 IP 地址是否冲突,已经被其他接口使用。目的和源 IP 都是自己.(在接口第一次启动时发送。)
同网段的数据通信这里出现的设备均是第一次启动,把路由器的路由功能关闭,这里的 R1 代表的就是 PC 了,否则是 Ping 不通的
这里 R1 想要给 PC 发送 IP 数据包,只有按照要求封装成 2 层数据帧的格式才可以。这时发现目前有源 MAC 地址,却没有目的 MAC 地址,那么封包不成功,暂时将包搁置。接着发送 ARP 广播(将 ARP 广播添加帧头部发送,帧结构如下图)
交换机收到该数据包后发现目的 MAC 为 ffff:ffff:ffff, 根据交换机的转发规则,先将 R1 的源 MAC 和自己端口号(e0/0)存入 MAC 表,然后进行泛洪操作,广播到该网络的每一个主机。
每个主机收到后开始解封装,进而查看到 ARP 报文中的目的 IP,PC 发现目的 IP 和自己的 IP 一致,接着发送 ARP 响应报文(如下图)
交换机收到 PC 的 ARP 应答报文后,由于目的 MAC 地址在本身的 MAC 表里已经存在,进而直接转发给 R1。
R1 收到 PC 的响应报文后,开始解封装,并查看 ARP 报文中的目的 MAC,添加到搁置的缺少目的 MAC 的数据包,接着将封装好的数据帧发送到 PC (ping 命令 在传输层是 ICMP 协议)
这里注意一下,两台 PC 机要配置网关,否则 ARP 包内的内容可能不一样
不管终端的目的是哪里,首先都要将数据包发送到网关
PC1 要给 PC2 发送 ICMP 包,首先要发送到网关,我们先模拟下封包过程: