TCP的重传规则是什么?

58
TCP的维基百科文章表明,传输TCP数据段的IP数据包有时可能会丢失,而TCP“请求重传丢失的数据”。

请求重传丢失数据的规则是什么?重新传输请求的执行时间频率是多少?请求数量是否有上限?客户端是否有功能指示服务器忘记整个TCP数据段,即当IP数据包丢失部分时?


通常情况下,重传时间=往返时间*某个常数,以及对于“syn”数据包的固定延迟(这相当悲观)。 - John Dvorak
2个回答

59

请求重新传输丢失数据的规则是什么?

接收方不会请求重新传输。发送方等待客户端发送的字节范围的ACK,如果没有收到,则在特定间隔后重新发送数据包。

这就是ARQ(自动重复请求)。有几种实现方式。

Stop-and-wait ARQ
Go-Back-N ARQ
Selective Repeat ARQ

详细内容请参考RFC 3366.

重传请求的时间频率是多少?

标准并未规定重传次数和尝试次数,这在不同的操作系统上实现方式也不相同,但方法是固定的。(也许这是指识别操作系统的一种方式?)

超时时间是以往返时间(RTT)为单位计量的。但由于快速重传触发条件是收到3个重复确认(ACK) ,因此通常不需要使用这个。

是否有上限?

有的。若经过多次重试后,主机被视为“失效”,发送方将放弃并关闭TCP连接。

客户端是否具有指示服务器在IP数据包丢失时忘记整个TCP段落的功能?

整个目的是保证可靠的通信。如果希望客户端忘记某些部分,最开始就不应该使用TCP。(也许应该使用UDP?)


1
RFC 33366是一个链路层(第二层)文档。它与OP在这里提出的TCP问题有何关联? - Penghe Geng

16

没有固定的重传时间。简单的实现方式是估计RTT(往返时间),如果在2倍该时间内未收到ACK以发送数据,则重新发送。

然后,如果再次没有回复,等待时间会加倍,再次重新发送。洗涤。重复。

更复杂的系统会更好地估计ACK应该需要多长时间,并猜测确切丢失了哪些数据。

归根结底,没有硬性规定何时进行重传。这取决于具体实现。 所有重传都是基于接收方缺乏响应而由发送方触发的。

TCP从不丢失数据,因此无法指示服务器忘记某个段落。


“猜测到底丢失了哪些数据”并不适用于SACK(选择性确认)。我希望你不是指SACK。 - John Dvorak
当接收方接收到一个乱序的数据段时,它可以重新确认之前的数据。这提示发送方有一些但不是所有待处理的数据包已经丢失,因此发送方可以选择只重传其传出窗口中的子集(从而导致较小的网络数据包和更少的总带宽使用),而不是发送一个包括以后发送的数据的更大的数据包(在多个数据包丢失的情况下,否则会降低延迟和发送的数据包数量)。这并不确定,所以我们称之为“有根据的猜测”。 - Brian White
1
请查看SACK。它是一种附加头,告诉发送方接收方具有什么。我相信几乎所有现代TCP堆栈现在都实现了SACK。 - John Dvorak
是的,有很多TCP扩展可以帮助。我的大部分工作都是在微型嵌入式系统上进行基本实现(没有任何扩展)。 - Brian White
如果连接“断开”,那么它就是断开的。在这种情况下,客户端看到的流的结束可能在任何地方。但只要连接“建立”,就不会丢失任何数据。请参阅 https://dev59.com/TWcs5IYBdhLWcg3wJgtV#13087392。 - Brian White
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接