使用Layer 2原始套接字时FCS由内核生成还是需要自行生成追加?
二层原始套接字FCS处理规则
FCS生成责任方
默认情况下,基于Linux系统的PF_PACKET类型二层原始套接字开发时,帧校验序列(FCS)由内核或网卡硬件自动生成并追加到数据包末尾,不需要开发者手动计算填充。
只有当你主动为套接字设置SO_NOFCS选项(需内核版本支持、同时持有CAP_NET_RAW权限)时,才需要自行计算FCS并填充到帧尾部,此时内核和网卡会跳过FCS生成逻辑。
你提出的场景假设不成立,原因如下:
- 你构造的16字节以太网帧不符合标准要求:以太网帧(不含前导码、帧起始定界符)的最小长度为64字节,其中「头部+Payload」部分最小为60字节,剩余4字节为FCS。你的16字节数据会被内核/网卡判定为过短帧,会自动在尾部补零填充到60字节后,再额外追加4字节自动生成的FCS,最终发出的帧总长度为64字节。
- 你预留的末尾4字节零值会被识别为Payload的一部分,不会被内核当作FCS空位覆盖:你传入的所有16字节内容都会被当作「帧头+Payload」处理,自动生成的FCS会追加在这16字节的末尾,不会覆盖你预留的位置。
额外补充:收包场景下默认网卡会自动校验并剥离FCS,原始套接字收到的数据包不包含尾部4字节FCS,如需获取原始FCS需要单独修改网卡硬件配置开启FCS上报功能。
内容的提问来源于stack exchange,提问作者alexSimons
相关产品推荐
相关产品推荐

