3

我一直在做一些使用 UDP 的 C# Networking 工作。我过得很好,但需要回答几个我在测试时遇到问题的基本问题:

  • 目前我正在以约 16000 字节的数据报的形式发送数据,根据wireshark 的说法,它被分成几个 1500 字节的数据包(由于最大数据包大小限制),然后在另一端重新组装。

我是否理解数据报将在另一端完整接收或根本不接收。IE 这是一个全有或全无的事情。由于数据包丢失,没有机会以碎片数据报结束?

因此,我只需要对每个数据报进行 ACK,而不是确保我的数据报小于 1500 字节并且每个都 ACK?

我看过很多地方,但数据报和底层数据包之间的差异似乎有很多混淆......

谢谢你的帮助!

4

3 回答 3

2

由于数据包丢失,没有机会以碎片数据报结束?

我相信这是真的:分片和分片重组是由 UDP 下面的协议层处理的,即它是由“IP”层处理的,如果它无法将数据包碎片重组成数据报(例如,搜索RFC 792中的“片段” )。

http://www.pcvr.nl/tcpip/udp_user.htm#11_5说,

“目的地的 IP 层执行重组。目标是使分段和重组对传输层(TCP 和 UDP)透明,但可能会降低性能。”

于 2012-12-08T14:26:09.780 回答
1

正如您现在可能的 16 位 UDP 长度字段表明您总共可以发送 65535 个字节。但是理论上数据可以是(sizeof(IP Header) + sizeof(UDP Header)) = 65535-(20+8) = 65507字节。

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

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

这些链接可能对您的问题有帮助:

  1. Wireshark UDP分析
  2. RFC 1122 (声明 576 是最小最大重组缓冲区大小)
于 2012-12-08T14:26:20.130 回答
-1

我是否理解数据报将在另一端完整接收或根本不接收。IE 这是一个全有或全无的事情。由于数据包丢失,没有机会以碎片数据报结束?

那是对的。

因此,我只需要对每个数据报进行 ACK,而不是确保我的数据报小于 1500 字节并且每个都 ACK?

我不明白这个问题。无论大小如何,您都需要对每个数据报进行 ACK,并且应该使它们 < 1500 字节,这样它们就不会碎片化。否则,您可能永远无法传输任何特定的数据报,如果它反复分片并且片段反复丢失。

于 2012-12-08T22:58:02.767 回答