龙空技术网

ARP协议工作原理

吃泡菜的鱼 85

前言:

此刻大家对“linux arp查看”都比较注重,小伙伴们都需要了解一些“linux arp查看”的相关文章。那么小编在网络上汇集了一些有关“linux arp查看””的相关内容,希望朋友们能喜欢,各位老铁们快快来了解一下吧!

APR协议能实现任意网络层地址到任意物理地址的切换,其工作原理是:

主机向自己所在的网络广播一个ARP请求,该请求包含目标机器的网络地址。此网络上的其他机器都将收到这个请求,但只有被请求的目标机器会回应一个ARP应答,其中包含自己的物理地址。

详解

以太网ARP请求/应答报文

硬件类型字段定义物理地址的类型,它的值为1表示MAC地址。协议类型字段表示要映射的协议地址类型,它的值为0x800,表示IP地址。硬件地址长度字段和协议地址长度字段,顾名思义,其单位ie是字节。对MAC地址来说,其长度是6,对IPv4地址来说,其长度为4。操作字段指出4种操作类型:ARP请求(值为1)、ARP应答(值为2)、RARP请求(值为3)、RARP应答(值为4)。最后四个字段指定通信双方的以太网地址和IP地址。发送端填充除目的端以太网地址外的3个字段,以构建ARP请求并发送之。接受端发现该请求的目的端IP地址是自己,就把自己的以太网地址填进去,然后交换交换两个目的端地址和两个发送端地址,以构建ARP应答并返回之,当然操作字段也要设置为2。

ARP请求/应答报文的长度为28字节,如果再加上以太网帧头部和尾部的18字节,则一个携带ARP请求/应答报文的以太网帧长度为46字节。不过有的实现要求以太网帧数据部分长度至少为46个字节,此时ARP请求/应答报文将增加一些填充字节,以满足这个要求。在这种情况下,一个携带ARP请求/应答报文的以太网帧长度为64字节。

ARP高度缓存的查看和修改

通常,ARP维护一个高速缓存,其中包含经常访问(比如网关地址)或最近访问的机器的IP地址到物理地址的映射。这样就避免了重复的ARP请求,提高了发送数据包的速度。

Linux下可以使用arp命令来查看和修改ARP高速缓存,比如alexdev在某一时刻(注意,ARP告诉缓存的动态变化的)的ARP缓存内容如下(使用arp -a命令)

其中第一项描述的另一台测试机器raspberrypi,最后一项是路由器。

下面两条命令则分别删除和添加一个ARP缓存项:

sudo arp -d 10.0.0.153 #删除raspberrypi对应的ARP缓存项

sudo arp -s 10.0.0.153 b8:27:eb:71:0a:e2 #添加raspberrypi对应的ARP缓存项

使用tcpdump观察ARP通信过程

具体操作如下

alexdockermother@alexdev:~$ sudo arp -d 10.0.0.153

[sudo] password for alexdockermother:

alexdockermother@alexdev:~$ sudo tcpdump -i wlp2s0 -ent '(dst 10.0.0.153 and src 10.0.0.143) or (dst 10.0.0.143 and src 10.0.0.153)'

开启另一个终端

alexdockermother@alexdev:~$ telnet 10.0.0.153 echo

Trying 10.0.0.153...

Connected to 10.0.0.153.

Escape character is '^]'.

^]

telnet> quit

Connection closed.

在执行telnet命令之前,应先清楚ARP缓存中与raspberry对应的项,否则ARP通信不被执行,我们也就无法抓取到期望的以太网帧。当执行telnet命令并在两台通信主机之间建立TCP连接后,输入Ctrl+]以调出telnet程序的命令提示符,然后在telnet命令提示符后输入quit,退出telnet客户端程序。

tcpdump 抓取到的众多数据中,只有最靠前的两个和ARP通信有关:

7c:76:35:6a:c9:94 > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42: Request who-has 10.0.0.153 tell 10.0.0.143, length 28

b8:27:eb:71:0a:e2 > 7c:76:35:6a:c9:94, ethertype ARP (0x0806), length 60: Reply 10.0.0.153 is-at b8:27:eb:71:0a:e2, length 46

由tcpdump抓取的数据包本质上是以太网帧,我们通过该命令的众多选项来控制帧的过滤(比如用dst和src指定通信的目的端IP地址和源端IP地址)和显示(比如用-e选项开启以太网头部信息的显示)。

第一个数据包中,ARP通信的源端的物理地址是7c:76:35:6a:c9:94(alexdev),目的端的物理地址是 ff:ff:ff:ff:ff:ff,这是以太网的广播地址,用以表示整个LAN。该LAN上的所有机器都会收到并处理这样的帧。数值0x0806是以太网帧头部的类型字段的值,它表示分用的目标是ARP模块。该帧长度是42个字节(实际上是46个字节,tcpdump未统计以太网帧尾部4字节的CRC字段),其中数据部分为28字节。“Request"表示这是i一个ARP请求,” who-has 10.0.0.153 tell 10.0.0.143“则表示alexdev要查询raspberry的IP地址。

第二个数据包中,ARP通信的源端物理地址是b8:27:eb:71:0a:e2(raspberry),目的端的物理地址是7c:76:35:6a:c9:94(alexdev)。”Reply"表示这是一个ARP应答,“10.0.0.153 is-at b8:27:eb:71:0a:e2”则表示目标机器raspberry报告其物理地址。该以太网帧的长度是60字节(实际上是64字节),可见它使用了填充字节来满足最小帧长度。

标签: #linux arp查看 #linux添加arp