You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Raw Socket发送数据包时出现额外字节的问题排查

问题分析与解决

原因

你遇到的问题根源在于AF_PACKET SOCK_RAW模式下的内核行为:当你给sockaddr_ll.sll_protocol设置非0值时,内核会自动将这个协议号(转换为网络字节序)作为链路层帧的协议类型字段,插入到你发送的数据包最前端。

你的EXAMPLE数组已经包含了完整的以太网帧头(包括ARP协议的类型字段0x08 0x06),但内核因为sll_protocol=0x11,又额外插入了0x11 0x00(小端转网络字节序后的结果),导致数据包结构被破坏。

另外,你提到的sockaddr_ll与sockaddr的大小差异并不是直接原因——你在sendto里已经正确指定了地址结构体的大小mem::size_of::<sockaddr_ll>() as u32,内核会按照这个大小读取地址数据,指针转换不会导致数据插入,真正的问题是协议字段的重复添加。

修复方案

方案1:禁用内核自动添加协议字段(推荐)

将sll_protocol设为0,这样内核会直接发送你提供的完整链路层帧,不会额外插入任何字段:

let addr = sockaddr_ll {
  sll_family: AF_PACKET as u16, // 用常量更清晰,AF_PACKET的值是0x3
  sll_protocol: 0, // 关键:设为0,不自动添加协议字段
  sll_ifindex: 2, // 确保这个是你要发送的网卡的正确索引
  sll_addr: [0; 8],
  sll_halen: 6, // 以太网MAC地址长度是6,建议正确设置
  sll_hatype: 1, // 以太网的硬件类型是1
  sll_pkttype: 0,
};

同时,确认你的EXAMPLE数组是完整的以太网帧(包含正确的目标MAC、源MAC、协议类型0x0806以及ARP报文内容),这样发送后就能和你预期的一致。

方案2:让内核处理协议字段(需修改数据包)

如果你希望内核负责添加协议类型字段,需要从EXAMPLE数组中移除以太网帧头的协议类型部分(即去掉0x08 0x06),然后将sll_protocol设为htons(ETH_P_ARP)(ETH_P_ARP的值是0x0806,转换为网络字节序):

// 先修改EXAMPLE,去掉原帧头里的0x08 0x06,长度变为42
const EXAMPLE: [u8; 42] = [
    0x00, 0x04, 0x00, 0x01, 0x00, 0x06, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
    0x00, 0x01, 0x08, 0x00, 0x06, 0x04, 0x00, 0x01, 0x00, 0xd8, 0x61, 0x57, 0x60, 0x36, 0xc0, 0xa8,
    0x02, 0x08, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xa8, 0x02, 0x01,
];

// 设置sll_protocol为ARP的协议号(网络字节序)
let addr = sockaddr_ll {
  sll_family: AF_PACKET as u16,
  sll_protocol: htons(ETH_P_ARP), // ETH_P_ARP是0x0806,htons转为网络字节序
  sll_ifindex: 2,
  sll_addr: [0; 8],
  sll_halen: 6,
  sll_hatype: 1,
  sll_pkttype: 0,
};

这种方式下,内核会自动在你的数据包前添加0x08 0x06作为以太网协议类型,生成正确的帧。

额外注意点

  • 确保sll_ifindex是正确的网卡索引,可以通过ip link show命令查看(比如eth0的索引可能是2)。
  • 发送原始套接字需要root权限,运行程序时要加上sudo。
  • 确认你的ARP报文内容正确:源MAC、源IP、目标MAC(广播)、目标IP都符合你的网络环境。

内容的提问来源于stack exchange,提问作者petios

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 17:23:23