【问题标题】:Only 16 UDP 512 byte packets being received by server when I sent 7mb total当我总共发送 7mb 时,服务器只接收到 16 个 UDP 512 字节数据包
【发布时间】:2013-02-09 17:29:19
【问题描述】:

我将一个 7mb 的文件分成 512b 个块,然后使用 udp 将其发送到服务器。客户端发送了大约 14000 个数据包,但在服务器端 socket.receive(packet) 仅收到 16 个数据包后阻塞。

有什么想法吗?

【问题讨论】:

  • 中间的网络设备丢弃它们。
  • @nos:将我的帖子编辑为 512 字节。我将数据包发送到本地主机,为什么我的机器在前 16 个数据包之后丢弃所有内容?
  • 1.发布您的代码。 2. 在发射器端添加一个 sleep(100) 以减慢速度(仅用于测试目的)
  • 我添加了一个 3ms 的睡眠,现在所有的数据包都通过了。

标签: java network-programming udp packet


【解决方案1】:

UDP 被定义为不可靠的协议。数据包可能会丢失,并且不会通知发送者。它们也可能乱序到达,甚至重复到达。

UDP 适用于不需要错误检查和纠正或由应用程序本身执行的用途。

如果您想要一个可靠的协议,请开始使用 TCP。

【讨论】:

  • 我知道 UDP 和 TCP 是如何工作的,我使用 UDP 作为学习练习。数据包可能会丢失,但为什么只有 1400+ 个数据包中的前 16 个数据包被发送。每次只有前 16 个数据包到达服务器。
  • @csss 如果你将一堆数据包全速扔向一台机器,而服务器程序没有反应并足够快地读取它们,则套接字队列将填满(所需要的只是操作系统决定安排一些其他进程一段时间来填充套接字队列)并且随后的数据包被丢弃。即您需要流量控制,而 UDP 没有给您。当然,您的客户端和/或服务器中也可能存在错误
【解决方案2】:

与 TCP 相比,UDP 既不保证数据包顺序也不保证实际传送(没有 TCP 中的流量控制)。看到这个问题:ensuring packet order in UDP

【讨论】:

  • 请注意,流量控制与(保证)交付不同。
  • 不一样。但是如果没有流控的基本机制,基于序列号的NACK消息也不能确定地被发回。必须实现另一种处理丢失和乱序问题的算法,这可能不值得仅仅以单播方式传输文件,而 TCP 可能是正确的选择。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-03
  • 2012-05-20
  • 2015-07-13
  • 1970-01-01
  • 2015-08-14
  • 2022-08-11
相关资源
最近更新 更多