正如this question暗示的那样,似乎校验和是由以太网硬件计算和验证的,因此在使用AF_PACKET套接字发送帧时,它似乎不太可能由软件生成,如似{{ 3}}和here。此外,我不认为它可以从套接字接收,也不是任何简单的意思,因为即使Wireshark也不会显示它。
那么,有人能证实这一点吗?我是否真的需要自己发送校验和,如最后两个链接所示?是否会由以太网适配器自动创建和检查校验和?
答案 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
定义,包括目标主机,源主机和类型。不包括帧校验序列,也不包括前导码,帧起始分隔符或尾部。这些是由硬件添加的。