tcp/ip学习笔记--第20章 TCP Bulk data flow

来源:互联网 发布:电脑挂机赚钱软件2016 编辑:程序博客网 时间:2024/05/17 14:25

简介

与之前所见的TFTP使用的停止等待的协议不同,TCP使用一种叫做滑动窗口的协议。在停下来等待确认之前可以发送多个报文,这样可以提高发送数据的速率。


正常数据流 normal data flow

简单的例子:发送方发送数据,接收方进行确认。书上讲得挺清楚。

几个知识点:

1.ack every other segment

之前有讲到过,接收方一般会采取延迟确认的策略:接收到数据之后不是立即确认,而是根据计时器延迟0-200ms,如果这个过程中有数据需要发送,确认就会和数据一起发送出去。ack every other segment的策略就是说:接收到第一个报文,开启定时器,如果在定时器溢出之前,又收到了第二个报文,那么这个时候接收方不会继续等待计时器的溢出而直接发送确认。也就是隔一个报文发送一次确认。

2.dynamic of TCP in action

当发送方多次向接收方发送相同的数据时,虽然都能保证所有报文成功发送到接收方,但是监测到报文却不会是一样的。


Fast sender,Slow Receiver 

情况就是:发送方发送的数据会将接收方的缓冲区用完,导致接收方发送ack的时候通告的window size 为0,等接收方处理一些数据之后,会发送更新窗口的报文。


滑动窗口


觉得很有必要上一下这个图,感觉这个图相对还是比较费解。

首先,这个图是以发送者的视角绘制的,这个前提条件一定要清楚,否则会造成理解困难。

书中有这样一句话:recall from chapter 17 that the window size is relative to the acknowledged sequence number。

滑动窗口的大小与确认序列号有什么关系呢:关系就是最大确认序列号所对应的位置就是窗口的最左边的起始处。所以最大确认序列号+窗口大小,就是窗口的右边结束处。

接收方发送的ack确认序列号与窗口大小唯一的确定了窗口的位置。

那么三个描述滑动窗口左右边界移动的术语也就不难理解:

close:窗口左边边界右移。对应的情况:发送的数据被ack确认。注意,这时窗口的右边是否移动是不确定的。有可能保持不动,也有可能右移。

open:窗口右边边界右移。这有可能是确认序列号变大了窗口不变,也有可能是确认序列号不变而窗口变大,也有可能是二者都变大了。无论哪种情况,都一定是接收方从缓冲队列中读取了数据,导致缓冲区有了空余的空间。

shrinks:窗口右边边界左移。感觉唯一的可能就是接收方的缓冲区变小了。host requirement强烈建议不要让这种情况发生,但是又TCP实现一定要能处理这种情况。


窗口大小

一般来说,发送方的发送缓冲区,接收方的接收缓冲区越大,吞吐量就会越高,当然这种提高肯定不是无限的。


PUSH标志

就是告诉TCP实现尽快将数据发送出去,告诉接收方尽快将数据递交给应用程序,不要等待其他数据。

现在的实现一般都没有给程序设置这个标志的接口,认为一个好的TCP实现自己知道应该什么时候设置这个标志。现在的TCP实现一般都遵守这个规则:如果缓冲区没有更多的数据,这设置这个标志。


Slow Start  慢启动

如果TCP一启动就直接向网络中发送大量的数据,可能会让本来就已经拥堵的网络变量更加拥堵。所以,所有的TCP实现都必须支持一个叫做慢启动的算法。

慢启动为TCP发送方增加一个新的窗口:拥塞窗口。当TCP连接建立起来的时候,这个窗口的大小设置为1报文大小。每当收到一个ack确认的时候,窗口就增加一个报文段大小。(拥塞窗口以字节为单位,但是增加的时候通常增加一个报文段大小,之前有讲过的TCP 头部选项:max segment size)。发送方最多只能发送拥塞窗口与通告窗口的较小值的数据。拥塞窗口是发送方自己施加的限制,而通告窗口是接收方施加的限制。

拥塞窗口是指数级增大的:先发送一个报文。收到ack确认之后,窗口大小变为2。然后发送2个报文,收到确认之后报文大小变为4.....


bandWidth-Delay Product 带宽时延乘积

带宽时延乘积的概念很简单,就是在一个RTT时间内,管道上能够承载多少数据。当然的,在单位时间内能够发送越多的数据的管道,这个值会越大。

但是完全没有搞明白作者所说的:

1.在我们的例子中,为了保证最大的吞吐量,需要随时保持发送了8个未被确认的报文。

2.带宽时延积和通告窗口的大小有什么关系。???

后面看了一些解释之后明白了2,以下是个人理解

为了保证最大的吞吐量,理想的操作就是一直往处发送,同时不断的收到ack确认,窗口一直不断的向前滑动,而不出现需要等待未被确认的数据而被迫停止的情况。发出一个报文到收到其确认,需要的时间表示为RTT。那么:

窗口大小=带宽(bit/s)* RTT =带宽时延积。


Urgent mode 紧急模式

TCP头部中有紧急标志位和紧急指针,在紧急模式的时候工作。

看了书上的内容后,还是没太明白紧急模式的具体应用。

只是讲到rlogin和Tftp都有用到,在后面的章节会讲到。

(后面再具体学习)