关于Linux的数据包套接字:在数据包套接字(AF_PACKET
(中,应用程序实现以太网头和IP头来创建和发送数据包。这是我的问题。在这种情况下,我不理解套接字地址(sockaddr_ll
(的必要性。与以太网头有什么不同?套接字地址的具体作用是什么?
就像sockaddr_in
标识IP地址和端口一样,sockaddr_ll
标识链路层地址和协议。在原始AF_PACKET
套接字的情况下;地址";可能会令人困惑,因为我们谈论的不是IP/MAC或任何其他地址,而是接口(例如物理网络设备(和协议。
以太网标头包含有关以太网帧的元数据,并指示有效负载中封装的协议(EtherType字段(。sockaddr_ll
可用于匹配或识别某个接口和协议(字段.sll_ifindex
和.sll_protocol
(:
- 当数据包套接字绑定到
sockaddr_ll
时,它将只接收来自指定接口(.sll_ifindex
(和由内核从以太网标头的EtherType字段确定的指定协议(.sll_protocol
(的数据包 - 当接收(
recvfrom
或recvmsg
(时,由内核为用户填充sockaddr_ll
结构,该结构标识在其上接收数据包的接口和协议 - 发送(
sendto
或sendmsg
(时,sockaddr_ll
结构用于指定在哪个接口上发送数据包,以及在以太网标头(EtherType字段(中设置哪个协议
另请参阅这篇有趣的文章,这篇文章可能有助于理解AF_PACKET
套接字的工作原理:在C.中使用AF_PACKET套接字发送任意以太网帧