(20)TCP的成块数据流
一、简介
TFTP使用了停止等待协议。数据发送方在发送下一个数据块之前需要等待接收对已发送数据的确认。TCP所使用的被称为滑动窗口协议的另一种形式的流量控制方法,该协议允许发送方在停止并等待确认前可以发送多个分组。由于发送方不必每发一个分组就停下来等待确认,因此该协议可以加速数据的传输。
二、滑动窗口
滑动窗口本质上是描述接受方的TCP数据报缓冲区大小的数据,发送方根据这个数据来计算自己最多能发送多长的数据。如果发送方收到接受方的窗口大小为0的TCP数据报,那么发送方将停止发送数据,等到接受方发送窗口大小不为0的数据报的到来。
关于滑动窗口协议,书上还介绍了三个术语,分别是:
窗口合拢:当窗口从左边向右边靠近的时候,这种现象发生在数据被发送和确认的时候。
窗口张开:当窗口的右边沿向右边移动的时候,这种现象发生在接受端处理了数据以后。
窗口收缩:当窗口的右边沿向左边移动的时候,这种现象不常发生。
三、慢启动
上面的策略用于局域网内传输还可以,但是用在广域网中就可能会出现问题,最大的问题就是当传输时出现了瓶颈(比如说一定要经过一个slip 低速链路)所产生的大量数据堵塞问题(拥塞),为了解决这个问题,TCP发送方需要确认连接双方的线路的数据最大吞吐量是多少。这就是所谓的拥塞窗口。
TCP支持一种被称为“慢启动(slow start)”的算法,该算法通过观察到新分组进入网络的速率应该与另一端返回确认的速率相同而工作。慢启动为发送方TCP增加了另一个窗口:拥塞窗口,当与另一个网络的主机建立TCP连接时,拥塞窗口被初始化为1个报文段。每收到一个ACK,拥塞窗口就增加一个报文段,发送方取拥塞窗口与通告窗口中的最小值作为发送上限,拥塞窗口时发送方使用的流量控制,而通知窗口则是接收方使用的流量控制。
简单的说,拥塞窗口的原理很简单:
1、TCP发送方首先发送一个数据报,然后等待对方的回应;
2、得到回应后就把这个窗口的大小加倍,然后连续发送两个数据报;
3、等到对方回应以后,再把这个窗口加倍,发送更多的数据报;
4、直到出现超时错误。
这样,发送端就了解到了通信双方的线路承载能力,也就确定了拥塞窗口的大小,发送方就用这个拥塞窗口的大小发送数据。要观察这个现象是非常容易的,我们一般在下载数据的时候,速度都是慢慢“冲起来的”。
四、紧急方式
TCP提供紧急方式(urgent mode),它使一端可以告诉另一端有些具有某种方式的“紧急数据”已经放置在了普通的数据流中。另一端被通知这个紧急数据已经被放置在普通数据流中,由接收方决定如何处理。一般TCP首部中URG被置为1,且16bit的紧急指针被置为一个正的偏移量,该偏移量必须与TCP首部的序号字段相加,以便得到紧急数据的最后一个字节的序号。