TCP/IP详解 卷一 TCP的坚持定时器
发表于:2025-10-22 | 分类: 学习
TCP的坚持定时器

概述

TCP通过让接收方指明希望从发送方接收的数据字节数(即窗口大小)来进行流量控制。如果窗口大小为 0如果窗口大小为 0时,TCP必须能够处理打开此窗口的 ACK丢失的情况。ACK的传输并不可靠,也就是说,TCP不对ACK报文段进行确认,TCP只确认那些包含有数据的ACK报文段。

如果一个确认丢失了,则双方就有可能因为等待对方而使连接终止:接收方等待接收数据(因为它已经向发送方通告了一个非 0的窗口),而发送方在等待允许它继续发送数据的窗口更新。为防止这种死锁情况的发生,发送方使用一个坚持定时器 (persist timer)来周期性地向接收方查询,以便发现窗口是否已增大。这些从发送方发出的报文段称为窗口探查 ( window probe)。

坚持定时器

计算坚持定时器时使用了普通的TCP指数退避。对一个典型的局域网连接,首次超时时间算出来是1.5秒,第2次的超时值增加一倍,为3秒,再下次乘以4为6秒,之后再乘以8为12秒等。坚持定时器总是在 5 ~ 6 0秒之间。

窗口探查包含一个字节的数据。TCP总是允许在关闭连接前发送一个字节的数据。

糊涂窗口综合症

基于窗口的流量控制方案,如TCP所使用的,会导致一种被称为“糊涂窗口综合症SW S(Silly Window Syndrome)”的状况。如果发生这种情况,则少量的数据将通过连接进行交换,而不是满长度的报文段

该现象可发生在两端中的任何一端:接收方可以通告一个小的窗口(而不是一直等到有大的窗口时才通告),而发送方也可以发送少量的数据(而不是等待其他的数据以便发送一个大的报文段)。可以在任何一端采取措施避免出现糊涂窗口综合症的现象。

  1. 接收方不通告小窗口。通常的算法是接收方不通告一个比当前窗口大的窗口(可以为0),除非窗口可以增加一个报文段大小(也就是将要接收的MSS)或者可以增加接收方缓存空间的一半,不论实际有多少。

  2. 发送方避免出现糊涂窗口综合症的措施是只有以下条件之一满足时才发送数据:

    a. 可以发送一个满长度的报文段;

    b. 可以发送至少是接收方通告窗口大小一半的报文段;

    c. 可以发送任何数据并且不希望接收 ACK(也就是说,我们没有还未被确认的数据)或者该连接上不能使用Nagle算法

    条件( b )主要对付那些总是通告小窗口(也许比 1个报文段还小)的主机,条件 ( c )使我们
    在有尚未被确认的数据(正在等待被确认)以及在不能使用 N a g l e算法的情况下,避免发送小
    的报文段。如果应用进程在进行小数据的写操作(例如比该报文段还小),条件( c )可以避免出
    现糊涂窗口综合症。

上一篇:
TCP/IP详解 卷一 TCP的保活定时器
下一篇:
TCP/IP详解 卷一 TCP的超时与重传