是否通过AF_PACKET暴露以太网校验和?

时间:2013-03-27 03:56:46

标签: linux sockets ethernet raw-sockets

正如this question暗示的那样,似乎校验和是由以太网硬件计算和验证的,因此在使用AF_PACKET套接字发送帧时,它似乎不太可能由软件生成,如似{{ 3}}和here。此外,我不认为它可以从套接字接收,也不是任何简单的意思,因为即使Wireshark也不会显示它。

那么,有人能证实这一点吗?我是否真的需要自己发送校验和,如最后两个链接所示?是否会由以太网适配器自动创建和检查校验和?

2 个答案:

答案 0 :(得分:2)

在Linux上,如果你提到套接字(AF_PACKET,SOCK_RAW,htobe16(ETH_P_ALL))类似的情况,你不需要计算以太网校验和,网卡硬件/驱动程序会为你做。这意味着您需要提供除校验和之外的整个数据链路层帧,然后再将其发送到原始套接字。

答案 1 :(得分:2)

不,您不需要包含CRC。

使用socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL) )在Linux中使用数据包套接字时,必须在发送时提供第2层标头。这由struct ether_header中的netinet/if_ether.h定义,包括目标主机,源主机和类型。不包括帧校验序列,也不包括前导码,帧起始分隔符或尾部。这些是由硬件添加的。