ARP协议

羽林君

共 4695字,需浏览 10分钟

 · 2023-06-14

ef06545c911643d00ef95bdf53478523.webp

这里给大家做一个ARP的介绍分享:


1. ARP协议简介


Address Resolution Protocol,用于建立和维护IPv4(IPv6使用NDP协议)地址和MAC地址的动态映射。在一个局域网中(LAN),数据包通过MAC地址来寻址的(网络层的数据包被封装在二层数据帧中进行传输),但是IPv4是用IP地址来寻址。只知道IP地址,不知道MAC地址,数据包是无法发送(不能寻址)的,这个时候就使用ARP协议获得IP地址对应的MAC地址。

注意ARP协议只在LAN中使用(LAN不仅指192.168之类的私有网络地址,公网地址也是可以组成一个一个LAN的)。那么如果目的IP不在当前LAN中呢,TCP/IP协议族是用来实现多个LAN之间的互联,网关就相当于一个国家(LAN)的海关,一个LAN中的主机发给其他LAN的数据包(货物)首先发给网关,然后网关再把数据包发送出去。所以主机需要做的事情是把数据包发送给网关,网关的IP是已知的,此时ARP协议的工作是已知网关的IP获得网关的MAC地址。

ARP协议要求链路层支持广播

2. ARP协议工作的一般过程


假设现在有一个LAN,LAN的网段是202.117.15.0/24

主机A的IP地址:202.117.15.10,MAC地址00:00:00:00:00:10

主机B的IP地址:202.117.15.11,MAC地址00:00:00:00:00:11

A此时要给B发送一个UDP包(三层包),A不知道B的MAC地址,过程如下:

1. A发送一个ARP request(广播包,目的MAC全1),LAN中的所有主机(不考虑VLAN)都会收到这个ARP request。这个ARP request的内容主要是:哪位小哥的IP地址是202.117.15.11啊,告诉我呗,我的IP地址是202.117.15.10,MAC地址是00:00:00:00:00:11

2. B收到了这个ARP request后,发现ARP request询问的IP地址是自己,B做了N件事:1)更新自己的ARP映射,即把MAC地址00:00:00:00:00:10映射到202.117.15.10上。(不考虑静态映射)。2)给主机A发送ARP reply(单播,A的MAC地址已知),主要内容是:哎呀,A你好啊,我就是你要找的那个B(202.117.15.11)啊,我的MAC地址是00:00:00:00:00:11。其他主机收到这个广播后,会执行步骤1),更新自己的ARP映射(不考虑存在静态映射的情况)

3. A收到B发来的ARP reply,更新自己的ARP映射,即把MAC地址00:00:00:00:00:11映射到202.117.15.11上。

4. 此时A知道了B的MAC地址,B也知道A的MAC地址,于是A和B就可以没羞没臊地聊天了(互相发送三层数据包),只要某个时刻其中一个主机的MAC地址-IP地址映射过期了,就再次重复1到3的过程,然后继续愉快地聊天,一点都不影响兴致呢。

3. ARP包的格式


ARP在OSI七层模型中和TCP/IP四层模型中都被放在了数据链路层(二层),但是又有点像三层的,ARP有ethtype(0x0806),IP的ethtype是0x0800,貌似有称为2.5层的

下面是Ethernet & IPv4网络中的ARP包的格式

65847b092206fd4c87b45cacc0b4444e.webp

 

ARP包是封装在以太帧中,和IP包在以太帧中的位置是一样一样的

字段说明:

Hardware type: MAC地址类别,Ethernet中该值为1。通常所说的MAC地址,物理地址,数据链路层地址都指的同一个东西,以太网中的MAC地址又成为以太网地址。

Protocol type: 协议地址类别,IPv4网络中该值为0x0800(是的,和ethtype的值是一样的,这不是巧合,用的就是Ethtype的值)

Hardware address length:MAC地址长度,Ethernet中该值为6

Protocol address length:协议地址长度,IPv4中该值为4

Operation: 说明ARP包的类型,request时值为1,reply为2

Sender hardware address 发送者的MAC地址

Sender protocol address:发送者的协议地址(IPv4地址)

Target hardware address:目标MAC地址,ARP request中为广播地址(全1)

Target protocol address:目标协议地址,

发送者会在ARP request中填入自己的MAC地址,IP地址(Sender地址),目标MAC填入二层广播地址,目的IP地址填入询问的IP地址,目标主机收到ARP request后,发送ARP reply包,ARP reply中的Target地址是ARP request的Sender MAC地址和IP地址,ARPreply的Sender地址是主机自己的MAC地址和IP地址。

4. ARP映射的类别和超时时间


C:动态的映射,动态学习获得的,就是通过上述的那个一般过程获得的,一般超时时间为20分钟(RFC1122中规定的)

M:静态的映射,手动静态配置的ARP映射,没有超时时间,但是大多数的实现中ARP reply会更改静态的ARP映射(不管本主机是否发送过ARP request),没有做过这个实验,不清楚替换后的ARP映射是静态的还是动态的。

P:publish,主要用于代理ARP,代理ARP让主机回应(发送ARP reply)不是指向自己IP地址的ARP request,让Sender以为自己是要找的MAC地址。这个现在很少用了

5. Gratuitous ARP


无理由ARP(请无视我的翻译),GratuitousARP是指主机发送一个目标IP为自己IP的ARP request。Gratuitous ARP一般在系统bootstrap(引导程序)时间执行(这里我不太理解,计算不是系统启动时间,只要是网卡启动时应该都会发送的吧)网卡发送一个目标IP为自己ARP request。

这个ARP包主要有两个作用:

1. 主机确定当前网络中是否有主机的IP和自己的IP是一样的。如果这个ARPrequest发出后,收到了ARP reply,说明当前LAN(或者VLAN)有主机用了和本机一样的IP。这个时候系统通常会提醒用户IP地址冲突。如果没有收到ARP reply,说明LAN(或者VLAN)中没有主机和自己IP地址一样。

2. 主机的MAC地址可能发生了变化(比如修改了MAC地址,或者换了网卡)。ARP request可以让LAN(或者VLAN)中所有主机更新ARP request发送者的IP和MAC的映射关系。(静态的ARP映射关系应该不会被ARP reqeust更新,通常只会被ARP reply更新——这个是我根据上下文推测的,还没有试验过)

6. 地址冲突检测(ACD)


Gratuitous ARP发现地址冲突后什么都不能做,只能提示用户发生了地址冲突。所以RFC5227提出了一个新的机制:ACD(Address Conflict Detection)

ACD可以对地址冲突做出反应,ACD定义了ARP probe和ARP announcement两种ARP包(都是ARP request,只是填充内容不太一样)

ARP probe:用于检测IP地址冲突,Sender IP填充为0,填充为0是为了避免对其他主机的ARP cache造成污染(因为可能已经有主机正在使用候选IP地址了,不要影响别人的正常通行嘛),Target IP是候选IP地址(即本机想要使用的IP地址)

ARP announcement:用于昭示天下(LAN)本机要使用某个IP地址了,是一个SenderIP和Traget IP填充的都是本机IP地址的ARP request。这会让LAN(VLAN)中所有主机都会更新自己的ARP cache,将IP地址映射到发送者的MAC地址。

0a9eacc8819e660e798e6e77ef5bea22.webp

 

6.1 ACD流程
1. 网卡启动时(或者从睡眠状态恢复,或者链接建立时)会发送一个ARP probe。(为了避免多个网卡同时启动同时发ARP probe造成拥塞,有一个拥塞避免策略,不会立刻发送ARP probe,单个网卡的多个probe也不会连续发送,会有间隔时间)

2. 发送主机可能收到ARP reply或者ARP probe,如果收到了ARP reply,说明候选IP地址已经有主机在用了。如果收到了一个Target IP地址为候选IP的ARPprobe,说明另外一个主机也同时想要使用该候选IP地址。这种情况下,两个主机都会提醒用户出现了IP地址冲突。然后进行地址冲突处理(见后面)

3. 如果上述两种ARP包都没有收到,说明候选IP地址可用。主机发送一个ARP announcement,告诉其他主机这个候选IP有人用了,这个ARP request会让LAN(VLAN)中其他主机更新ARP cache。

4. 系统运行期间,ACD是一直在运行的,这点与Gratuitous ARP不同。主机会一直检测收到的ARP reqeust 和ARP reply,判断Sender IP域是否和本机IP地址一样,如果一样说明有主机也在用这个IP地址了。然后需要进行地址冲突处理。(见下面)

地址冲突处理:《RFC5527》提供了三种可选的解决机制:1)放弃使用该IP地址,2)发送一个ARP announcement来进行IP地址“守卫”,如果冲突仍然继续存在,放弃使用这个IP。3)无视冲突,继续使用这个IP

7. TODO:


1. 实验ARP reqeust 和ARP reply 是否可以更新静态IP-MAC映射

2. 实验不断发送ARP reqeust进行攻击

3. 实验不断发送ARP reply进行攻击

4. 实验使用ARP欺骗LAN中的其他主机(让主机以为自己是网关,或者让网关以为自己是目的主机,或者both),并在主机无法察觉的情况下查看主机数据。尝试去篡改用户数据

来源:https://blog.csdn.net/xiaopeng_thriller/article/details/108200717

                                  ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧  END  ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧


推荐阅读

【1】jetson nano开发使用的基础详细分享

【2】Linux开发coredump文件分析实战分享

【3】CPU中的程序是怎么运行起来的 必读

【4】cartographer环境建立以及建图测试

【5】设计模式之简单工厂模式、工厂模式、抽象工厂模式的对比

本公众号全部原创干货已整理成一个目录,回复[ 资源 ]即可获得。


浏览 63
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报