通过在前面的文章《TCP的交互数据流》我们可以知道,TCP的成块数据流是在要求传输效率较高的情况下使用的,例如FTP。对于这些要求传输TCP最长报文段的应用,TCP协议采用了滑动窗口协议,使发送端在等待确认前可以连续发送多个分组。
一般来说,发送端发送一个TCP数据报,则接收端就应该发送一个ACK数据报。但在实际应用中却并非如此,而是发送端将连续发送数据报保存在接收端的缓冲区中,并且尽量使其填满,接收端对这些连续发送的数据报只发送一个ACK报文应答,这就是ACK的累计特性,这个特性大大减少了发送端和接收端的负担。
1.滑动窗口
滑动窗口的滑动是以字节为单位的,窗口是在建立TCP连接时,通信双方协商好的接收端的窗口。窗口大小本质上是发送端在等待确认之前所发送数据的最大值。如果发送端收到接收端的窗口大小为0的TCP数据报,则表示发送端将停止发送数据,等到接收端发送窗口不为0的数据报的到来。
以下是窗口协议中窗口变化的三种情况:
1. 窗口合拢:即窗口 左边沿 向 右边沿 靠近。这种现象发生在数据被发送和确认时;
2.窗口张开:即窗口 右边沿 向右移动,此时将允许发送更多的数据。这种现象一般发生在另一端的接收进程读取已经确认的数据并释放TCP的接收缓存时;
3.窗口收缩:即窗口 右边沿 向左移动。一般不建议出现这种现象。
注意:窗口的左边沿受另一端发送的确认序号的控制,因此不能向左移动。如果接收到一个指示窗口左边沿向左移动的ACK,则它被认为是一个重复ACK,并被丢弃。
在滑动窗口中,发送端只能发送窗口内的数据,并且数据的发送顺序是从左到右。当窗口的左边沿达到右边沿时,则被成为一个零窗口,表示发送端不能发送任何数据。
2.慢启动
为了防止网络阻塞,TCP采用了一种慢启动算法,对发送数据量进行控制。为了调节发送端的数据发送量,引入了阻塞窗口,在慢启动时,将这个阻塞窗口设为1个报文段发送数据,之后每收到一次确认应答,阻塞窗口的值就加一个报文段。在发送数据包时,将阻塞窗口的大小与接收端主机通知的窗口大小进行比较,然后选择较小的值来控制数据量的发送。阻塞窗口是发送端使用的流量控制,而通告窗口则是接收端使用的流量控制。
3.紧急方式
TCP的 紧急方式 ,它使一端可以告诉另一端有些具有某种方式的 紧急数据 已经放置在普通数据流中。另一端被通告这个 紧急数据 已被放置在普通的数据流中,由接收方决定如何处理。然而 紧急数据 并不是 带外数据 。TCP的紧急方式只是一个从发送方到接收方的通知,该通知告诉接收方 紧急数据 已被发送,并提供该数据最后一个字节的序号,由接收方决定如何处理。应用程序使用的有关 紧急数据 部分的编程接口都不是最佳的,从而导致更多混乱。