数据包套接字中 sockaddr_ll 的含义和用途

Meaning and purpose of sockaddr_ll in packet sockets

关于Linux的数据包套接字:在数据包套接字(AF_PACKET)中,应用程序实现以太网头和IP头来创建和发送数据包。所以这是我的问题。在这种情况下,我不明白套接字地址 (sockaddr_ll) 的必要性。与以太网头有什么区别?套接字地址到底有什么作用?

就像sockaddr_in标识一个IP地址和端口一样,sockaddr_ll标识一个link-layer地址和协议。在原始 AF_PACKET 套接字的情况下,术语“地址”可能会造成混淆,因为我们并不是真正在谈论 IP/MAC 或任何其他地址,而是在谈论接口(例如物理接口)网络设备)和协议。

以太网 header 包含有关以太网帧的元数据,并指示在有效负载中封装的协议 (EtherType field)。 sockaddr_ll可用于匹配或标识某个接口和协议(字段.sll_ifindex.sll_protocol):

  • 当数据包套接字绑定到sockaddr_ll时,它将只接收来自指定接口(.sll_ifindex)和指定协议(.sll_protocol)的数据包来自以太网 header.
  • 的 EtherType 字段的内核
  • 当接收(recvfrom or recvmsg)时,内核为用户填充一个sockaddr_ll结构,它标识接收数据包的接口和协议。
  • 发送时(sendto or sendmsg),一个sockaddr_ll结构体用于指定在哪个接口上发送数据包以及在以太网中设置哪个协议header(EtherType字段) .

另请参阅这篇有趣的文章,它可能有助于理解 AF_PACKET 套接字的工作原理:Send an arbitrary Ethernet frame using an AF_PACKET socket in C