【发布时间】:2019-01-05 21:26:47
【问题描述】:
我很困惑 AF_PACKET 套接字系列(用于 SOCK_RAW 套接字)与以太网 (IEEE 802.3) 的具体关系。
到目前为止我的理解:
我了解 OSI 模型以及第 2 层技术如何 以太网适合该模型。
我了解
AF_PACKET可以与SOCK_RAW套接字一起使用 接收包含 14 字节以太网报头的数据报,后跟一些 其他更高层协议头,例如 IPv4、IPv6 等, 后跟可选的传输层协议,如 TCP,以及 最后是一个有效载荷。我知道您可以将
ETH_P_ALL或ETH_P_IP等标志传递为socket的协议参数让内核过滤数据包 对您来说,只向您发送包含特定标头的数据包 输入。- 我了解使用
AF_PACKET系列创建的套接字可以接收或发送到sockaddr_ll类型的端点,该端点与特定的 MAC 地址(EUI-48 地址)以及特定的网络接口(例如eth0或其他)。
我不明白的地方:
-
我不明白
AF_PACKET是否应该专门用于以太网设备,而不是其他第 2 层技术,例如 Wifi、蓝牙、令牌环、Infiniband 等。 我不明白以太网设备与使用 14 字节以太网标头的第 2 层协议之间的关系。以太网报头是 14 字节,可以定义为:
struct eth_hdr { char dest_address[6]; char source_address[6]; uint16_t ethertype; };换句话说,这个报头是否只用于物理以太网设备?答案似乎是否,因为如果我在环回接口上使用AF_PACKET,我仍然会收到包含14 字节以太网标头 的数据包。但环回不是以太网设备。那么为什么它会收到包含以太网头的数据包呢?如果
AF_PACKET可以与非以太网设备一起使用,ETH_P_ALL协议标志是否指示仅接受专门具有 14 字节以太网标头的数据包?
我的问题:
使用AF_PACKET 是否意味着您可以保证总是接收带有 14 字节以太网标头的数据包?
如果是这样,这是否也意味着AF_PACKET 仅用于以太网设备(与其他第 2 层技术相反,如 Wifi、令牌环、蓝牙、Infiniband 等)?
如果这两个问题的答案是否,那么应用程序如何以编程方式确定在AF_PACKET 套接字上接收数据报时期望的第 2 层标头类型?
【问题讨论】:
-
来自packet(7)?
Packet sockets are used to receive or send raw packets at the device driver (OSI Layer 2) level. They allow the user to implement protocol modules in user space on top of the physical layer.AF_PACKET 中使用的协议必须通过其他方式检测,因为内核不支持(或不知道)使用的协议。 AF_PACKET 可能适用于任何东西,只是内核不知道适用于什么。 -
那么,为什么环回接口会收到带有 14 字节以太网标头的数据包?
-
以太网 (IEEE 802.3) 帧头与 Wi-Fi (IEEE 802.11) 帧头非常不同。您看到的是不同协议帧头到以太网帧头的“标准化”。我不确定使用 64 位 MAC 寻址的 IEEE 协议或使用其他寻址或根本不寻址的协议如何发挥作用。
-
我认为答案是,环回接口使用的协议使用 14 字节以太网标头(如果有的话)。更具体地说,它是implemented,地址长度为6字节,支持TCP/IP协议。
-
@KamilCuk,TCP 和 IP 都不关心数据链路协议或其寻址。 IP 在具有 48 位 MAC 地址的以太网、具有 DLCI 编号的帧中继、具有 VPI/VCI 的 ATM 或没有寻址的 PPP 上运行良好。此外,TCP 可以在 IPv4、IPX 或 IPv6 上运行,而不关心承载它的网络协议。这就是层分离和封装的美妙之处;每一层都不关心其他层使用什么协议。
标签: c linux sockets networking ethernet