程序员社区

ARP协议

ARP,Address Resolution Protocol,地址解析协议,解析IP地址得到MAC地址,基于数据链路层之上的协议,可以看成和网络层同一层级,通常称为2.5层协议,ARP是网络层与数据链路层的重要枢纽,它解决了网络层(软件)到数据链路层(硬件)的映射

ARP请求报文

ARP协议插图

数据通信的基础是在以网卡为硬件的数据链路层发送和接收的,如果想实现两台主机通信,必须知道目标主机的硬件地址,即MAC地址

主机A想要发送数据给主机B,我们知道发送网络报文是一个封装的过程,数据需要在应用层、传输层、网络层、数据链路层封装

网络层的目的IP是主机B的IP地址192.168.0.200,这个是已知的,数据链路层的目的MAC是主机B的MAC地址,这个主机A不知道,所以它首先会去自己的ARP缓存表内查找(切记是根据IP找MAC

  • 如果之前A和B通信过,A存入过B的IP-MAC的映射关系,且这条目录还未老化删除,此时应该可以查找到,那么把B的MAC地址填充到链路层头部完成封装,发出去即可

  • 可是如果之前A和B并未通信过,A没有存入过B的IP-MAC,或者虽然存入过,但此时已经过了这条条目的老化时间,已经从ARP缓存表内删除了,那么A就无法从ARP缓存表内根据主机B的IP地址查到B的MAC地址,也就无法完成封装报文

怎么办?

此时A会启动ARP协议层程序,让其自动发一条ARP请求报文,以广播的形式发给网段内的其他所有主机。其他主机收到此条ARP请求报文后,会判断是否发给自己,如果不是,则不回复,如果是,则回复一条ARP响应报文给主机A,A收到即知道B的MAC地址

具体过程:

主机A首先在自己的ARP缓存表内查找是否有IP=192.168.0.200这个表项

  • 如果有

把这个表项里MAC地址填入报文以太网帧头部的目标MAC地址内,然后通过网卡发出去

  • 如果没有

则系统的ARP协议层程序会先发一个ARP广播请求报文出去,请求目标MAC地址

为什么这个ARP请求报文是广播报文?因为不知道对方的MAC地址,又想让对方主机收到这个ARP请求报文,那么就发一个广播报文,让交换机把ARP请求报文发给这个局域网内除了发送方以外所有的主机,那么肯定可以到达目标主机

那么ARP广播请求报文如何构造,各个字段的定义是什么?

ARP协议插图1

  • destination MAC=FF:FF:FF:FF:FF:FF

目标MAC地址字段,FF:FF:FF:FF:FF:FF表明这是一个广播MAC地址,可以让交换机以广播的形式发出去

  • source MAC=02:00:00:00:00:1A

源MAC地址字段,它是源主机的MAC地址

  • OP=1

表明它是一条ARP请求报文

  • target IP=192.168.0.200

目标主机的IP地址,它是为了到达主机后,目标主机ARP协议层程序判断是否发给自己的依据,它是必须要有的,因为目标MAC地址是广播地址,意味着所有主机在数据链路层都能接收,只有通过和它比较,让不是目标主机的其他主机不回复,让目标主机回复

  • sender IP=192.168.0.100
  • sender MAC=02:00:00:00:00:1A

源主机的IP地址和MAC地址,这是让目标主机存入自己IP-MAC映射所使用的字段,也可以利用它们伪造ARP报文

  • target MAC=00:00:00:00:00:00

目标主机的MAC地址,ARP请求报文就是为了请求目标主机MAC地址,所以它是全0的

通过上面的ARP广播请求报文各字段的定义,得知:

  • ARP请求报文在送达交换机时,交换机根据目标MAC地址是广播地址,在除了发送方端口外的其他所有端口,都复制一份ARP请求报文,发出去给所有主机
  • 接收到ARP请求报文的主机首先在数据链路层比较destination MAC,由于是广播MAC地址,可以接收,然后比较target IP
  • 目标主机比较target IP发现一致后,首先会把ARP请求报文的sender IP和sender MAC存入自己的ARP缓存表(windows系统是这样,其他系统有可能先存入)
  • 然后目标主机的ARP协议程序会给源主机自动回一个ARP响应报文

ARP响应报文

ARP协议插图2

发送方式:

  • 被动响应
  • 主动发送

被动响应

目标主机ARP协议层子程序收到ARP请求后,首先把ARP请求报文的sendeMAC和senderIP存入自己的ARP缓存表内,然后以单播的形式给源主机回ARP响应报文

为什么是单播?

因为已经知道源主机的MAC地址了

ARP响应报文的各字段

ARP协议插图3

  • destination MAC=02:00:00:00:00:1A

目标MAC地址字段,02:00:00:00:00:1A是主机A的MAC地址,说明这是以单播的形式发送出去的

  • source MAC=02:00:00:00:00:1B

源MAC地址字段,它是源主机的MAC地址

  • OP=2

表明它是一条ARP响应报文

  • target IP=192.168.0.100

目标主机的IP地址,主机A收到ARP响应后并不会比较它

  • sender IP=192.168.0.200
  • sender MAC=02:00:00:00:00:1B

源主机的IP地址和MAC地址,目标主机收到后,把它们存入自己的ARP缓存表

  • target MAC=02:00:00:00:00:1A

目标主机的MAC地址

当源主机收到ARP响应报文后,会把senderIP和senderMAC存入自己的ARP缓存表中作为动态条目,不管targetIP是否是自己

总结

  • ARP协议是针对IPv4的寻址协议,IPv6有自己的寻址协议

  • ARP请求报文和ARP响应报文都是不能跨网段的

  • ARP请求报文以广播形式发送,ARP响应报文以单播形式发送

  • ARP请求报文和响应报文的接收方都会把senderIP和senderMAC存入自己的缓存表内,也就是说,请求报文和响应报文都可以让自己主机的ip和mac被对方记录,不同的是,请求报文还会让对方自动给我回一个ARP响应报文,而响应报文只会让对方存入自己的ip和mac,而不会有回复(不是完全准确,免费ARP响应是会有回复的,后续会讲到)

  • 只有ARP请求报文和ARP响应报文具有缓存ip和mac的功能,其他协议的message虽然也带有源mac和ip,但是并不能让目标主机把源ip和mac存入ARP缓存表内(当然ARP请求和响应报文存入ip和mac还需要判断其他条件,后续会讲到)


赞(0) 打赏
未经允许不得转载:IDEA激活码 » ARP协议

相关推荐

  • 暂无文章

一个分享Java & Python知识的社区