internet-网络层-ARP协议

世间千般好


分类 internet
标签 post inernet arp

计算机网络

网络层

ARP Address Resolution Protocol 地址解析协议

IP协议的设计目的是为了跨越不同类型物理网络的分组交换提供互操作,这需要网络层软件使用的地址和底层网络硬件使用的地址之间进行转换。网络接口硬件通常有一个主要的硬件地址。由硬件交换的帧需要使用正确的硬件地址定位到正确的接口,否则无法传输数据。

通常,我们在软件层面上,使用的都是目标主机的IP地址来访问该主机,即网络层地址,(在IPv4中是)一个32位的IPv4地址。如果一台主机要发送一个帧到另一台主机,仅知道这台主机的IP地址是不够的,还需要知道主机在网络中的有效硬件地址。对于TCP/IP网络,地址解析协议(ARP)提供了一种在IPv4地址和各种网络技术使用的硬件地址之间的映射。APR仅用于IPv4,IPv6使用邻居发现协议,它被合并入ICMPv6中。

网络层地址和链路层地址是由不同部门分配的。

  • 链路层地址是由设备制造商定义的,并且存储在永久性内存中,所以它不会改变。
  • 网络接口的IP地址是由用户或网络管理员分配的,并且可以按需选择。

地址解析是发现两个地址之间的映射关系的过程,对于IPv4的TCP/IP协议族来说,这是由运行的ARP来实现的,ARP是一个通用的协议,它被设计为支持多种地址之间的映射,但实际上,ARP基本用于32位IPv4和以太网的48位MAC地址之间的映射。

工作原理

在同一局域网内的两台主机A和B,当主机A知道主机B的IP却不知道MAC时,会发送一个ARP广播包(mac地址时FF:FF:FF:FF:FF:FF),当该数据流经主机B时。主机B的

  • 网卡NIC检测到这一帧时发送给自己的,于是将它接收进来,并产生一个中断。
  • 以太网驱动程序从有效荷载中提取IP数据包,并将它传递给IP软件。
  • IP软件看到它的目标地址正是指向自己,所以对它进行处理。

为了ARP更加高效,可以进行优化,通常会将其缓存 ,所以我们用arp -a可以看到当前所有的arp信息。

产生MAC地址广播包的原因

  • 1、当交换机MAC地址表中没有目标MAC地址时
  • 2、目标MAC地址为FF:FF:FF:FF:FF:FF时

缓存及缓存超时

在windows系统上,使用如下命令查看所有ARP缓存条目。

# arp -a

接口: 192.168.230.1 --- 0x3
  Internet 地址         物理地址              类型
  192.168.230.254       00-50-56-f5-24-c1     动态
  192.168.230.255       ff-ff-ff-ff-ff-ff     静态
  224.0.0.22            01-00-5e-00-00-16     静态
  224.0.0.251           01-00-5e-00-00-fb     静态
  224.0.0.252           01-00-5e-00-00-fc     静态
  225.197.73.111        01-00-5e-45-49-6f     静态
  239.255.255.250       01-00-5e-7f-ff-fa     静态
  255.255.255.255       ff-ff-ff-ff-ff-ff     静态

接口: 192.168.1.111 --- 0xc
  Internet 地址         物理地址              类型
  192.168.1.1           b8-f8-83-d2-9b-2d     动态
  192.168.1.102         40-31-3c-62-a5-29     动态
  192.168.1.109         98-e7-f4-56-ea-1f     动态
  192.168.1.255         ff-ff-ff-ff-ff-ff     静态
  224.0.0.22            01-00-5e-00-00-16     静态
  224.0.0.251           01-00-5e-00-00-fb     静态
  224.0.0.252           01-00-5e-00-00-fc     静态
  239.255.255.250       01-00-5e-7f-ff-fa     静态
  255.255.255.255       ff-ff-ff-ff-ff-ff     静态

可以看到对应每个接口可以有自己缓存的ARP条目,ARP条目由(IP地址、MAC地址、类型)组成。

在linux(此处为ubuntu20)系统中

# arp -a
linxy-02 (192.168.56.217) at 1a:f9:3f:14:e0:08 [ether] on enp3s0
? (192.168.56.251) at a8:a1:59:23:fd:4b [ether] on enp3s0
? (192.168.39.39) at 00:15:5d:01:46:03 [ether] on enp3s0
? (192.168.56.124) at 1c:1b:0d:af:73:b8 [ether] on enp3s0
_gateway (192.168.56.1) at 04:25:c5:02:ab:ac [ether] on enp3s0
? (192.168.56.8) at 00:0b:00:20:7a:b5 [ether] on enp3s0
? (192.168.56.20) at 8c:ec:4b:5f:3b:0b [ether] on enp3s0
? (192.168.56.119) at dc:f0:90:b9:11:7f [ether] on enp3s0
? (192.168.56.227) at 4c:cc:6a:4a:a4:3f [ether] on enp3s0
? (192.168.56.229) at 40:16:7e:71:45:89 [ether] on enp3s0

此处是ARP信息是BSD风格,ARP条目由(主机名(IP),MAC地址,硬件地址类型,本地网络接口)组成。

缓存超时:为了应对IP与网卡映射可能的变化,比如主机关机了,映射无效了;比如之前记录的IP-MAC映射关系,由于IP被重新分配给另一台主机而导致的IP-MAC映射变化等等原因,arp缓存总是有一定的超时时间的,在大多数实现中是20分钟,

协议格式

arp协议

wireshark抓包

以太网帧

目的地址(Destination):48位,`ff:ff:ff:ff:ff:ff`,全为1,是广播地址,在同一广播域中的以太网接口可以接收这些帧。
源地址(Source):48位,本地物理网卡地址。
长度/类型(Type):16位,2字节的长度或类型字段必须为0X0806,表明是ARP协议。

ARP协议

硬件类型(Hardware type):16位,我抓包都是ethernet。常见的有MAC,物理或链路层地址,或以太网地址。对于以太网,该值为1。
上层协议类型(Protocol type):16位,目前看到了IPv4。对于IPv4,该值位0X0800。
硬件部分长度HLEN(Haredware size):8位,硬件地址的字节数。mac地址长度=6字节。
协议部分长度PLEN(Protocol size):8位,协议地址的字节数。IPv4地址长度=4字节。
(硬件类型,上层协议类型,HLEN,PLEN)这四个字段指定了最后四个(发送端MAC,发送端IP,接收端MAC,接收端IP)的类型和大小。

Op操作码(Opcode):16位,指定当前操作类型。ARP请求(1),ARP应答(2),RARP请求(3),RAPR应答(4)。

发送端MAC地址(Sender MAC address):长度由前面决定,发送方硬件地址。
发送端IP地址(Sender IP address):长度由前面决定,发送方协议地址。
接收端MAC地址(Target MAC address):长度由前面决定,目的硬件地址。
接收端IP地址(Sender IP address):长度由前面决定,目的协议地址。

注意:以太网帧(源地址字段)和ARP消息(发送端MAC字段)都包含发送方硬件地址,对于一个ARP请求,除了目的硬件地址(设为0)之外,其他字段都要填充。当一个系统接收到一个ARP请求,他填充自己的硬件地址,将两个发送方地址和两个接收方地址互换,将Op字段设置为2,然后发送生成的应答。

地址冲突检测

通常我们判断局域网内一个IP是否被占用或者能否访问到,我们习惯用ping命令。其实用arp命令(在linux中是arping)也能达到相同目的,即如果给定IP能够转换成MAC地址就能判断该IP被占用或者能被访问到,否则认为该IP未被占用或者无法访问到。

相关命令

显示所有条目
# arp -a[ InetAddr] [ -N IfaceAddr] 
# arp -a
# arp –g   
用于查看高速缓存中的所有项目。-a和-g参数的结果是一样的,多年来-g一直是UNIX平台上用来显示Arp高速缓存中所有项目的选项,而Windows用的是arp -a(-a可被视为all,即全部的意思),但它也可以接受比较传统的-g选项。

# arp -a Ip   显示所有接口的当前 ARP 缓存表。此处的 InetAddr 代表 IP 地址。如果未指定  InetAddr,则使用第一个适用的接口。要显示特定接口的 ARP 缓存表,请将 -N IfaceAddr 参数与 -a 参数一起使用,此处的  IfaceAddr 代表指派给该接口的 IP 地址。-N 参数区分大小写。如果我们有多个网卡,那么使用arp  -a加上接口的Ip地址,就可以只显示与该接口相关的Arp缓存项目。
删除条目
# arp -d 使用本命令能够人工删除一个静态项目。IP即为IP地址
设置静态条目
#arp -s Ip 物理地址   
我们可以向ARp高速缓存中人工输入一个静态项目。该项目在计算机引导过程中将保持有效状态,或者在出现错误时,人工配置的物理地址将自动更新该项目。此用的物理地址是计算机的MAC地址。

不一一列举,更多选项可以直接参考对应平台的帮助信息。

参考