前言
arp 协议是一个相当基础的协议
局域网内部 无处不在, 用于根据 ip 地址获取对应的主机的 mac 地址, 进而 发送数据包
相当基础 且重要, 也相对来说比较简单
创建 neighbor
这里指定了 ops 为 arp_hh_ops
初始化设备接收到包的处理函数
arp_solicit
创建 arp 请求, 广播出去
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
抓包解析信息如下
arp_rcv
处理 arp 请求
真实处理请求的函数是 arp_process
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
抓包解析信息如下
arp –a
读取的是 /proc/net/arp 的信息
然后 再加工一次, 具体的输出 这里就不演示了
vfs 读取 /net/arp 的相关具体的实现
遍历 arp_tbl, 然后输出 arp 表项的相关信息
遍历 arp 表, 输出表头, 输出每一个表项的 ip, hwType, flags, hwAddr, mask, deviceName
arp -s 192.168.1.2 00:50:56:c0:00:08
arp –s 基于 ioctl 的系统调用, 由内核提供支持
arp_req_set 这边实现如下
获取 ip, 设备 对应的 arp 表项, 然后进行更新
我们这里传入的 ip 存在问题, 类型匹配不上, 报了非法的参数
完