首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >了解如何可靠地在UDP上发送较大的数据块。

了解如何可靠地在UDP上发送较大的数据块。
EN

Stack Overflow用户
提问于 2013-12-01 16:20:49
回答 2查看 4.5K关注 0票数 3

多年来,我已经在很多事情上使用了TCP,并且对它有很好的理解。我现在有一个使用UDP的要求。

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

在这种情况下,定时(当参数变化时)非常重要,请求更改的客户端与正在实现的更改之间的延迟必须尽可能低。

我曾经是正在做什么 一个 地段 阅读,但我仍然没有“理解”。

有人能证实/否认我的理解吗..。

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

所以..。如果我想从客户机向服务器发送800字节的数据,我需要:

  • 确定由Byte(2)表示的任意“协议”id,该id在客户端和服务器之间很常见,用于过滤不适合我的应用程序的消息。

客户端

  • 创建一个随机消息id
  • 将数据分成两部分,添加消息id和全局序列,以便在另一端重新连接它们。
  • 在内存中的某个地方,根据序列id记录数据。
  • 将它们发送到服务器
  • 如果在给定的时间内未接收到Ack (例如RTT * 3),则重新发送该数据包。

服务器

  • 在模拟循环中,检查(非阻塞)插座上是否有消息.
  • 如果是这样的话,立即将包含ACK的新数据包发送回序列Id (实际上,为了减少Ack数据包丢失,我应该在最后30个接收到的数据包中进行Ack )。
  • 把包保存在内存中,直到我收到第二部分
  • 将两者结合起来并处理有效载荷

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

我情不自禁地感觉到我遗漏了一些东西,也不太明白数据包碎片的含义。有人能澄清/指出更好的资源吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-01 21:11:23

  • 数据报存储在单个数据包中。

不一定。

  • 我能可靠地发送的最大有效载荷是506字节(576 MTU - 60 IP报头-8 UDP报头)

不正确。IP报头是20字节,而不是60字节,所以总报头是28字节。剩下的是576-28=548,但这个数字通常是534.

  • 发送的越多,可能会导致碎片。

是。

  • 碎片不是在较低级别处理的,需要重新组合数据报(不确定这一点--如果它是自动处理的,为什么我会关心碎片?)

不正确。碎片完全在IP级别处理。UDP中的碎片问题是,对于丢失的碎片没有ACK/重传机制,因此一个丢失的碎片意味着整个数据报丢失。您看到的要么是整个UDP数据报,要么什么也没有。

  • 我需要实现我自己的ACK/节流机制

是。在W.R. Stevens中给出了一个简单的ACK/重试方案,Unix网络编程,第一卷。

票数 6
EN

Stack Overflow用户

发布于 2013-12-01 17:15:32

数据报存储在单个数据包中。

不是的。

我能可靠地发送的最大有效载荷是506字节(576 MTU - 60 IP报头-8 UDP报头)

“信实发送”指的是不同层次的事物。

发送的越多,可能会导致碎片。

与事实相吻合。

碎片不是在较低级别处理的,需要重新组合数据报(不确定这一点--如果它是自动处理的,为什么我会关心碎片?)

取决于你所处的水平。在应用程序级别,数据报要么全部接收,要么根本不接收。

子问题:太宽泛了,但听起来你应该用TCP来代替。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20314308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档