《TCP/IP详解》读书笔记(20章)-TCP的成块数据流

时间:2023-01-08 09:33:54

目前建立在TCP协议上的网络协议特别多,有telnet,ssh,有ftp,有http等等。这些协议又可以根据数据吞吐量来大致分成两大类:(1)交互数据类型,例如telnet,ssh,这种类型的协议在大多数情况下只是做小流量的数据交换,比如说按一下键盘,回显一些文字等等。(2)数据成块类型,例如ftp,这种类型的协议要求TCP能尽量的运载数据,把数据的吞吐量做到最大,并尽可能的提高效率。针对这两种情况,TCP给出了两种不同的策略来进行数据传输。

本章介绍TCP所使用的被称为窗口协议的另一种形式的流量控制方法。该协议允许发送方在停止并等待确认前可以连续发送多个分组。由于发送方不必每发一个分组就停下来等待确认,因此该协议可以加速数据的传输。

1.隔一个报文段确认策略

TCP处理一个接收的报文将产生一个经受时延的确定,此ACK并不立即返回,这时分两种情况(隔一个报文或者定时器溢出):

(1)TCP处理下一个报文,然后返回一个ACK确定2个报文段(可以想象成捎带ACK)。

(2)定时器溢出,返回ACK。如果溢出时,TCP接收缓冲区中还有数据没有被应用层读取完,那么返回报文段的窗口值将为初始窗口值减去缓冲区中的值。


2.滑动窗口协议

窗口移动:
(1)窗口左边沿向右边沿靠近为窗口合拢
(2)窗口右边沿向右边移动为窗口张开

(3)窗口右边沿向左边移动为窗口收缩。RFC强烈建议不要使用这种方式

如果左边沿到达右边沿,则称其为一个0窗口,此时发送方不能够发送任何数据。

来自接收方的一个报文段确认数据并把窗口向右边滑动。这是因为窗口的大小是相对于确认序号的。

窗口大小由进程控制,插口API允许进程设置发送和接收缓存的大小,接收缓存的大小是该连接上所能够通告的最大窗口大小,发挥TCP传输性能。

TCP就是用这个窗口,慢慢的从数据的左边移动到右边,把处于窗口范围内的数据发送出去(但不用发送所有,只是处于窗口内的数据可以发送。)。这就是窗口的意义。图20-6解释了这一点。窗口的大小是可以通过socket来制定的,4096并不是最理想的窗口大小,而16384则可以使吞吐量大大的增加。

滑动窗口是用来加速数据传输。TCP要保证“可靠”,就需要对一个数据包进行ack确认表示接收端收到(窗口张开)。有了滑动窗口,接收端就可以等收到许多包后只发一个ack包,确认之前已经收到过的多个数据包。有了滑动窗口,发送端在发送完一个数据包后不用等待它的ack,在滑动窗口大小内可以继续发送其他数据包(窗口合拢)。

发送的数据TCP包都有一个序号。它是这么计算的:最初发送SYN时,有一个初始序号,根据RFC的定义,各个操作系统的实现都是与系统时间相关的。之后,序号的值会不断的增加,比如原来的序号是100,如果这个TCP包的数据有10个字节,那么下次的TCP包序号会变成110。
滑动窗口用于加速传输,比如发了一个seq=100的包,理应收到这个包的确认ack=101后再继续发下一个包,但有了滑动窗口,只要新包的seq与没有得到确认的最小seq之差小于滑动窗口大小,就可以继续发。

因为窗口的左边沿受另一端发送的确认序号的控制,因此不可能向左边沿移动。如果接收到一个指示窗口左边沿向左移动的ACK,则它被认为是一个重复的ACK,并被丢弃。

下图展示了发送窗口与接收窗口滑动:

《TCP/IP详解》读书笔记(20章)-TCP的成块数据流


下图展示滑动窗口占满,窗口不能向右滑动,暂时不能发送数据包。



3.PUSH标志

发送方使用该标志通知接收方将所收到的数据全部提交给接收进程。这里的数据包括与PUSH一起传送的数据以及接收方TCP已经为接收进程收到的其它数据。

(1)发送方将发送缓冲区的数据立即发送给接收方。
(2)接收方将接收缓冲区的数据立即提交给接收进程。

如果待发送数据会清空发送缓冲区,该包将自动设置PUSH标志。


4.慢启动(拥塞窗口)

如果发送方和接收方之间存在多个路由器和速率较慢的链路时,一些中间的路由器必须缓存分组,并有可能耗尽存储器的空间,这种连接方式会严重降低了TCP连接的吞吐量。

拥塞窗口(cwnd)原理:

1)发送方开始发送一个报文,然后等待ACK。

2)当收到该ACK时,拥塞窗口从1增加到2,即可以发送2个报文段。

2)发送方再发送2个报文段,然后等待ACK,当收到这两个报文段的ACK时,拥塞窗口就增加为4。这是一种指数增加的关系。

如此循环.....

在某些点上可能达到了互联网的容量,于是中间路由器开始丢弃分组,这就通知发送方它的拥塞窗口开得过大。

慢启动算法用于保证新分组进入网络的速率与另一端返回确定的速率相等。
拥塞窗口是发送使用的流量控制,通告窗口是接收方使用的流量控制。


5.紧急方式

TCP提供了“紧急方式”,它使一端告诉另一端有些具有某种方式的“紧急数据”已经放置在普通的数据流中。另一端被通知这个紧急数据已被放置在普通数据流中,由接收方决定如何处理。

可以设置TCP首部中的两个字段来发出这种从一端到另一端的紧急数据已经被放置在数据流中的通知。URG比特被置为1,并且一个16bit的紧急指针放置为一个正的偏移量,该偏移量必须与TCP首部中的序号字段相加,以便得出紧急数据的最后一个字节的序号。

紧急方式最常见的例子是Telnet和Rlogin,从服务器到客户端使用紧急方式是因为在这个方向上的数据流很可能要被客户的TCP停止(即,客户端通告了一个大小为0的窗口)但是如果服务器进程进入紧急方式,尽管它不能够发送任何数据,服务器TCP也会立即发送紧急指针和URG标志。当客户TCP接收到这个通知时就会通知客户进程,于是客户可以从服务器读取其输入、打开窗口并使数据流动。

作者原创,转载请标明原处:http://blog.csdn.net/xifeijian/article/details/44260995