TCI流量控制

TCP流量控制(flow control)

首先,为什么进行流量控制?

一般地说,我们总是希望数据传输的更快,但是如果发送方传送的很快,而接收方来不及接收的话,数据就会丢失。

TCP使用滑动窗口来进行流量控制。

TCP窗口单位是字节


其实,滑动窗口只不过是一个装B的说法,“每次传输容量”这个名词更适合这个地方。

注意看上图,上图是从谢老师的《计算机网络》中截出的一幅TCP流量控制的说明图,下面我也来说明一下:

首先先想一个问题,发送方A与接收方B,A想要发送600个字节的内容给B,要如何发送?

有人说,简单,直接全部送过去。

扫描二维码关注公众号,回复: 709506 查看本文章

可实际上并不是个简单的问题,要考虑A的发送能力,A一次能发多少字节的数据出去呢?还得考虑B的接收能力,B一次能接收多少字节的数据?还得考虑网络原因,中途出现数据丢失怎么办?

首先,针对A,B的每次发送接收能力问题,先约定一个比较合适的容量rwnd,这个容量一般来说,是接收方B的每次处理能力,只要A每次发送的数据不超过这个容量rwnd,那么B就有能力处理地过来。

这个容量rwnd不是恒定的,而是要根据接收方B的实际情况和网络状况而改变的,而且也可能随着发送数据的多少而改变,例如数据发送完毕,则rwnd = 0。

现在我们可以看上图了。

在看第一行之前,还得说明一下,A与B之间已经约定好了:rwnd=400字节,至于它们之间是怎么约定的,其实大部分情况下,发送一个1字节的确认信号到B,完成一次数据交互,即可获得B的rwnd。

1 现在看第一行:seq=1,DATA,表示A发送了1-100字节的数据到B,此时B的处理容量还没满,还有300字节的处理能力。A可以继续发送。

2 再看第二行:seq=101,DATA,表示A发送101-200字节的数据到B,B的处理容量还没满,还差200字节。

3 看第三行:seq=201,DATA,但是出现“丢失”,不必管怎么丢失的,此时相当于出现了严重的错误了,A不能继续发数据了,B也要调整一下状态了。

4 ACK=1,ack=201,rwnd=300,ACK表示首部确认位,ack表示确认字段的值,此时,B返回自己的rwnd=300,那么A只能发300字节的数据,就要重新确认rwnd了。

5 seq=301,DATA,参照第二步

6 seq=401,DATA,参照第二步

7 seq=201,DATA,这个时候是重发旧的数据,此时,300字节的rwnd满了,要重新确认新的rwnd

8 ACK=1,ack=501,rwnd=100,参照第4步

9 seq=501,DATA,参照第二步

10 ACK=1,ack=601,rwnd=0,因为上一步,就已经把600字节的数据传送完毕了,没必要在继续传了,这个时候,就把rwnd设置成0了。


rwnd=0的问题

有人又要问了,如果rwnd=0,那么发送方A岂不是一直不能传数据了吗?

这个时候,一个叫做“持续计数器”的东东出现了,在发送方,如果收到rwnd=0的通知,那么“持续计数器”启动,经过一段时间之后,发送试探消息到B,如果还是收到rwnd=0的结果,那么继续等待,如果不是0,就可以继续传数据了。

猜你喜欢

转载自housen1987.iteye.com/blog/1525851