0%

学习TCPIP(2)-ARP协议

学习TCPIP(2)-ARP协议

ARP 协议是这样一个协议:它负责将高层地址(IP地址)映射为底层物理地址(MAC地址)

其中,IP地址是针对于TCPIP网络而言的,当目的地是网络A的主机H一个数据包抵达网络A的路由器时,该路由器需要知道主机H的MAC地址才能完成数据交付任务。

为什么需要MAC地址?很简单,网卡只认识MAC地址。准确地说,IP协议处于网络层,回忆一下基本的网络分层模型:最低下是物理层,最高层是应用层,重点在于:为了实现各层协议的解耦(各层协议可替换),高层协议对于底成协议是透明的,这意味着底层协议不知道也不需要了解它所搭载的高层协议数据包时什么协议的,有哪些属性,有什么数据,它就只管原样发送接受传输就行。

应用上述观点,以太网帧并不知道它封装的IP数据报的IP地址是什么,实际上,它就根本不知道有IP地址这个东西。

它靠MAC地址来识别每一个以太网帧。回到上面的问题,如果它已经知道了目的地主机H的MAC地址,那么它直接在本地网络广播这个以太网帧就行了,对方在检测到MAC地址匹配的情况下会接受该帧,其余主机会由于MAC地址不匹配而忽略该帧。

那么还剩下一个问题尚未解答:TCPIP协议是怎么从IP地址找到对应的MAC地址的呢?换句话说,IP地址如何映射到MAC地址?

这个如何把高层地址映射为物理地址的问题被称为地址解析问题(Address resolution problem)

直接映射

直接映射(Direct Mapping)指的是,在数学上讲,就是存在一个函数\(f(x)\),允许直接将IP地址转换为物理地址: \[ P_A = f(I_A) \]

举个例子,如果取\(f(x) = x\),那么对于某个物理网络中的1号,2号,3号主机而言,他们的物理地址就分别是1,2,3。这样做的本质是,将IP地址的主机号部分编码为了物理地址。

这个想法很好,转换方式相当高效!但是将这个方案应用于IPv4网络时却遇到了难题:

  1. IP地址是32比特编码的,而物理地址是48位比特编码的。也就是说,没办法将48比特的物理地址直接编码成IPv4地址!
  2. 每个网卡出厂时都被厂商指派了一个48比特的物理地址。这意味着一旦更换网卡,物理地址就会随之改变。

动态绑定技术

为了解决直接映射技术带来的问题,TCP/IP的设计人员设计了一种底层协议来动态的绑定地址,这个协议被称为地址解析协议(Address Resolution Protocol, 简称ARP)

这个协议的设计思路相当简单:当主机A需要访问IP地址为\(I_B\)的主机时,主机A就会在本地网络广播一个特殊的分组,其中携带了主机B的IP地址。当主机B接收到这个特殊的分组时,就会以本机的物理地址\(P_B\)进行相应。主机A在接收到这个回答之后,就会将互联网分组直接发送给B。

ARP 高速缓存

为了减少网络上的通信量,通常每个主机都会有一个高速缓存。当主机A在通过ARP协议取得主机B的物理地址\(P_B\)之后,就会放入自身的高速缓存中,下次再向主机B发送互联网分组时直接从高速缓存中读取缓存的物理地址,就不必再次发送ARP请求分组询问主机B的物理地址了。

ARP 超时

ARP高速缓存中缓存的IP-MAC映射信息不是一直存在的。因为IP-MAC映射信息可能会在没有任何警告的情况下变得“陈旧”。当主机A向主机B发送了ARP请求且已经收到了来自主机B的ARP回答,随后可能目的主机下线,或者目的主机网卡发生故障,更换了一张新的网卡,随之而来的就是MAC地址发生了改变,原来A收到的ARP回答里的MAC地址就变得“陈旧”了。

为了能够适应这种情况,协议让信息的拥有者负责绑定信息的正确性。一般情况下,大多数对于ARP协议的实现都使用了计时器 ,当计时器超时之后将会删除状态信息。

例如,当地址绑定信息被放入ARP缓存时,协议需要设置一个计时器,典型的超时时间是20分钟。当计时器超时后必须删除这些信息。

删除后有两种可能性:

  1. 如果随后没有任何分组需要发送到对应站,则什么事情都不会发生;
  2. 如果需要向对应站发送分组,而在缓存中又找不到相应的绑定,此时计算机将会按照正常的流程,广播一个ARP请求来获得相应的ARP绑定。如果目的站仍可达,那么此绑定将会再次被放入ARP高速缓存中;如果对方不可达,发送方就会发现目的机器已经下线。

ARP的改进

当主机A向主机B发送ARP请求时,这个请求里面也会包含主机A的IP地址-MAC地址映射。B接收到这个ARP请求时,会从中提取出主机A的IP地址-MAC地址映射,并将其保存在自身的高速缓存中。

在主机A发送ARP请求后,由于这个请求是以本地广播的形式发送的,因此本地网络的所有主机都会收到该请求并更新自身的ARP高速缓存。

当地址发生的计算机启动时,会向本地网络广播一个无回报的ARP (Gratuitous ARP)请求。将自身的新地址通知给其他主机。

总结:

每个ARP广播分组都包含发送方的IP地址到物理地址的绑定。接收方在处理ARP分组(对目标地址进行解析)之前,先在自己的缓存中更新发送方IP到物理地址的绑定信息。

ARP 协议的封装与标识

想要在以太网络上传输ARP报文,就必须把ARP报文封装在以太网帧里面。参考以太网帧的Wikipedia,以太网帧首部有一个类型字段用于区分各种不同的封装在以太网传输的报文。以太网给ARP协议分配的帧类型字段的值为0x0806。可是光靠这个类型字段仅能分辨出这是ARP报文,没办法区分这究竟是ARP请求报文还是ARP回答报文。

ARP协议格式

从功能上讲,ARP有两部分功能:

  1. 在发送数据报时将IP地址映射成物理地址
  2. 响应来自其他主机的请求

很遗憾,因为ARP适用于多种网络技术的物理网络,因此ARP分组的数据没有固定格式的首部。下图展示的是通过以太网帧传输的IPv4 ARP报文格式:

Internet Protocol (IPv4) over Ethernet ARP packet, Copied from Wikipedia

Operation字段可以说下列4个值之一:

  1. ARP 请求(1)
  2. ARP 响应(2)
  3. RARP 请求(3)
  4. RARP 响应(4)

RARP协议

相比于ARP协议将IP地址映射为物理地址,RARP协议将物理地址反向映射为IP地址。当以太网帧包含着一个RARP报文时,以太网帧的类型字段的值将会是0x8035而不是ARP的0x0806。