在TCP传输中,是通过让接收方指明希望从发送方接收的数据字节数(即通告窗口的大小)来进行流量控制的。当窗口大小为0时将能有效地阻止发送方传送数据,直到窗口变为非0为止。
通常情况下,我们之所以说TCP是一种可靠的传输方式,那是因为它对所接收到的数据报文段都会发送一个ACK确认报文。但ACK的传输却是不可靠的,也就是说,TCP不对ACK报文段进行确认,而只对那些包含有数据的报文段进行确认。
如果一个确认丢失了,则双方就有可能因为等待对方而使连接终止:接收方等待接收数据(因为它已经向发送方通过了一个非0的窗口),而发送方在等待允许它继续发送数据的窗口更新。为了防止这种死锁情况的发生,发送方使用一个坚持定时器(persist timer)来周期性地向接收方查询,以便发现窗口是否已增大。这些从发送方发出的报文段就称为窗口探查。
计算坚持定时器时采用了普通的TCP指数退避算法。比如对一个典型的局域网连接,首次超时时间算出来是1.5秒,那么第二次的超时时间值就增加一倍,为3秒,再下次就为6秒等。但是坚持定时器总是在5到60秒之间。
窗口探查包含一个字节的数据。TCP总是允许在关闭连接前发送一个字节的数据。不过所返回的窗口为0的ACK并不是确认该字节,而是确认了包括上一个序号在内的所有数据,因此这个字节被持续重传。
坚持状态和重传超时之间一个不同的特定就是TCP从不放弃发送窗口探查。这些探查每隔60秒发送一次,这个过程将持续到窗口被打开或者应用进程使用d连接被终止。
参考资料:《TCP/IP详解卷一》第22章--TCP的坚持定时器。
通常情况下,我们之所以说TCP是一种可靠的传输方式,那是因为它对所接收到的数据报文段都会发送一个ACK确认报文。但ACK的传输却是不可靠的,也就是说,TCP不对ACK报文段进行确认,而只对那些包含有数据的报文段进行确认。
如果一个确认丢失了,则双方就有可能因为等待对方而使连接终止:接收方等待接收数据(因为它已经向发送方通过了一个非0的窗口),而发送方在等待允许它继续发送数据的窗口更新。为了防止这种死锁情况的发生,发送方使用一个坚持定时器(persist timer)来周期性地向接收方查询,以便发现窗口是否已增大。这些从发送方发出的报文段就称为窗口探查。
计算坚持定时器时采用了普通的TCP指数退避算法。比如对一个典型的局域网连接,首次超时时间算出来是1.5秒,那么第二次的超时时间值就增加一倍,为3秒,再下次就为6秒等。但是坚持定时器总是在5到60秒之间。
窗口探查包含一个字节的数据。TCP总是允许在关闭连接前发送一个字节的数据。不过所返回的窗口为0的ACK并不是确认该字节,而是确认了包括上一个序号在内的所有数据,因此这个字节被持续重传。
坚持状态和重传超时之间一个不同的特定就是TCP从不放弃发送窗口探查。这些探查每隔60秒发送一次,这个过程将持续到窗口被打开或者应用进程使用d连接被终止。
参考资料:《TCP/IP详解卷一》第22章--TCP的坚持定时器。