UDP网络基础知识

3

我一直在使用UDP进行C#网络编程。虽然进展顺利,但我仍需要回答几个基本问题,其中有些问题测试时遇到了麻烦:

  • 目前,我正在发送大约16000字节的数据报,而wireshark显示该数据报被分成数个1500字节的数据包(因为最大分组大小限制),然后在另一端重新组装。

我的理解是否正确:数据报将完整接收到另一端,否则就不会接收任何部分。也就是说,不存在由于数据包丢失而出现碎片化数据报的可能性吗?

因此,我只需针对每个数据报进行ACK,而不是确保我的数据报< 1500字节并ACK每个数据报?

我已经看了很多地方,但似乎存在很多混淆数据报和底层数据包之间的区别的情况...

谢谢您的帮助!

3个回答

2
“由于数据包丢失而导致分片数据报的情况不可能发生吗?”我相信这是正确的:分片和分片重组是由UDP下面的协议层处理的,也就是由“IP”层处理的,如果它无法将数据包片段重新组装成数据报,则会出现错误(例如,在RFC 792中搜索“fragment”)。http://www.pcvr.nl/tcpip/udp_user.htm#11_5说:“目标是使分片和重组对传输层(TCP和UDP)透明,除了可能的性能降级。”

1

正如您所知,16位UDP长度字段表示您可以发送总共65535字节的数据。然而,理论上数据可以是(sizeof(IP Header) + sizeof(UDP Header)) = 65535-(20+8) = 65507字节。

但这并不意味着所有使用UDP的应用程序都会发送这么多的数据,例如DNS数据包限制为512字节。这是因为您无法从服务器获得任何ACK数据包。这是数据包在网络中丢失的原因之一(数据包传输问题和丢失)。其次,中间节点可能会将数据报封装在另一个协议中,例如IPSEC或其他协议。

对于UDP来说,没有ACK数据包,因此如果底层应用程序使用UDP,则不应看到任何ACK数据包。其次,一些服务器根据应用程序限制其大小,使得如果您从客户端向服务器传输数据,则应该在wireshark中看到相同的字节数,例如512字节。大多数情况下,源发出请求,目标发送X字节的UDP数据报回来。

以下链接可能对您的问题有帮助:

  1. Wireshark UDP分析
  2. RFC 1122(规定576是最小的最大重组缓冲区大小)

1
我认为OP是在谈论通过UDP发送应用层ACK。 - ChrisW
是的,我正在将ACK作为数据包编号(uint 16)和一组ACK标志(前32个ACK的int32位掩码)发送。 - Chris Bampton

-1
我理解的是数据报文在另一端要么完整接收,要么完全不接收。也就是说,这是一个全有或全无的事情。由于数据包丢失而导致数据报文分段的可能性不存在,我的理解正确吗?
是的,你理解得没错。
因此,我只需要针对每个数据报文进行确认,而不必确保我的数据报文小于1500字节并确认每个数据报文吗?
我不理解这个问题。无论大小如何,您都需要确认每个数据报文,并且您应该使它们小于1500字节,以便它们不会被分段。否则,如果重复分段并且某个片段重复丢失,您可能永远无法传输任何特定的数据报文。

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