在UDP中设置Stop-and-Wait协议中的超时

时间:2017-03-18 06:24:52

标签: python sockets network-programming udp

如何通过UDP在{{​​1}}协议中估计套接字的超时?它可以是往返时间(RTT)的任意整数倍吗?

2 个答案:

答案 0 :(得分:0)

理想情况下,您希望超时等于从发送数据包的那一刻起直到您收到另一方确认的那一刻 - 这几乎就是RTT。

但是提前知道确切的理想超时几乎是不可能的,所以我们必须猜测。让我们考虑如果我们猜错会发生什么。

如果我们使用恰好低于实际RTT的超时,我们将在ack有时间到达之前超时。这被称为过早超时,它很糟糕 - 即使传输成功,我们也会重新传输数据包。

如果我们使用恰好高于实际RTT的超时,则需要更长的时间来识别和重新传输丢失的数据包。这也很糟糕 - 我们可以提前识别丢失的数据包并重新传输它。

现在,关于你的问题:

  

它可以是往返时间的任意整数倍   (RTT)?

首先,答案是。你可以使用任何正整数,从1到基本无穷大。而且,你甚至不必使用整数,x2.5的乘数有什么问题?

但重要的是要了解不同乘数会发生什么。如果选择一个低乘数(如1),则会遇到相当多的过早超时。如果您选择一个较大的数字(例如100),则会有很多延迟超时,这将导致您的传输长时间停止。

答案 1 :(得分:0)

当然,设置超时并不比学习TCP的方式更好。 http://sgros.blogspot.com/2012/02/calculating-tcp-rto.html

一开始你必须以任意超时开始,它必须足够高。说3秒。对于大多数通信来说,这应该足够了,因为在大多数情况下,其他部分的响应速度要快然后根据测量的往返时间,动态更改重传超时。例如,一个简单的算法,您可以将超时设置为2 * RTT,如果您有超时,则会在收到响应之前以指数方式增加重新传输超时。当您收到回复时,您会再次将新超时计算到新的2 * RTT。

动态计算,您的协议将能够适应不同类型的网络和不同的地理位置和情况。

你可以使它变得更复杂,并且可以像TCP那样做。