流量控制是用于确保发送实体发送的数据不会超出接收实体接收数据能力的一种技术。一般情况下,接收实体会为传输分配一些具有最大长度的数据缓冲区。如果没有流量控制,接收实体在处理旧数据时,缓冲区就有可能会被新数据填满,甚至溢出。
由于运输层在互联网层之上,可能会经过各种各样的网络,因此传输时延通常比较长,而且时延变化很大,这就使得运输层TCP协议的流量控制更为复杂。
TCP的流量控制采用的是信用量机制。发送方实体可以在它的信用量范围内随心所欲地传送数据。但如果它的信用量耗尽,那么它在对方分配新的信用量配额之前将无法再发送数据。在信用量机制中,每个字节所分配的序号(SN)及其返回来的确认号(AN)依然会起到很重要的作用,它们和信用量一起,实现TCP的差错控制。
信用量流量控制是对滑动窗口流量控制的一种改进。图6-6描述了信用量流量控制机制。为了说明方便,只演示了由传输实体A到传输实体B一个方向上的数据流,并假设每个报文段均发送200字节的数据。
图6-6 TCP信用量机制
最初,在进行TCP连接的建立时,发送方与接收方已经将初始序号同步为1001,且A被赋予的初始信用量配额为1400字节。开始时,A发送了3个报文段,在发送时它包含了这3个报文段中数据字段的第一个字节的序号,分别为1001,1201和1401。而A的传输窗口也随着它的数据的发送每次缩减200字节。3个报文段共为600字节,窗口缩小到只剩下1400-600=800字节。相应地,传输实体B接收到了这3个报文段后,接收窗口也缩短了600字节。
这时,B对A发送的报文段进行确认,确认已接收到直到1600号的所有字节,这样B的接收窗口的左边界自然地移动到了1600号字节之后。而B在A报文段进行确认的同时,对A又发出了1000字节的信用量,这样B接收窗口的右边界也就移动到了序号为1600+1000=2600的字节了。
接着,A接收到了B的确认,也就意味着B允许A继续发送序号从1601~2600的字节数据。但在A收到B的确认之前,A已经又发送了数据字节序号为1601~1800以及1801~2000的两个报文段,也就是说虽然B分配给了A1000字节的信用量,但这时A可用的信用量也只有序号为2001~2600的600字节了。(www.daowen.com)
接下来,A继续发送数据,但当它将它的信用量耗尽,也就是发送到了B允许A发送的数据字节序号的极限2600时,A就不能再发送数据,只能等待B再次分配信用量配额后才能再次发送数据。
最后,接收实体B在它进行完其他的数据处理任务之后,终于对A前后发送过来的5个报文段的1000字节进行了累计确认,同时将A的信用量配额重新恢复为1400字节。也就是允许A发送字节序号为2601~4000的数据。而A在接收到了这个等待许久的确认之后,也调整了自己的发送窗口,又准备开始接下来的数据发送了。
通过这种技术,就可以由信用量窗口大小和报文段被确认的速度,来有效地确定发送端的速度了。这样,为了防止接收端缓冲区溢出,一个慢速的接收端就可以通过给发送端设置一个较小的信用量配额,或是延时确认信息的发送来减缓一个快速发送端的速度。
可以看到,这种信用量机制是针对大数据量数据流的发送而设计的,也就是通过TCP连接会连续地发送大量字节。通常,使用这种TCP服务的应用程序包括FTP、HTTP、电子邮件等。
除此之外,TCP还支持像telnet这样的应用程序使用的交互式数据流。如同用telnet方式登陆BBS一样,telnet模拟一个哑终端(只有一个键盘和一个显示器,没有主机),一切处理都由服务器完成。首先,用户的按键动作将从用户发送给服务器。然后,服务器将键值回送给用户,同时,捎带回对按键数据的确认。最后,用户将收到的回显的键值显示在屏幕上,并为收到的回送报文段向服务器发送一个确认信息。
telnet终端仿真程序采用这种方式,用户就可以看到每次的按键都能尽快地显示在屏幕上,就像他们在使用本地机器一样。但这样为了得到很小的时延,却是以牺牲带宽为代价的。假设一个按键产生一个数据字节,发送一个数据字节的开销是64字节(以太网最小帧长度为64字节)。而对于每次按键需要上述的3个来回的报文段,这样每次按键总的开销就是64×3=192字节。
为了改善这种状况,可以采用Nagle算法。也就是当数据像按键信息这样每次一字节地到达发送方TCP实体时,只发送第一个字节并将后续到达的其余字节缓存起来,直到第一个字节被确认后。接着用一个TCP报文段发送到此为止缓存起来的所有字节。这样如果用户输入速度很快而网络较慢,那么每个报文段将包含大量的字符数据,从而有效地减少了所使用的带宽。当然,这种更高的带宽效率是以用户时延的增加为代价的。所以说,带宽和时延是一对矛盾,两个问题很难同时解决,只能寻找两者平衡的一个契合点。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。