我有一个用C语言编写的Linux UDP服务器,我发送的是16字节的UDP数据报。客户端正确接收所有数据,但wireshark日志显示正在添加两个额外字节:
00 16 00 00 c8 44 01 14 01 01 02 01 02 00 00 10 00 00
这两个字节都是零,我不知道它们来自哪里,我在sendto()函数中发送了16个字节的数据。
必须在Linux内核层的填充中添加这些内容吗?反正有没有阻止这种情况发生?
wireshark的屏幕截图,显然这是以太网填充字节......为什么它们在这里?
答案 0 :(得分:5)
以太网帧必须至少为64个八位字节,包括屏幕截图中未显示的帧校验序列(FCS)的4个八位字节。如果没有这两个零填充八位字节,那个帧只有62个八位字节长。另请注意,他们不是 在UDP数据包中,他们在之外。 outside 上的UDP帧长度为24,包括您发送的数据的16个八位字节;其余8个八位字节是4个16位数字:源端口,目标端口,长度和校验和。以太网填充字节在UDP和IP帧之外。
最小64字节帧长度的原因是旧的 - 以太网最初是为总线拓扑而设计的,其中媒体访问是通过一种称为carrier-sense multiple access with collision detection (CSMA/CD)的方法来调节的。当总线空闲时,任何设备都可以在总线上进行传输,但是它们必须监控总线以进行同步传输。如果发生冲突,则每个当前发送方退回以进行随机延迟。设置了64字节的最小值,以便发送设备在完成发送帧之前在数百米长的电缆上发现碰撞。
从Wireshark documentation通过Google搜索“wireshark最小以太网帧”:
以太网数据包(标头+用户数据+ FCS)小于最小64字节的以太网数据包填充为64字节,这意味着如果小于64-( 14 + 4)= 46字节的用户数据,额外的填充数据被添加到数据包中。
注意:通常会提到64字节的最小以太网数据包大小,包括FCS。这可能令人困惑,因为 FCS通常不会被Wireshark显示 ,仅仅因为底层机制根本不提供它。 [...]
顺便说一句,这与C编程语言没有任何关系。