【问题标题】:UDP Networking FundamentalsUDP 网络基础
【发布时间】:2012-12-08 14:03:23
【问题描述】:

我一直在做一些使用 UDP 的 C# 网络工作。我进展顺利,但需要回答几个我在测试时遇到问题的基本问题:

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

我是否理解数据报将在另一端完整接收或根本不接收。 IE 这是一个全有或全无的事情。有没有机会因为丢包而导致数据报碎片化?

因此,我只需要对每个数据报进行 ACK,而不是确保我的数据报

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

感谢您的帮助!

【问题讨论】:

    标签: networking udp


    【解决方案1】:

    不会因为丢包而导致数据报碎片化吗?

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      1. Wireshark UDP analysis
      2. RFC 1122(声明 576 是最小最大重组缓冲区大小)

      【讨论】:

      • 我认为 OP 正在谈论通过 UDP 发送应用程序级 ACK。
      • 是的,我自己发送 ACK 作为数据包号(uint 16)和一组 ack 标志(前 32 个 int32 位掩码中的 ack)
      【解决方案3】:

      我是否理解数据报将在另一端完整接收或根本不接收。 IE 这是一个全有或全无的事情。有没有机会因为丢包而导致数据报碎片化?

      没错。

      因此,我只需要对每个数据报进行 ACK,而不是确保我的数据报

      我不明白这个问题。无论大小如何,您都需要确认每个数据报,并且您应该使它们

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-03
        • 2013-12-03
        • 1970-01-01
        • 2019-08-14
        • 1970-01-01
        • 2013-12-09
        • 2022-12-16
        • 2018-02-02
        相关资源
        最近更新 更多