前言

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

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

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

 

 

创建 neighbor

这里指定了 ops 为 arp_hh_ops

54 关于 arp 的处理_IP

 

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

54 关于 arp 的处理_linux_02

 

 

arp_solicit

创建 arp 请求, 广播出去 

54 关于 arp 的处理_arp_03

 

 

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

54 关于 arp 的处理_linux_04

 

 

抓包解析信息如下 

54 关于 arp 的处理_网络层_05

 

 

 

arp_rcv

处理 arp 请求 

真实处理请求的函数是 arp_process

54 关于 arp 的处理_linux_06

 

 

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

54 关于 arp 的处理_IP_07

54 关于 arp 的处理_arp_08

 

 

抓包解析信息如下 

54 关于 arp 的处理_网络层_09

 

 

arp –a

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

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

54 关于 arp 的处理_arp_10

 

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

54 关于 arp 的处理_dns_11

 

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

54 关于 arp 的处理_linux_12

 

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

54 关于 arp 的处理_linux_13

 

 

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

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

54 关于 arp 的处理_linux_14

 

arp_req_set 这边实现如下 

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

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

54 关于 arp 的处理_dns_15