在 UDP 中的停止和等待协议中设置超时



在UDP上的stop-and-wait协议中应该如何估计套接字的超时?它可以是往返时间 (RTT) 的任何任意整数倍吗?

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

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

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

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

现在,关于你的问题:

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

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

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

当然,对于设置超时,没有什么比学习TCP如何做更好的了。 http://sgros.blogspot.com/2012/02/calculating-tcp-rto.html

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

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

你可以让它更复杂,并且可以像TCP一样做到这一点。

最新更新