滑动窗口
发送方发送数据速率与接收方接收数据速率相匹配。
零窗口问题
定义
TCP报头结构中有16位的窗口大小:由接收方填充, 用来告知发送方当前本端还能接收的数据长度。如果接收方不断从网络中接收并缓存数据,但是应用程序并没有处理缓存的数据。直到最后,接收方就会向发送方发送一个0窗口的报文段。
如何处理?
持续计时器 +零窗口探测报文段
为了解决这个问题,TCP为每一个连接设有一个持续计时器(persistence timer)。只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器。若持续计时器设置的时间到期,就发送一个零窗口探测报文段(仅携带1字节的数据),而对方就在确认这个探测报文段时给出了现在的窗口值。如果窗口仍然是零,那么收到这个报文段的一方就重新设置持续计时器。如果窗口不是零,那么死锁的僵局就可以打破了。
糊涂窗口问题
小窗口问题
定义
接收方每次给发送方通告的窗口大小只有很小的字节数。
如何处理?
要解决这个问题,可以让接收方等待一段时间,使得或者接收缓存已有足够空间容纳一个最长的报文段,或者等到接收缓存已有一半空闲的空间。只要出现这两种情况之一,接收方就发出确认报文,并向发送方通知当前的窗口大小。此外,发送方也不要发送太小的报文段,而是把数据积累成足够大的报文段,或达到接收方缓存的空间的一半大小。
Nagle算法(处理糊涂窗口)
算法内容
在TCP的实现中广泛使用Nagle算法。
算法如下:若发送应用进程把要发送的数据逐个字节地送到TCP的发送缓存,则发送方就把第一个数据字节先发送出去,把后面到达的数据字节都缓存起来。当发送方收到对第一个数据字符的确认后,再把发送缓存中的所有数据组装成一个报文段发送出去,同时继续对随后到达的数据进行缓存。只有在收到对前一个报文段的确认后才继续发送下一个报文段。当数据到达较快而网络速率较慢时,用这样的方法可明显地减少所用的网络带宽。Nagle 算法还规定,当到达的数据已达到发送窗口大小的一半或已达到报文段的最大长度时,就立即发送一个报文段。