ARP: 地址解析协议

1.ARP概念和作用(理解)

ARP:Address Resolution Protocol,地址解析协议,这个协议提供了网络层地址(比如:IP,ARP通常也能用于IPv4以外的地址,虽然这很少见,如果不做特殊说明,默认是IP地址,这在讨论ARP的帧格式时,也会说明)到硬件地址(MAC地址,也叫链路层地址、物理地址等等)的动态映射,因为一个IP数据报(第三层)到达链路层(第二层),链路层要将其封装成帧,这就需要源mac地址和目的mac地址,源mac地址,就是发送主机网卡的MAC地址,但是目的mac地址,它可能是不知道的(ARP缓存表里没有)。

2.MAC地址(了解)

MAC(Media Access Control,介质访问控制)地址,也称为以太网地址、链路层地址、硬件地址、局域网地址或物理地址,用来标识网络中唯一的网卡。MAC地址现在一般都集成在通信设备的网卡上,网卡的物理地址通常是由网卡生产厂家写入网卡的EPROM芯片中,芯片中的数据可以通过程序进行擦写,它存储的是传输数据时真正赖以标识发出数据的电脑和接收数据的主机的地址。也就是说,在网络底层的物理传输过程中,数据传输是通过物理地址来识别主机的,它一定是全球唯一的。

MAC地址长度为6字节,所以一共有2^48个可能的MAC地址,MAC地址一般都是以16进制表示,比如:1a:2c:7f?06:9b,MAC地址的前24比特位由IEEE固定,后24位由各个厂商自己生成,组合成一个唯一的地址。

3.封装ARP分组的帧格式(核心)

arp分组帧格式
上图就是封装在以太网中将IPv4地址转换为MAC地址的ARP请求和应答分组报文的链路层帧

注意:ARP通常也能用于IPv4以外的地址,虽然这是很少见的。在TCP/IP协议簇里,ARP的作用通常就是将网络层的IP地址转换为链路层MAC地址。

上图前14个字节是链路层帧的帧头,剩下的28字节就是ARP协议来定义的,ARP分组的前8个字节是通用的,最后20个字节实际上是可变的,在TCP/IP中,后面的20字节就是上图所示。

接下来就依次说明该帧的各个字段的语义(没有什么比学习分组的比特语义更好玩的了,哈哈)
我们假设发送主机IP地址为: 192.168.0.10,发送主机的MAC地址为:AA:AA:AA:AA:AA:AA;目的主机IP地址为:192.168.0.20,接下来要获取192.168.0.20主机的MAC地址(BB:BB:BB:BB:BB:BB)

  1. 目的MAC地址(6字节): 对于ARP请求来说,目的以太网地址就是FF:FF:FF:FF:FF:FF(全是1)是广播地址,因为发送主机不知道目的IP对应的MAC地址,所以它要广播,在同一个局域网中的所有设备网卡都会收到该帧。所有接收到该帧的主机,根据帧类型字段(=0x0806),会把该帧的载荷数据,即ARP分组,交给操作系统的ARP模块来处理,该ARP模块拿到数据,会根据目的IP地址决定是丢弃该ARP分组,还是进行ARP应答。换句话说,发送主机向局域网中大声喊了一句话,我是192.168.0.10,我的MAC地址是AA:AA:AA:AA:AA:AA,谁是192.168.0.20,你的MAC地址是多少,收到请回答,收到请回答,over,over,有一点很重要,当192.168.0.20的主机,进行ARP应答时,该字段就是AA:AA:AA:AA:AA:AA,因为发送主机将自己的MAC地址写在ARP分组里了
  2. 源MAC地址(6字节):谁发送的就是谁的MAC地址,比如现在就是AA:AA:AA:AA:AA:AA
  3. 类型(2字节):如果链路层帧封装的是ARP分组,类型字段的值就是0x0806,如果封装的是IPv4数据报,类型字段的值就是0x0800,如果封装的是IPv6数据报,类型字段的值就是0x86DD,所以该类型字段是为链路层复用多种网络层协议的(为了理解这一点,只需要记住,主机能使用除了IP以外的其他网络层协议)。注意,该类型字段和网络层数据报中的上层协议字段、运输层报文段中的端口字段相类似,所有的这些字段都是为了把一层的某协议与上一层的多种协议联系起来,体现了TCP/IP的复用原则
  4. 硬件类型(2字节):该字段指出了硬件地址类型,对于以太网,该值等于1。
  5. 协议类型(2字节):该字段指出需要映射的协议地址类型,对于IPv4来说,该值为0x0800,当以太网封装IP数据报时,帧类型字段也是0x0800。
  6. 硬件大小(1字节):该值为6,因为MAC地址为6字节
  7. 协议大小(1字节):该值为4,因为IPv4为4字节
  8. op操作字段(2字段):如果是ARP请求,该值为1,如果是ARP应答,该值为2,如果是RARP请求,该值为3,如果是RARP应答,该值为4
  9. 发送方MAC地址(6字节):谁发送的就是谁的MAC地址,现在就是AA:AA:AA:AA:AA:AA
  10. 发送方IP地址(4字节):现在就是192.168.0.10
  11. 目的方MAC地址(6字节):如果是ARP请求,因为192.168.0.10主机不知道192.168.0.20主机的MAC地址,该字段为00:00:00:00:00:00;如果是ARP应答,就是目的方MAC地址,即192.168.0.20主机应答时,该字段为AA:AA:AA:AA:AA:AA
  12. 目的方IP地址(4字节):如果是ARP请求,该字段为需要映射的IP地址,即192.168.0.20

4.ARP协议运行流程(掌握)

以上面的假设为例:发送主机IP地址为192.168.0.10,MAC地址为AA:AA:AA:AA:AA:AA,为了和192.168.0.20的主机通信,需要知道它的MAC地址。

接下来以在主机192.168.0.10上Ping 192.168.0.20的为情景,讨论ARP协议是如何运行的。
(Ping是基于ICMP协议实现的,是网络层IP协议的辅助协议,你只需要知道主机发送ICMP报文,到了链路层也需要目的方MAC地址封装帧即可,毕竟,现在我们的重点是讨论ARP协议是如何将IP地址映射成MAC地址的)

当我们在192.168.0.10的主机终端上输入:ping 192.168.0.20时,下面的步骤就开始了

  1. 192.168.0.10的操作系统内核,会先让ICMP模块生成一个ICMP报文,然后将该报文送到链路层,链路层准备将其封装成帧。
  2. 192.168.0.10的主机先在它的ARP缓存表里找,是否有一个表项的192.168.0.20的,如果找到的话,就直接拿到192.168.0.20主机的MAC地址,并更新该表项的生命周期,然后进行封装,最后由网卡将该帧发出去。
  3. 如果找不到的话,发送主机,会指示ARP模块,生成一个ARP请求报文,并让链路层用目的MAC地址为FF:FF:FF:FF:FF:FF(链路层广播地址)进行封装,然后发出去,注意ARP请求是广播,因为不知道嘛,换句话说,发送主机向局域网中大声喊了一句话,我是192.168.0.10,我的MAC地址是AA:AA:AA:AA:AA:AA,谁是192.168.0.20,你的MAC地址是多少,收到请回答,收到请回答,over,over
  4. 该局域网上的所有设备的网卡都会收到该帧,因为目的MAC地址是广播地址,每一个收到该帧的设备,包括主机和路由器,都会将该ARP请求,送到自己的ARP模块那里,这些模块,根据ARP请求分组里的目的IP地址决定是丢弃还是应答。
  5. 192.168.0.20的主机的ARP模块拿到该ARP请求报文,发现目的IP就是自己,所以它会进行ARP应答,注意,此时是单播,因为它知道了192.168.0.10主机的MAC地址,换句话说,192.168.0.10,你好,我是192.168.0.20,我的MAC地址是BB:BB:BB:BB:BB:BB
  6. 在应答之前,192.168.0.20主机会在自己的ARP缓存表里新增一条表项,记录了192.168.0.10的MAC地址为AA:AA:AA:AA:AA:AA
  7. 192.168.0.10的主机收到192.168.0.20的ARP应答之后,也更新了自己的ARP缓存表,拿到192.168.0.20主机的MAC地址之后,终于能将ICMP报文封装成帧发出去咯。
    ARP

5.ARP的两点有趣的事

  1. ARP查询报文是广播发送的,而ARP响应报文是单播发送的。
  2. ARP是即插即用的,ARP缓存表是自动建立的,它不需要管理员来配置和管理,ARP中的每个表项是有寿命期的,一般为20分钟

6.ARP协议是属于链路层还是网络层

这是一个令人头疼的问题,但是我们必须搞清楚它,目的是为了定位它在TCP/IP中位置。

如上面的讨论,一个ARP分组是封装在链路层帧中的,所以从TCP/IP的体系结构上来说,ARP协议是位于链路层之上的,因而可以认为它属于网络层,但是一个ARP分组里既包含了链路层MAC地址,也包含了IP地址,因此也可以认为它即属于链路层,也属于网络层。
所以,最好把ARP协议认为是处于链路层和网络层之间的辅助协议,虽然这不符合TCP/IP的分层协议栈,但是现实世界的协议就是这么复杂

7.MAC地址和IP地址

MAC地址是扁平结构的(全球唯一),不像IP地址那样具有层次结构(一个IP地址=网络号+主机号),这就好比,一个人可以搬来搬去,具有不同的住址,但是他只能有一个全球唯一手机号码,所以要给这个人寄快递时,可以先根据其住址,大概定位他住在哪个省哪个市那条街道,然后快递员才会根据手机号定位到他本人,将快递送到他手上。

8.为什么有了IP地址,还需要MAC地址

一句话,因为协议栈是分层的,链路层有链路层寻址,网络层有网络层寻址,它们是独立的,并且链路层是可以支持多种网络层协议的,这就需要一个中立的、能唯一表示一台计算机的标识符,这就是MAC地址。

设想一下上面的送快递,如果没有住址+手机号,而只有住址,快递公司要将快递送到本人手上成本有多大,这不得累死快递员,虽然只要收件人的住址也是可以做到的,但是效率太低,成本太高。

猜你喜欢

转载自blog.csdn.net/weixin_42237702/article/details/98891754