54 关于 arp 的处理

前言

arp 协议是一个相当基础的协议 

局域网内部 无处不在, 用于根据 ip 地址获取对应的主机的 mac 地址, 进而 发送数据包 

相当基础 且重要, 也相对来说比较简单 

 

 

创建 neighbor

这里指定了 ops 为 arp_hh_ops

162efc376d0345fca4fc7489314a3743.png

 

初始化设备接收到包的处理函数  

9f74a5bb6b4842679d6fe60d4d85b24f.png

 

 

arp_solicit

创建 arp 请求, 广播出去 

0ce3848d0eb14a42a76f93b99bd8cef8.png

 

 

arp_send_dst 参数依次是 type, pType, destIp, dev, srcIp, destMac, srcMac, targetMac, dest

这里是封装 arp 包中的各个属性 

hardwareType, protocolType, hardwareSize, protocolSize, opcodeRequest

senderMac, senderIp, targetMac, targetIp

hardwareType 为 1, 表示 Ethernet

protocolType 为 0x0800, 表示 网络层 

hardwareSize 是 mac 地址的长度, 为 6

protocolSize 固定为 4, 表示 IP 地址的长度 

opcodeRequest 表示的是 ARPOP_REQUEST 为 1

1dad4ef88cfc4beabe44419536acda4d.png

 

 

抓包解析信息如下 

73dbf425441f467097ad532a03dd0cee.png

 

 

 

arp_rcv

处理 arp 请求 

真实处理请求的函数是 arp_process

23ba51d2508148dba6db92467ea930b5.png

 

 

arp_process 处理如下 

当前设备 mac 是根据 dev->dev_addr 获取的, 其他的信息来自于 源包

arp_send_dst 参数依次是 type, pType, destIp, dev, srcIp, destMac, srcMac, targetMac, dest

hardwareType, protocolType, hardwareSize, protocolSize, opcodeRequest

senderMac, senderIp, targetMac, targetIp

hardwareType 为 1, 表示 Ethernet

protocolType 为 0x0800, 表示 网络层 

hardwareSize 是 mac 地址的长度, 为 6

protocolSize 固定为 4, 表示 IP 地址的长度 

opcodeRequest 表示的是 ARPOP_REPLY 为 2

4f57a3968bfe482aaba3789bb6c846d0.png

9f8c77e1a30849fc9f30a830d8ec8e23.png

 

 

抓包解析信息如下 

c6d7654a71ca489698e2859ed0334737.png

 

 

arp –a

读取的是 /proc/net/arp 的信息 

然后 再加工一次, 具体的输出 这里就不演示了

39f006b1733348948e706140c71776fc.png

 

vfs 读取 /net/arp 的相关具体的实现  

167d791ace8d4aa89af2d96b707fd85d.png

 

遍历 arp_tbl, 然后输出 arp 表项的相关信息

bd4758fa15ed4a2ca726920e87dc65dd.png 

遍历 arp 表, 输出表头, 输出每一个表项的 ip, hwType, flags, hwAddr, mask, deviceName

5b0ed9274114483c96f1cd6bc4dda945.png

 

 

arp -s 192.168.1.2 00:50:56:c0:00:08

arp –s 基于 ioctl 的系统调用, 由内核提供支持 

e619c7f95792457083b31bdb5dc6b91d.png

 

arp_req_set 这边实现如下 

获取 ip, 设备 对应的 arp 表项, 然后进行更新 

我们这里传入的 ip 存在问题, 类型匹配不上, 报了非法的参数 

de58491d169e468bb03090ac8bb5b7d8.png

 

 

 

 

 

上一篇:差分与前缀和


下一篇:接口自动化框架搭建(八):pytest+allure+jenkins接入-2,创建jenkins项目