我正在尝试学习UDP,并制作一个简单的文件传输服务器和客户端。 我知道TCP可能会更好,因为它内置了一些可靠性。但是我想自己实现一些基本的可靠性代码。
我决定尝试识别数据包何时丢失,然后重新发送。
我实现的是一个系统,服务器将以10个字节的块为客户端发送某个文件。在发送每个块之后,它等待确认。如果它在几秒钟内没有收到,它会再次发送块。
我的问题是如何快速完成这样的文件传输?如果你发送一个文件,让我们说他们有25%的可能性丢失一个数据包,那么就会有很多时间等待ACK。
有什么方法可以解决这个问题吗?或者是否接受高丢包率,需要很长时间?确认接受的超时值是什么?
谢谢!
答案 0 :(得分:4)
您的帖子中有很多问题,我会尝试解决一些问题。主要是基准测试并找到瓶颈。 什么是最慢的操作?
我现在可以告诉你,你的方法中的瓶颈是在每个块之后等待ACK。您需要确认序列,而不是确认块。第二大问题是可怜的小块。在那个大小上,开销比实际数据更多(查找IP和UDP的标头大小)。
总结:
我实现的是服务器将发送的系统 客户端一个10字节块的特定文件。
您可能想尝试几百个字节块。
在发送每个块之后,它等待确认。
在要求确认之前发送更多数据块,并标记它们。有多种方式:
答案 1 :(得分:2)
您实施的是Stop-and-wait ARQ。在高延迟网络中,它将不可避免地比其他更复杂的选项慢,因为它会在每次传输时等待一个完整的周期。
有关其他可能性,请参阅Sliding Window并按照其他变体的链接进行操作。你所拥有的基本上是一个窗口大小为1的退化形式的滑动窗口。
正如其他答案所指出的,这将涉及向您的数据包添加序列号,在等待确认时发送其他数据包,以及重新传输更复杂的模式。
如果你这样做,你实际上是在重新发明TCP,它使用这些策略提供可靠的连接。
答案 2 :(得分:1)
您需要某种数据包编号,以便客户端可以通过接收数据包序列中丢失的数字来检测丢失的数据包。然后客户端可以请求重新发送它知道丢失的数据包。
示例:
服务器将数据包1,2,3,4,5发送到客户端。客户收到1,4,5,因此知道2和3人丢失了。所以客户端确认1,4和5并请求重新发送2和3。
然后你仍然需要弄清楚如何处理重新发送的acks /请求等。在任何情况下,为数据包分配一系列连续数字,以便通过序列中的“间隙”检测到丢包是对这个问题的体面态度。
答案 3 :(得分:0)
您的问题确切地描述了TCP尝试回答的一个问题。 TCP的答案特别优雅和简约,imo,所以阅读TCP的英文描述可能会奖励你。
只是为了让您了解现实世界中的UDP:SNMP是一种网络管理协议,旨在通过UDP运行。管理员发送到受管节点的SNMP请求(大约1500个有效负载字节)永远不会被明确确认,并且运行良好。百分之二十五的数据包丢失是一个巨大的数字 - 真实的数据包丢失是一个数量级的更小,最坏的情况 - 并且,在破碎的环境中,SNMP根本不会工作。当然,操作网络管理系统的人--NMS--将非常快速地通过电话获得网络硬件支持。
当我们使用SNMP时,我们通常理解超时的良好值是三或四秒,这意味着托管网络节点中的SNMP代理可能已经完成了它的工作。
HTH
答案 4 :(得分:0)
查看TFTP protocol。它是一种基于UDP的文件传输协议,内置了ack / resend规定。