如果我在C#中发送0有效载荷数据,UDP数据包的大小是多少?

13

我已经计算出在两个udp端点之间分片前的最大数据量为1472(其他端点可能不同)。这说明MTU为1500字节,每个数据包的头部开销为28字节。如果我发送0字节数据(有效载荷),那么实际传输的数据是28字节吗?由于我正在进行一些基准测试,所以知道通道中发生的情况非常重要。

4个回答

38
  • MTU是指可以在不进行分段的情况下传输的IP数据包的最大大小。

    IPv4要求路径MTU至少为576字节,IPv6至少为1280字节。

    Ethernet的MTU为1500字节。

  • IP数据包由两部分组成:包头和有效数据负载。

    IPv4报头的大小至少为20字节,IPv6报头大小至少为40字节。

    IP数据包的有效负载通常为TCP分段或UDP数据报。

  • UDP数据报由UDP报头和传输的数据组成。

    UDP报头的大小为8字节。

这意味着一个空UDP数据报有效负载的IP数据包至少需要28(IPv4)或48(IPv6)字节,但可能会占用更多字节。

此外,请注意,在以太网中,IP数据包将另外被包装在MAC数据包中(14字节头+4字节CRC),并嵌入在以太网帧(8字节前导序列)中。这增加了26字节的数据到IP数据包中,但不计入MTU。

因此,您不能假设UDP数据报将导致传输特定数量的字节。


2
我有点困惑。您是说即使 MTU 为 1500 字节,实际数据包的数据量也可以超过 1500 字节(+26)吗?如果我不知道实际发送了多少数据,如何进行准确的测量?有没有办法让我知道实际传输了多少数据? - Syaiful Nizam Yahya
1
那么答案是什么? - thang
3
在IPv6下,需要48字节的长度,而在IPv4下,只需要28字节。 - user3064538

9
典型的IP头部为20个字节,如果没有选择选项。UDP头部为8个字节。在以太网上,帧大小为14个字节(标题)+ 4个字节(尾部)。根据您捕获这些数据包的方式,您可能需要或不需要考虑帧大小。
没有以太网(IP + UDP)= 20 + 8 = 28个字节 有以太网= 18 + 28 = 46个字节
C#中的UdpClient类将从第5层返回数据包,因此您无需考虑上述内容。
更新: 1500字节MTU在IP层强制执行。这意味着分片时IP层下方的数据包大小是不重要的。
这可以翻译为: 以太网帧字节(固定)= 18 IP头(最小)= 20 UDP头(固定)= 8 无需分段的最大允许有效载荷= 1472 上线的总字节数=(以上总和)1518个字节 (您可以使用Wireshark等工具计算离开的字节数)
如果(IP头+ UDP头+有效载荷> 1500),则数据包将被分段。

所以你的意思是没有以太网时,头部将为28字节,最大有效载荷为1472,而有以太网时,头部为46字节,最大有效载荷为1454。我用的方法是将UDPClient的dontfragment标志设置为true,并发送1500有效载荷大小的数据。如果数据被分段,C#会抛出异常,我会减小有效载荷大小,直到不再抛出异常。这样可以吗? - Syaiful Nizam Yahya
1
有没有办法在C#中确定用户之间的终端是否正在使用以太网,或者是否使用以太网帧字节(固定)?可以安全地假设所有连接到互联网的人都在使用以太网吗?从维基百科的以太网定义来看,它被描述为局域网设备。 - Syaiful Nizam Yahya
发送没有有效载荷的数据包,以太网的总数据流量是否为46字节?这样说安全吗? - Syaiful Nizam Yahya
是的,两者都应该没问题。不过我建议使用Wireshark进行验证。 - AK.
1
一些来源(例如维基百科)称,在IPv4 UDP头中使用“校验和”和“源端口”字段是可选的。那么这是否意味着,如果我想关闭这两个字段,我可以从UDP头大小中节省4个字节? - Dainius Kreivys
显示剩余2条评论

8
可以安全地假设,如果我发送0字节数据(有效载荷),实际传输的数据是28字节吗?

不可以

(也许吧...因为它通常没有真正的区别,因此是“安全”的)
虽然没有负载的UDP / IPv4数据报确实是28个字节(或网络术语中的“八位组”),但这绝不是一个安全的假设。 然而,在大多数情况下,这并不重要。交换机和路由器通常以与较大数据包完全相同的速度转发小数据包(或者差异微不足道)。唯一可能看到差异的场合是在您的带宽账单上(您支付线上所有比特,而不仅仅是使用的那些!)。
IPv4可能会附加高达40个八位组的“选项”,IPv4可能会被封装在IPv6中(甚至您都不知道)。两者都可以显着增加数据报的大小,从而以相当明显的方式传输数据。
此外,数据报将在链路层进一步封装,同时添加前导码和标头数据,并具有最小帧长度。存在额外标题再次是非常明显的,除了最大大小之外,有效载荷还具有最小大小的事实是一个不太知名的事实。
以太网和ATM是两种广泛使用的标准,在这里您的假设可能会受到影响(但其他链路层类似)。
以太网帧的最小大小为64字节,并将其填充到此大小。在存在802.1Q(VLAN)的情况下,以太网帧的最小有效载荷为42个八位组,否则为46个八位组。因此,在“普通”以太网上发送零长度UDP / IPv4数据报将附加18个零字节到有效载荷中。您永远看不到它们,但它们存在并且将出现在您的账单上。
同样,ATM单元(与“帧”相同,由于某种原因它们使用不同的单词)始终为53个字节,其中包括48个填充为零的有效载荷字节。因此,零有效负载UDP图表将导致添加20个零字节,而零长度UDP / IPv6数据报将保持其原始大小(确保没有其他封装,如PPPoE之类)。
最后,请注意,可能需要发送和接收其他数据包才能完全发送您的数据包。例如,您的以太网卡可能必须执行ARP(或NDP)才能发送数据报。缓存结果分摊了这一点,因为您正在发送多个数据报,但如果您只发送一个UDP数据报,则可能会惊讶地发现,与您可能天真地期望的相比,发送和接收了约三倍的“数据”。

1

1
我确实查看了UDP维基,但说实话,我不知道该寻找什么。我也不太理解。顺便问一下,我如何测量以太网开销? - Syaiful Nizam Yahya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接