TCP超时,持续多久?

网络工程 通讯协议
2021-07-19 15:25:40

我有一个关于 TCP 超时的问题。如果我们看这张图http://www.dcs.bbk.ac.uk/~ptw/teaching/IWT/transport-layer/timeout.gif

我们可以看到,当发生丢包时超时就开始了,但是超时是多长时间呢?是在特定的数据包被传送和确认之前还是什么时候?

澄清一下,我不是在问任何具体的时间。我只是问什么表明 TCP 超时已完成。

4个回答

简短回答:基本上超时是由现在被认为丢失的数据包的重传来指示的。

长答案: TCP 堆栈发送组件发送字节流。发送窗口是当前正在传输的字节序列号的范围。发送第一个字节(序列号:x)时,将启动一个具有默认超时时间的计时器。当超时结束时,我们重新传输。如果字节 y 有 ACK 且 y >= x,则定时器被重置,我们正在等待 y+1 的 ACK。接受大于等于 x 的所有内容的原因是由于 TCP 中的 ACK 是累积性的(“确认包括提到的数字在内的所有内容”)与选择性(“仅确认提到的数字”)相反。

TCP 超时没有特定的结束时间。当它超时时,会话就死了。它不会在特定时间段内“保持死亡”。

超时结束的指示是没有收到启动计时器的数据包的 ACK。

TCP 使用接收方发送的 ACK 消息让发送方知道数据包已正确接收。

所以基本上,如果消息的一部分字节没有被确认,那么计时器将到期并导致超时。

您可以在此处阅读有关可靠传输、错误检测和选择性确认部分的更多信息

我们可以看到,当发生丢包时超时就开始了,但是超时是多长时间呢?是在特定的数据包被传送和确认之前还是什么时候?

错误的。仔细查看图片,您将看到超时开始的时间恰好是数据包正在传输时,而不是在数据包丢失时。

节点不知道数据包丢失的时间(这是不可能的)。在此之前,我将解释什么是超时。当一个节点正在向另一个节点发送数据包时(例如,使用 TCP),发送者节点会为要回复的数据包设置一个计时器。这称为超时。如果对数据包的回复没有在超时时间内到达,则发送方节点将假定发生了数据包丢失。这将导致发送方节点重新发送/重新传输数据包。

所以超时是发送方节点在重传数据包之前从目的节点收到回复的时间限制。

我只是问什么表明 TCP 超时已完成。

但是,您可以确定它何时“完成”,或者更准确地说,在达到计时器/超时后发件人会做什么。如前所述,当发送方决定重新传输数据包时,它表示已达到超时(或您所谓的“超时已完成”)。