欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

1-ARP协议

程序员文章站 2022-05-17 08:08:28
...

1. ARP地址解析协议

  ARP协议(Address Resolution Protocol)是一个地址解析协议,主要功能为通过目标主机的IP地址,查询目标主机的MAC地址,以保证通信的顺利进行,每台安装有TCP/IP协议的电脑里都有一个ARP缓存表,这个表里的IP地址与MAC地址是一一对应的。

2. 为什么有了IP地址还需要mac地址

  平时我们在使用电脑和网络中的另一台电脑进行网络通信时只需要知道对方的ip地址就行了。那为啥还需要mac地址呢?

  这是因为在网络中主机和主机之间通信数据包需要依据OSI模型从上往下进行数据封装,当数据封装完成后再向下层发出,需要将ip地址和mac地址的封装,一般情况下,对于上层应用程序来说更多的是关心ip地址而不是MAC地址,而对于底层网络链路数据通信来说使用的是MAC地址。

  也就是说,不管网络层使用的是什么协议,在实际网络的链路上传送数据帧时,最终还是必须使用mac地址(硬件地址),所以需要ARP协议来获取目的主机的mac地址来完成数据的封装和转发。每一个主机都设有一个 ARP 高速缓存(ARP cache),里面有所在的局域网上的各主机和路由器的 IP 地址到mac地址的映射表。 当主机 A 欲向本局域网上的某个主机 B 发送 IP 数据报时,就先在其 ARP 高速缓存中查看有无主机B的IP地址。如有,就可查出其对应的mac地址,再将此mac地址写入mac帧,然后通过局域网将该mac帧发往此硬件地址,这个就是ARP地址解析的一个过程。

  所谓地址解析其实就是主机将目标IP地址转换成目标MAC地址的过程,即ARP协议就是实现ip地址到mac地址的映射。

  另外,通常我们所说的逻辑地址指的是主机的IP地址,而物理地址指的是电脑上网卡的MAC地址。

3. 逻辑地址和物理地址

逻辑地址转换为二进制:
10.1.0.6 ————> 00001010 . 00000001 . 00000000 . 00000110

物理地址转换为二进制:物理地址的每一个位单独拿出来算
74 - E5 - 0B - 35 - 60 - 16 ————> 0111 0100 - 1110 0101 - 0000 1011 - 0011 0101 - 0110 0000 - 0001 0110

逻辑地址和物理地址的最主要的区别在于:
  逻辑地址是工作在网络层,通常以十进制表示,二进制下为32位,而物理地址是工作在数据链路层(或者说网络接口层),通常以十六进制表示,二进制下为48位。

4. ARP工作原理

  假如在同一局域网下,主机A的IP地址为209.0.0.5,主机A的mac地址为00-00-C0-15-AD-18,主机B的IP地址为209.0.0.6,主机B的mac地址暂时不知道。

  前面说过在同一局域网下,实际是使用mac地址来进行确定唯一一台主机,如果主机A要给主机B通信,比如:主机A要给主机B发送一个hello数据,现在只知道主机B的IP地址,而IP地址是工作在网络层的,但是数据在网络层往下传输到链路层使用的是mac地址,但问题是现在我们并不知道主机B的mac地址,如图1所示。

1-ARP协议
图1

  1. 当发送数据时,主机A会在自己的ARP缓存表中寻找是否有目标IP地址,如果找到就知道目标MAC地址为(00-BB-00-62-C2-02),直接把目标MAC地址写入帧里面发送就可。如果在ARP缓存表中没有找到相对应的IP地址,主机A就会在网络上发送一个广播(ARP request),目标MAC地址是“FF.FF.FF.FF.FF.FF”,这表示向同一网段内的所有主机发出这样的询问:“192.168.38.11的MAC地址是多少?”

1-ARP协议
图2

  2.其他主机收到广播请求后,会把主机A请求的IP地址209.0.0.6和自己的IP地址对应,如果不对直接把这个广播(ARP request)请求丢弃掉,不会回应主机A,当主机B收到请求后,拿到IP地址和自己对应上了,就会发送一个ARP响应信息,把主机B的IP地址和mac地址告诉主机A,注意:主机B响应的时候是以单播的形式响应的,而主机A是以广播的形式发送的

5. ARP数据报文格式

说了这么久,现在我们来看一下ARP数据报的封装格式,如图3所示:


1-ARP协议
图3

硬件类型:这是一个16位字段,用来定义运行ARP协议的网络类型,比如:以太网类型为1则说明ARP可用于物理网络上。

协议类型:也是一个16位字段,用于指定协议类型。

硬件长度:该字段占用8个bit位,用来定义物理地址的长度,即mac地址长度,以字节为单位。对于以太网来说,这个值一般是6。

协议长度:该字段占用8个bit位,用来定义逻辑地址的长度,即ip地址长度,以字节为单位。对于IPv4协议来说,这个值是4。

操作:这是一个16位长度的字段,用于定义ARP数据包类型,即1:ARP请求,2:ARP响应。

发送方硬件地址:这是一个可变长度字段,用来定义发送方的物理地址,即mac地址。

发送方协议地址:这是一个可变长度字段,用来定义发送方的逻辑地址,即ip地址。

目标硬件地址:这是一个可变长度字段,用来定义目标的物理地址(mac地址),对于ARP请求报文来说,这个字段是全部以0来填充,因为发送方并不知道目标方的物理地址。

目标协议地址:这是一个可变长度字段,用来定义目标的逻辑地址(ip地址)。

6. ARP在以太网中的封装格式

现在我们针对ARP协议抓一个包来分析一下,图4就是我们通过wireshark网络分析工具抓取到的ARP数据包。

1-ARP协议
图4

who has 192.168.22.77 ? Tell 192.168.22.1 表示请求IP地址为192.168.22.77的主机的mac地址,把你的mac地址告诉IP地址为 192.168.22.1的主机
Broadcast就是广播的意思。

ARP协议在以太网数据帧中的封装格式如图5所示:

1-ARP协议
图5

目标以太网地址(Destination):即目标MAC地址,ff:ff:ff:ff:ff:ff(二进制全1)为广播地址。
源以太网地址(Source):发送方MAC地址
帧类型(Type):以太类型,也就是说在二层数据帧是以ARP协议进行封装的,0x0806则表示ARP协议。
填充选项(Padding):一般以0填充



我们根据用wireshark软件抓取到的ARP数据包来具体分析ARP数据包中的字段值,如图6所示:

1-ARP协议
图6

Address Resolution Protocol (request)   //request表示ARP请求,reply表示ARP响应
    Hardware type: Ethernet (1)       //硬件类型是以太网,(0x0001表示的是以太网的标号)
    Protocol type: IPv4 (0x0800)         //协议类型是IPv4(0x0800表示的是IPv4的标号)
    Hardware size: 6                //硬件地址长度,其实说的就是mac地址的字节长度,一般是6字节
    Protocol size: 4               //协议地址长度,其实说的就是ip地址的字节长度,一般是4字节
    Opcode: request (1)          //表示操作码:1为ARP请求,2为ARP应答,3为RARP请求,4为RARP应答。
    Sender MAC address: Tp-LinkT_b3:97:14 (3c:46:d8:b3:97:14)    //源mac地址,一般为发送方的mac地址。
    Sender IP address: 192.168.22.4                         //源IP地址,一般为发送方的ip地址
    Target MAC address: 00:00:00_00:00:00 (00:00:00:00:00:00)   //目标mac地址,一般为接收方的mac地址,由于这里是ARP请求,所以mac地址以0填充
    Target IP address: 192.168.22.1                        //目标ip地址,一把为接收方的ip地址

7. ARP是属于哪一层协议

  ARP协议的功能最终是获取到MAC地址信息,服务于链路层,从这点考虑,ARP是链路层协议;但是从层次来看,ARP基于Ethernet(以太网)协议,IP协议基于Ethernet协议,它们在Ethernet协议里面有独立的Type类型,前者是0x0806,后者是0x0800,既然ARP和IP协议”平起平坐”,既然IP是网络层,ARP难道就不是网络层?

因此我们可以从以下方面来看待ARP协议是属于那一层协议:
1. 基于功能来考虑,ARP是链路层协议
2. 基于分层/包封装来考虑,ARP是网络层协议

8. ARP高速缓存的作用

  通常,ARP高速缓存的作用实际上就是主机A会把主机B的IP地址和mac地址缓存到一张缓存表里面,这样,下次通信的时候直接从ARP缓存表里面查,而不用发送ARP请求广播了,从而提高通信效率,下面举两个例子来说明一下:
  1.为了减少网络上的通信量,主机 A 在发送其 ARP 请求分组时,就将自己的 IP 地址到硬件地址的映射写入 ARP 请求分组。

  2.当主机 B 收到 A 的 ARP 请求分组时,就将主机 A 的这一地址映射写入主机 B 自己的 ARP 高速缓存中,这对主机 B 以后向 A 发送数据报时就更方便了。

需要注意的问题:
  ARP 是解决同一个局域网上的主机或路由器的 IP 地址和硬件地址的映射问题。如果所要找的主机和源主机不在同一个局域网上,那么就要通过ARP 找到一个位于本局域网上的某个路由器的硬件地址,然后把分组发送给这个路由器,让这个路由器把分组转发给下一个网络,剩下的工作就由下一个网络来做。

  从 IP 地址到硬件地址的解析是自动进行的,使用主机的用户对这种地址解析过程是不知道的。只要主机或路由器要和本网络上的另一个已知 IP 地址的主机或路由器进行通信,ARP协议就会自动地将该IP地址解析为链路层所需要的硬件地址,默认情况下ARP缓存的过期时间是两分钟。

下面我们来看一下ARP缓存表

9. ARP缓存表

windows下可以使用arp -a命令查看arp缓存表中的信息:
  arp –d清除本机arp缓存表
  arp –a查看本机当前arp表
  arp –s绑定arp地址(注意:本次机器生效,下次重启后会全部失效)

  在每台安装有TCP/IP协议的电脑或路由器里都有一个ARP缓存表,表里的IP地址与MAC地址是一对应的,如图7所示:

1-ARP协议图7

其实对于ARP协议来说,还有其他类型的ARP协议,比如:代理ARP协议。

一般来说,网络设备,包括电脑都会有arp缓存,arp缓存用来存放ip地址和mac地址的信息。在发送数据前,会先查找arp缓存表,如果缓存表中有对方的mac地址,则直接采用该mac封装数据帧,然后转发,如果不存在,则通过arp请求报文询问学习,然后将学习到的ip地址和mac地址的映射关系存放到arp缓存表中。

10. 代理ARP协议(Proxy ARP)

  代理ARP(Proxy-arp)的原理就是当出现跨网段的ARP请求时,路由器将自己的MAC返回给发送ARP广播请求发送者,实现MAC地址代理(善意的欺骗),最终使得主机能够通信。

1-ARP协议
图8

  上图中R1和R3处于不同的局域网,R1和R3在相互通信时,R1先发送了一个ARP广播数据包,请求R3的mac地址,但是由于R1是12.1.1.0网段,而R3是13.1.1.0网段,R1和R3之间是跨网段访问的,也就是说R1的ARP请求会被R2拦截到,然后R2会封装自己的mac地址为目的地址发送一个ARP回应数据报给R1(善意的欺骗),然后R2就会代替R1去访问R3。

  整个过程R1以为自己访问的是R3,实际上真正去访问R3的是R2,R1却并不知道这个代理过程,这就是所谓的ARP代理,通常用于跨网段访问。

  注意:如果R2关闭了arp的代理功能,那么R1再访问R3的时候,R2并不会把自己的mac地址给R1,那么R1和R3之间就无法通信。默认情况下,思科的设备是开启了arp代理功能,也就是说,R2会作为中间代理实现R1和R3之间跨网段通信。

  代理ARP的使用场景为:1. 没有路由功能的主机,2. 有路由功能,目的地指向本地出口