gpt4 book ai didi

.net - 了解如何通过 UDP 可靠地发送更大的数据 block

转载 作者:行者123 更新时间:2023-12-02 07:32:42 26 4
gpt4 key购买 nike

多年来,我在很多事情上都使用过 TCP,并且非常了解它。我现在需要使用 UDP。

短版:服务器允许少量客户端 (5-10) 连接。服务器正在运行模拟。客户应该能够更新模拟参数并查看模拟结果的(子集)。

在这种情况下,时间(参数更改时)很重要,客户端请求更改与实现之间的延迟必须尽可能短。

我一直是doing a lot of reading我仍然没有“明白”。

有人可以确认/否认我的理解吗...

  • 数据报存储在单个数据包中
  • 我可以可靠发送的最大有效负载是 506 字节(576 MTU - 60 IP header - 8 UDP header )
  • 发送过多可能会导致碎片化
  • 碎片不在较低级别处理,需要我重新组合数据报(不确定 - 如果它是自动处理的,我为什么要关心碎片?)
  • 我需要实现自己的 ACK/Throttling 机制

所以...如果我想从客户端向服务器发送(比如说)800 字节的数据,我需要:

  • 确定要使用的任意“协议(protocol)”ID,该 ID 由客户端和服务器之间通用的 Byte(2) 表示,用于过滤掉不适合我的应用的消息。

客户

  • 创建一个随机消息 ID
  • 将数据一分为二,添加消息 id 和全局序列,以便它们可以在另一端重新加入
  • 根据序列 ID 记录内存中某处的数据
  • 将它们发送到服务器
  • 如果在给定的时间跨度(例如 RTT * 3)内未收到 Ack,请重新发送该数据包。

服务器

  • 在模拟循环中,检查(非阻塞)套接字上是否有消息。
  • 如果是这样,立即发回一个包含序列 ID 的 ACK 的新数据包(实际上,为了减少 Ack 数据包丢失,我应该确认最后收到的 30 个左右的数据包)
  • 将数据包存储在内存中,直到我收到第二部分
  • 将两者结合起来处理payload

对于相反方向的消息,我需要完全相反地做同样的事情。

我不禁觉得我遗漏了一些东西,并且不太了解数据包分段的含义。有人可以澄清/指出更好的资源吗?

最佳答案

  • A datagram is stored inside a single packet

不一定。

  • The largest payload I can reliably send is 506 bytes (576 MTU - 60 IP header - 8 UDP header)

不正确。 IP header 是 20 字节,而不是 60,所以总 header 是 28 字节。剩下的就是 576-28=548,但通常是 534。

  • Sending more than that may cause fragmentation

是的。

  • Fragmentation isn't handled at a lower level and would require me to recombine datagrams (Not sure about this - if it's handled automatically, why do I care about fragmentation?)

不正确。分段完全在 IP 级别处理。 UDP中分片的问题是没有针对丢失分片的ACK/重传机制,所以一个丢失的分片就意味着整个数据报都丢失了。您看到的要么是整个 UDP 数据报,要么什么都没有。

  • I need to implement my own ACK/Throttling mechanism

是的。 W.R. Stevens, Unix Network Programming, vol I 中给出了一个简单的 ACK/重试方案。

关于.net - 了解如何通过 UDP 可靠地发送更大的数据 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20314308/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com