ARP与OpenFlow based SDN

2020-07-02 00:00:00 设备 地址 目的 数据包 数据链

本文图片源自互联网,侵删。

ARP平时的使用比较多,原理也比较简单,今天来系统的全面的看一下ARP,以及在SDN中的ARP可以是怎么样的。

ARP全称是地址解析协议(Address Resolution Protocol)。它由RFC826定义,这是个不太长的RFC,标题比较有意思:
An Ethernet Address Resolution Protocol -- or -- Converting Network Protocol Addresses to 48.bit Ethernet Address for Transmission on Ethernet Hardware

一个以太网地址解析协议 --或者是-- 将网络协议地址转换成48bit的以太网地址,以便在以太网设备上传输

够直观!

目前广泛的应用是通过IP地址,查询MAC地址。如无特殊说明,本文之后说网络协议地址,就是IP地址,以太网地址,就是MAC地址。ARP是IPv4中必不可少的协议,不过在IPv6中已经被NDP代替。

为什么需要ARP?


在TCP/IP协议中,主机到主机之间的通讯是通过IP地址来建立逻辑路径。例如,ping的是IP地址,访问网络服务,访问的也是IP地址。刚刚说的逻辑路径可以包含多个数据链路。举个例子,当你在看这篇文章的时候,实际上是建立了由你的电脑的IP到知乎服务器IP之间的逻辑路径。而数据包沿着这个逻辑路径传输时,经过了多个交换机和路由器的转发,这中间对应了多个数据链路。当数据包在一个独立的数据链路中传送时,需要把数据包封装在以太网帧(Ethernet Frame)当中,为了让Frame到达目的节点,需要知道目的设备的数据链路标识,也就是MAC地址。因此,对于一个数据链路中的各个设备,只有知道彼此的标识,才能完成网络数据传输(也就是常说的2层数据传输)。ARP的作用就是促成彼此之间数据链路标识的识别,进而完成网络数据的传输。

ARP协议格式

了解ARP的应用之前,先来看看ARP的协议格式。


图中的前14个字节是以太网报头,这个是所有网络数据通用的。ARP对应的帧类型是0x0806。

之后的28个字节是ARP协议的具体内容。主要就是描述了对应的网络协议地址和数据链路标识。

  • 其中硬件类型和协议类型:分别对应的是数据链路的类型和网络协议的类型。常见的硬件类型就是0x0001,对应以太网;而常见的协议类型是0x8000,对应IPv4.
  • 硬件地址长度和协议地址长度:分别对应的是数据链路标识和网络协议地址的长度。以太网的标识长度是6,即6个字节的MAC地址;IPv4的长度是4个字节。
  • 操作码:表明了当前ARP数据包的类型。ARP请求对应1,ARP响应对应2。详细的操作码用IANA定义。
  • 源硬件地址(SHA,Source Hardware Address)和源协议地址(SPA,Source Protocol Address):分别对应的源设备的MAC地址和IP地址。
  • 目的硬件地址(THA,Target Hardware Address)和目的协议地址(TPA,Target Protocol Address):分别对应的是目的设备的MAC地址和IP地址。

ARP的基本行为模式

后面将介绍ARP的多种应用,虽然有的看起来比较复杂。但是他们都遵循着ARP协议的基本行为模式,可以概括如下:
  • ARP的数据包含在SHA和SPA当中。也就是说各个设备获取IP地址到MAC地址的对应取自SHA和SPA。当SHA或者SPA为空时,ARP数据。
  • ARP的传输模式由以太网报头决定,例如单播还是广播,由目标以太网地址决定,与THA无关。
  • 任何设备仅会处理TPA与自身IP地址匹配的ARP数据。

ARP如何获取邻居设备的MAC地址

前面说过ARP的作用就是获得邻居设备的MAC地址,这一节看看这个过程具体是怎样。


现在有两个设备A和B在一个数据链路中。A现在要ping B(10.0.0.22)。虽然现在知道了B设备的IP地址,但是ICMP数据包终还是要封装在以太网报头中,也就是说网络数据的传输还需要知道目的设备的MAC地址。为了完成ICMP封包,A设备先从自己的ARP cache中去查找10.0.0.22的记录,如果找到了,直接使用记录中的MAC地址来填到以太网报头中。如果没有找到,设备A会发送一个ARP数据包,这个数据包有以下特点:
  1. 它包含了源设备A的IP地址和MAC地址(SHA,SPA)
  2. 它包含了目的设备B的IP地址(TPA),由于不知道设备B的MAC地址,THA被填成全0
  3. 它的以太网报头中,目的地址是广播地址:ff:ff:ff:ff:ff:ff
  4. 它的操作码是1,表明这是一个ARP请求

由于以太网报头中的目的地址是广播地址,整个数据链路上的设备都将收到该帧,只有设备B自身的IP能与TPA匹配,其他设备不能匹配都会丢弃数据包。设备B收到这个ARP请求之后,会回送一个ARP数据包,这个数据包具有如下特点:
  1. 它包含了设备B的IP地址和MAC地址(SHA,SPA)
  2. 它包含了设备A的IP地址和MAC地址(THA,TPA)
  3. 它的以太网报头中,目的地址是设备A的MAC地址
  4. 它的操作码是2,表明这是一个ARP响应

由B设备发出的ARP数据包不再是一个广播数据,而是单播给了设备A。并且该ARP响应中的SHA和SPA包含了设备B的IP和MAC地址,当设备A收到了该ARP响应,就知道了设备B的MAC地址,可以继续进行ICMP的封包,大致过程跟下面这个动图描述的一样。

ARP cache

前面已经提到了ARP cache。试想一下,如果每个ICMP封包都需要ARP广播一次获取目的设备的MAC地址,那网络上必定泛滥着ARP广播,而各个设备也必定疲于应付广播数据,即使没有任何实际数据包发送到设备本身。ARP cache就是为了解决这个问题提出的,这是设备本身的一个缓存,用来记录已知的IP地址和MAC地址的对应关系。根据RFC826,任何设备收到了任何ARP数据包,都必须更新其本地的ARP cache,更新的内容来自于ARP数据包的SPA和SHA。因此,在上面的过程中,设备A和设备B的ARP cache同时得到了更新。

ARP cache可以通过arp命令查看:

[~]$ arp -a

相关文章