TCP-IP详解之TCP的成块数据流3
TCP的成块数据流章节目录
1.正常数据流
2.滑动窗口
3.窗口大小
4.PUSH标志
5.慢启动
6.成块数据的吞吐量
7.紧急方式
前言
T C P所使用的被称为滑动窗口协议的另一种形式的流量控制方法。该协议允许发送方在停止并等待确认前可以连续发送多个分组。由于发送方不必每发一个分组就停下来等待确认,因此该协议可以加速数据的传输。
正常数据流
该命令指示客户向网络发送8个1 0 2 4字节的数据。图2 0 - 1显示了这个过程的时间系列。我们在输出的前3个报文段中显示了每一端M S S的值。
发送方首先传送3个数据报文段(4 ~ 6) 。下一个报文段(7)仅确认了前两个数据报文段,这可以从其确认序号为2 0 4 8而不是3 0 7 3看出来。
报文段7的A C K的序号之所以是2 0 4 8而不是3 0 7 3是由以下原因造成的: 当一个分组到达时,它首先被设备中断例程进行处理,然后放置到 I P的输入队列中。三个报文段4、5和6依次到达并按接收顺序放到 I P的输入队列。I P将按同样顺序将它们交给 T C P。当T C P处理报文段4时,该连接被标记为产生一个经受时延的确认。 T C P处理下一报文段(5) ,由于T C P现在有两个未完成的报文段需要确认,因此产生一个序号为 2 0 4 8的A C K(报文段7) ,并清除该连接产生经受时延的确认标志。
T C P处理下一个报文段( 6) ,而连接又被标志为产生一个经受时延的确认。在报文段9到来之前,由于时延定时器溢出,因此产生一个序号为3 0 7 3的A C K(报文段8) 。报文段8中的窗口大小为3 0 7 2,表明在T C P的接收缓存中还有1 0 2 4个字节的数据等待被应用程序读取。
报文段11 ~ 1 6说明了通常使用的“隔一个报文段确认”的策略。报文段 11、1 2和1 3到达并被放入I P的接收队列。当报文段 11被处理时,连接被标记为产生一个经受时延的确认。当报文段1 2被处理时,它们的A C K(报文段1 4)被产生且连接的经受时延的确认标志被清除。报文段1 3使得连接再次被标记为产生经受时延。但在时延定时器溢出之前,报文段 1 5处理完毕,因此该确认立刻被发送。
注意到报文段7、1 4和1 6中的A C K确认了两个收到的报文段是很重要的。使用 T C P的滑动窗口协议时,接收方不必确认每一个收到的分组。在 T C P中,A C K是累积的—它们表示接收方已经正确收到了一直到确认序号减 1的所有字节。在本例中,三个确认的数据为 2 0 4 8字节而两个确认的数据为1 0 2 4字节(忽略了连接建立和终止中的确认) 。
用t c p d u m p看到的是T C P的动态活动情况。我们在线路上看到的分组顺序依赖于许多无法控制的因素:发送方T C P的实现、接收方T C P的实现、接收进程读取数据(依赖于操作系统的调度)和网络的动态性(如以太网的冲突和退避等) 。对这两个T C P而言,没有一种单一的、正确的方法来交换给定数量的数据。
为显示情况可能怎样变化,图 2 0 - 2显示了在同样两个主机之间交换同样数据时的另一个时间系列,它们是在图2 0 - 1所示的几分钟之后截获的。
一些情况发生了变化。这一次接收方没有发送一个序号为 3 0 7 3的A C K,而是等待并发送序号为4 0 9 7的A C K。接收方仅发送了4个A C K(报文段7、1 0、1 2和1 5) :三个确认了2 0 4 8字节,另一个确认了1 0 2 4字节。最后1 0 2 4字节数据的A C K出现在报文段1 7中,它与F I N的A C一道发送(比较该图中的报文段1 7与图2 0 - 1中的报文段1 6和1 8) 。
快的发送方和慢的接收方
发送方发送4个背靠背(b a c k - t o - b a c k)的数据报文段去填充接收方的窗口,然后停下来等待一个A C K。接收方发送A C K(报文段8) ,但通告其窗口大小为 0,这说明接收方已收到所有数据,但这些数据都在接收方的 T C P缓冲区,因为应用程序还没有机会读取这些数据。另一个A C K(称为窗口更新)在17.4 ms后发送,表明接收方现在可以接收另外的 4 0 9 6个字节的数据。虽然这看起来像一个 A C K,但由于它并不确认任何新数据,只是用来增加窗口的右边沿,因此被称为窗口更新。
发送方发送最后4个报文段(1 0 ~ 1 3) ,再次填充了接收方的窗口。注意到报文段 1 3中包括两个比特标志:P U S H和F I N。随后从接收方传来另外两个 A C K,它们确认了最后的4 0 9 6字节的数据(从4 0 9 7到8 1 9 2字节)和F I N(标号为8 1 9 2) 。
滑动窗口
2) 当窗口右边沿向右移动时将允许发送更多的数据,我们称之为窗口张开。这种现象发生在另一端的接收进程读取已经确认的数据并释放了 T C P的接收缓存时。
3) 当右边沿向左移动时,我们称之为窗口收缩。
窗口大小
PUSH标志
慢启动
T C P需要支持一种被称为“慢启动(slow start)”的算法。该算法通过观察到新分组进入网络的速率应该与另一端返回确认的速率相同而进行工作。
成块数据的吞吐量
在时间1, 2和3,报文段从左向右移动一个时间单元。在时间 4接收方读取这个报文段并产生确认。经过时间5、6和7,A C K移动到左边的发送方。我们有了一个 8个时间单元的往返时间RT T(R o u n d - Trip Ti m e) 。
我们有意把A C K报文段画得比数据报文段小,这是因为它通常只有一个 I P首部和一个T C P首部。这里显示仅仅是一个单向的数据流动,并且假定 A C K的移动速率与数据报文段的移动速率相等。实际上并不总是这样。
当发送方收到A C K后,在时间8和9发送两个报文段(我们标记为2和3) 。此时它的拥塞窗口为2个报文段。这两个报文段向右传送到接收方,在时间1 2和1 3接收方产生两个A C K。这两个返回到发送方的A C K之间的间隔与报文段之间的间隔一致,被称为T C P的自计时( s e l f - c l o c k i n g )行为。由于接收方只有在数据到达时才产生A C K,因此发送方接收到的A C K之间的间隔与数据到达接收方的间隔是一致的(然而在实际中,返回路径上的排队会改变ACK的到达率) 。
图2 0 - 1 0表示的是后面1 6个时间单位。2个A C K的到达使得拥塞窗口从 2个报文段增加为4个,而这4个报文段在时间1 6 ~ 1 9时被发送。第1个A C K在时间2 3到达。4个A C K的到达使得拥塞窗口从4个报文段增加为8个,并在时间2 4 ~ 3 1发送8个报文段。
带宽时延乘积
可以计算通道的容量为:c a p a c i t y (bit) = b a n d w i d t h (b/s) × ro u n d-trip time ( s )
一般称之为带宽时延乘积。这个值依赖于网络速度和两端的 RT T,可以有很大的变动。例如,一条穿越美国(RT T约为60 ms)的T 1的电话线路(1 544 000 b/s)的带宽时延乘积为11 580字节。对于2 0 . 4节中讨论的缓存大小而言,这个结果是合理的。但是一条穿越美国的 T 3电话线路(45 000 000 b/s)的带宽时延乘积则为337 500字节,这个数值超过了最大所允许的T C P通告窗口的大小(6 5 5 3 5字节) 。