一、简介
TCP不对ACK报文段进行确认,TCP只确认那些包含有数据的ACK字段。
如果一个确认丢失了,双方就有可能因为等待对方而使得链连接终止:
- 接收方等待接受数据,因为已经向发送方通告了一个非0的窗口。
- 发送方在等待允许它继续发送数据的窗口更新。
为了防止这种死锁,发送方使用一个坚持定时器来周期性向接收方查询,以便发现窗口是否已经增大。
坚持定时器使用了普通的TCP指数退避。对于典型局域网连接,间隔为\(1.5s\to 3.0s \to s ...\)
TCP从不放弃发送窗口探查。这些探查每隔60s发送一次,直到窗口被打开或者应用进程使用的连接被终止。
二、糊涂窗口综合征 (Silly Window Syndrome)
指的是少量的数据通过连接交换,而不是满长度的报文段。
例如,接收方通告一个小的窗口,而不是一直等到有大的窗口时才通告。发送方也可以发送少量的数据,而不是等待其他的数据以便发送一个大的报文段。
可以在接收或发送端采取措施避免“糊涂窗口综合征”。
- 接收方不通告小窗口。
接收方不通告一个比当前窗口大的窗口,除非窗口可以增加一个报文段大小或可以增加接收方缓存空间的一半。 - 发送方满足下面条件之一时才发送数据:
- 可以发送一个满长度的报文段
- 可以发送至少是接收方通告窗口大小一半的报文段
- 可以发送任何数据并且不希望接收ACK(我们没有还未被确认的数据)或者改连接上不能使用Nagle算法。