如果我在 C# 中发送 0 有效载荷数据,udp 数据包的大小是多少?
Posted
技术标签:
【中文标题】如果我在 C# 中发送 0 有效载荷数据,udp 数据包的大小是多少?【英文标题】:What is the size of udp packets if I send 0 payload data in c#? 【发布时间】:2011-05-12 05:43:48 【问题描述】:我已经计算出使用 udp 的 2 个端点之间的分段之前的最大数据是 1472(其他端点可能会有所不同)。这表明 mtu 为 1500 字节,每个数据包的标头开销为 28 字节。假设如果我发送 0 字节数据(有效负载),实际传输的数据是 28 字节,是否安全?我正在做一些基准测试,因此了解频道中发生了什么对我来说至关重要。
【问题讨论】:
【参考方案1】:MTU 是可以在不分片的情况下传输的 IP 数据包的最大大小。
IPv4 要求路径 MTU 至少为 576 字节,IPv6 至少为 1280 字节。
以太网的 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)中,该 MAC 数据包将嵌入以太网帧(8 字节前导序列)中。这会将 26 字节的数据添加到 IP 数据包,但不计入 MTU。
因此您不能假设 UDP 数据报会导致传输特定数量的字节。
【讨论】:
我有点困惑。你是说即使mtu有1500bytes,实际的数据包数据也可以超过1500bytes(+26)?如果我不知道实际发送了多少数据,如何进行准确测量?有什么办法让我知道实际传输了多少数据? 那么答案是什么? @thang IPv6 上 48 字节或 IPv4 上 28 字节。【参考方案2】:如果未选择任何选项,典型的 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 header + UDP header + Payload > 1500) 则数据包被分片。
【讨论】:
所以你的意思是没有 ehternet 的报头将是 28 字节,导致最大有效负载 1472,而使用以太网,报头是 46 字节,导致最大有效负载 1454。我用来获取最大负载的方法是将 udpclient 的 dontfragment 标志设置为 true 并发送数据,说明负载大小为 1500。如果数据将被碎片化,c# 将触发异常,并且我会减小有效负载大小,直到没有触发异常。这样可以吗? 最大。您可以发送 1472,无论在 IP 层下面做了什么。更新了答案。 有没有办法确定端点之间的用户是在 c# 中使用以太网还是使用以太网帧字节(固定)?假设所有连接到互联网的人都在使用以太网(人,而不是使用光纤通道的组织等)是否安全?查看以太网的 wiki 定义,它被描述为 lan 设备。 可以肯定地说,如果我发送具有 1472 字节有效负载的数据包,通过以太网通道的总数据流为 1518?谢谢。 是否可以肯定地说,如果我发送 0 字节有效负载的数据包,通过以太网的总数据流为 46 字节?【参考方案3】:是否可以假设如果我发送 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 数据报将保持其原始大小(大小正好为 48 个字节),假设中间没有其他封装,例如 PPPoE。
最后,请注意,可能需要发送和接收额外的数据包才能发送您的数据包。例如,您的以太网卡可能必须执行 ARP(或 NDP)才能发送您的数据报。当您发送多个数据报时,缓存结果可以摊销这一点,但如果您只发送 一个 UPD 数据报,您可能会惊讶地发现,发送和接收的“数据”数量是您可能发送和接收的数据的三倍天真地期待。
【讨论】:
【参考方案4】:IP 开销是 20 字节,UDP 是 8 字节,所以是的,28 字节。
http://en.wikipedia.org/wiki/User_Datagram_Protocol
如果您正在进行内部测试,请不要忘记以太网开销
【讨论】:
我确实看过 udp wiki,但老实说,我真的不知道该寻找什么。我也不太明白。顺便问一下,我如何测量这个以太网开销?以上是关于如果我在 C# 中发送 0 有效载荷数据,udp 数据包的大小是多少?的主要内容,如果未能解决你的问题,请参考以下文章