《如果源主机没有配置网关,ping不在同一网段的另一台主机,源主机会发送ARP报文吗?》

宇星海 / 2024-10-21 / 原文

一、在开始实验前,我们得先深刻理解和剖析ARP协议

1.1 ARP的定义

  1. ARP是“Address Resolution Protocol”(地址解析协议)的缩写。

1.2 ARP的作用及运行流程分析

  1. 泛谈:在同一子网中,数据包的传输都是依据MAC地址进行的(分组交换设备仅设置交换机),在跨子网通信时,需要先使用路由器(即所谓的“网关”)依据目的主机IP地址将数据包传输到目的主机IP地址所属的子网,在目的IP所属子网内部,再利用MAC地址进行数据包传输。MAC地址不具有层级结构,随着互联网中设备的指数级增加,为了使传输数据更加高效,人们因此发明了IP地址这种具有层级性的逻辑地址用于数据的传输。
  2. 同一子网内(假设该子网没有网关),考虑源主机向另一台在同一子网中(通过IP地址和子网掩码的“与”运算得知)的主机发送ping报文。
    1. 源主机将数据向下传递到网络层进行封装时,通过本机IP地址、目的主机IP地址和子网掩码的“与”运算得知目的主机IP地址与本机IP地址处于同一子网。
    2. 源主机继续将数据包向下传递至链路层,由于源主机与目的主机处于同一子网,ARP进程在ARP缓存表中查询该目的主机IP地址对应的MAC地址
    3. 如果在ARP缓存中查到目的主机IP地址对应的目的主机MAC地址,则将该目的主机MAC地址写入链路层帧头中,封装好后发送到网络,经由交换机根据目的主机MAC地址及交换机内部MAC地址与端口缓存表,将数据包发送到对应端口,最终使数据包到达目的主机。
    4. 如果在ARP缓存中没有查到目的主机IP地址对应的目的主机MAC地址,为了完成数据发送任务,源主机将待发送数据先行放入缓存,由ARP进程调用ARP协议,将目的主机IP地址、目的主机MAC地址(此时未知,设置为广播MAC地址)封装到ARP报文中并发送到网络。
    5. 交换机在接收到数据包后,发现目的主机MAC地址为广播地址,因此向除源主机所在端口的其余端口广播该ARP报文。
    6. 目的主机接收到此ARP请求后,首先判断源主机IP地址是否与自身IP地址处于同一子网下,如果处于同一子网则向源主机返回其MAC地址,方式近似与源主机发送ARP报文相同。源主机得到目的主机MAC地址后,顺利封装缓存中的待发送报文,并经由交换机顺利发送到目的主机。
    7. 如果不在同一子网且因为假设该子网不设置网关(路由器),则目的主机丢弃接收到的ARP报文。造成不在同一子网的原因如配置子网掩码错误等。
  3. 不在同一子网下,考虑源主机向另一台不在同一子网中(通过IP地址和子网掩码的“与”运算得知)的主机发送ping报文。
    1. 源主机将数据向下传递到网络层进行封装时,通过本机IP地址、目的主机IP地址和子网掩码的“与”运算得知目的主机IP地址与本机IP地址不处于同一子网。
    2. 因此源主机的任务变成只需将ping数据包封装发送给网关,由网关负责跨子网传输(网关是路由器,具有IP地址)。
    3. 源主机将目的主机IP地址(即另一个子网的主机)封装到IP头中,将ping数据包向下传递至链路层。
    4. ARP进程在ARP缓存表中查询网关IP地址(已设置存储在源主机内)对应的MAC地址,如果查到网关IP地址对应的MAC地址,则将该MAC地址作为目的主机MAC地址写入链路层帧头中,封装好后发送到网络,经由交换机根据目的主机MAC地址及交换机内部MAC地址与端口缓存表,将ping数据包发送到交换机对应端口,使ping数据包到达网关(交换机对IP层来说是透明的,即交换机只有两层协议层)。
    5. 如果没查到网关的MAC地址,又由于网关与源主机处于同一子网下,故可通过上文ARP方式查询到网关的MAC地址,再将网关MAC地址放入链路帧头进行数据封装并将ping数据包发送到源主机所在子网网关即可。
    6. 源主机所在子网网关接收到ping报文后,根据网关内部路由表等信息定位到目的主机IP地址所在子网,将目的主机IP地址写入IP报文头,将网关自身的MAC地址封装到链路层帧头一并打包发送到目的主机所在子网。
    7. 目的主机所在子网的网关接收到源主机所在子网的网关发来的ping数据包,利用网关内部ARP缓存,得到目的主机IP地址对应的目的主机MAC地址,将其写进链路层帧头后封装ping数据包并发送到子网内部交换机中。
    8. 经过目的主机所在子网内的交换机依据ping报文内MAC地址及交换机内的MAC地址端口缓存信息转发ping数据包,目的主机得以接收到ping报文。
    9. 目的主机查看ping报文后开始准备回复,此时目的主机身份转变成源主机,按照上文分析过一模一样的方式回传ping相关报文。
  4. 综上所述,ARP的作用正如其名:将目的主机IP地址解析为对应的MAC地址(注意:产生ARP报文的前提是必须要有目的主机IP地址)。现假设源主机ARP缓存中已有目的主机和网关的MAC地址(注意:只会有同一子网的主机MAC地址,不可能有不同子网目的主机的MAC地址,不同子网目的主机的MAC地址在经过该子网网关时都被该子网网关的MAC地址取代了):
    1. 源主机将目的主机IP地址封装到IP头中,将数据包向下传递至链路层。
      1. 当源主机通过子网掩码的“与”运算得知目的主机和自身处在同一子网时,本机ARP进程利用目的主机IP地址与ARP缓存查询得到目的主机MAC地址,封装并向目的主机发送ping数据包。
      2. 当源主机通过子网掩码的“与”运算得知目的主机和自身不处在同一子网时,本机ARP进程利用子网网关IP地址与ARP缓存查询得到该子网网关MAC地址,封装并向网关发送ping数据包。
    2. 如果源主机ARP进程在ARP缓存中未查到MAC地址时,依据IP地址(同一子网目的主机的或同一子网网关的)在子网中发送链路层广播报文获取MAC地址,更新ARP缓存,将MAC地址封装进数据包并向网络中发送。

二、开始实验

2.1 构建网络拓扑及配置各子网主机IP、子网掩码、网关IP、配置路由器端口IP及子网掩码

如图所示:
alt text

2.2 由主机PC0向主机PC1发送ping报文,Packet Tracker开启模拟模式,捕获网络中报文

  1. Packet Tracker开启模拟模式
    alt text
  2. 由主机PC0向主机PC1发送ping报文:
    alt text
  3. 开始自动捕获:
    alt text
  4. 等到模拟面板出现STP类型报文后停止自动捕获。
    alt text
  5. 大家捕获好以后就从头开始,单击每个包的信息字段,弹出左侧页面后可点击各协议层查看每层中的具体设备操作,尝试自己从头分析每个包,这样学习的收获一定会非常之大!
    alt text

三、回答题目问题

  1. ping不在同一网段的目的主机时,源主机需要将ping报文发送给网关,因此ARP进程将依据网关IP地址在ARP缓存中查找网关MAC地址。
  2. 如果源主机没有配置网关即源主机中没有存储网关IP地址,则ARP进程将无法在ARP缓存中查找网关MAC地址,因此ARP进程会报错:主机未配置网关,同时主机将丢弃ping数据包。
  3. 因此,主机既不会产生ARP报文,也不会发送ping报文。