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) 。
快的发送方和慢的接收方
图2 0 - 3显示了另外一个时间系列。这次是从一个快的发送方(一个 S p a r c工作站)到一个慢的接收方(配有慢速以太网卡的8 0 3 8 6机器) 。它的动态活动情况又有所不同。
发送方发送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 0 - 6显示了在图2 0 - 1所示的数据传输过程中滑动窗口协议的动态性。
滑动窗口
1) 称窗口左边沿向右边沿靠近为窗口合拢。这种现象发生在数据被发送和确认时。2) 当窗口右边沿向右移动时将允许发送更多的数据,我们称之为窗口张开。这种现象发生在另一端的接收进程读取已经确认的数据并释放了 T C P的接收缓存时。
3) 当右边沿向左移动时,我们称之为窗口收缩。
如果左边沿到达右边沿,则称其为一个零窗口,此时发送方不能够发送任何数据。
窗口大小
由接收方提供的窗口的大小通常可以由接收进程控制,这将影响 T C P的性能。4 . 2 B S D默认设置发送和接受缓冲区的大小为2 0 4 8个字节。在4 . 3 B S D中双方被增加为4 0 9 6个字节。正如我们在本书中迄今为止所看到的例子一样, SunOS 4.1.3、B S D / 3 8 6和S V R 4仍然使用4 0 9 6字节的默认大小。其他的系统,如Solaris 2.2、4 . 4 B S D和AIX3.2则使用更大的默认缓存大小,如8192或16384等。
首先注意到的是在报文段2中提供的窗口大小为6 1 4 4字节。由于这是一个较大的窗口,因此客户立即连续发送了6个报文段(4 ~ 9) ,然后停止。报文段1 0确认了所有的数据(从第 1到6 1 4 4字节) ,但提供的窗口大小却为2 0 4 8,这很可能是接收程序没有机会读取多于 2 0 4 8字节的数据。报文段11和1 2完成了客户的数据传输,且最后一个报文段带有 F I N标志。报文段1 3包含与报文段1 0相同的确认序号,但通告了一个更大的窗口大小。报文段 1 4确认了最后的2 0 4 8字节的数据和F I N,报文段1 5和1 6仅用于通告一个更大的窗口大小。报文段1 7和1 8完成通常的关闭过程。
PUSH标志
发送方使用该标志通知接收方将所收到的数据全部提交给接收进程。这里的数据包括与 P U S H一起传送的数据以及接收方T C P已经为接收进程收到的其他数据。目前大多数的 A P I没有向应用程序提供通知其 T C P设置P U S H标志的方法。的确,许多实现程序认为P U S H标志已经过时,一个好的T C P实现能够自行决定何时设置这个标志。
慢启动
当发送方和接收方处于同一个局域网时,这种方式是可以的。但是如果在发送方和接收方之间存在多个路由器和速率较慢的链路时,就有可能出现一些问题。一些中间路由器必须缓存分组,并有可能耗尽存储器的空间。T C P需要支持一种被称为“慢启动(slow start)”的算法。该算法通过观察到新分组进入网络的速率应该与另一端返回确认的速率相同而进行工作。
慢启动为发送方的T C P增加了另一个窗口:拥塞窗口(congestion window),记为c w n d。
我们观察到发送方发送一个长度为5 1 2字节的报文段,然后等待A C K。该A C K在716 ms后收到。这个时间是一个往返时间的指示。于是拥塞窗口增加了 2个报文段,且又发送了两个报文段。当收到报文段5的A C K后,拥塞窗口增加为3。此时尽管可发送多达3个报文段,可是在下一个A C K收到之前,只发送了2个报文段。
成块数据的吞吐量
图2 0 - 9显示了左边的发送方和右边的接收方之间的一个 T C P连接上的时间系列,共显示了1 6个时间单元。为简单起见,本图只显示离散的时间单元。每个粗箭头线的上半部分显示的是从左到右的携带数据的报文段,标记为 1, 2, 3, 等等。在粗线箭头下面表示的是反向传输的A C K。我们把A C K用细箭头线表示,并标注了被确认的报文段号。通常发送一个分组的时间取决于两个因素:传播时延(由光的有限速率、传输设备的等待时间等引起)和一个取决于媒体速率(即媒体每秒可传输的比特数)的发送时延。对于一个给定的两个接点之间的通路,传播时延一般是固定的,而发送时延则取决于分组的大小。在速率较慢的情况下发送时延起主要作用 ,而在千兆比特速率下传播时延则占主要地位 。
在时间0,发送方发送了一个报文段。由于发送方处于慢启动中(其拥塞窗口为 1个报文段) ,因此在继续发送以前它必须等待该数据段的确认。
在时间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字节) 。