TCP的流量控制和阻塞控制

流量控制和阻塞控制实例:

  可以用一个例子来说明这种区别。设某个光纤网络的链路传输速率为1000Gbit/s。有一台巨型计算机向一台个人电脑以1Gbit/s的速率传送文件。显然,网络本身的带宽是足够大的,因而不存在产生拥塞的问题。但流量控制却是必须的,因为巨型计算机必须经常停下来,以便使个人电脑来得及接收。(流量控制)

       但如果有另一个网络,其链路传输速率为1Mbit/s,而有1000台大型计算机连接在这个网络上,假定其中的500台计算机分别向其余的500台计算机以100kbit/s的速率发送文件。那么现在的问题已不是接收端的大型计算机是否来得及接收,而是整个网络的输入负载是否超过网络所能承受的。(阻塞控制)


TCP流量控制

1.什么是流量控制?  

   所谓的流量控制就是让发送方的发送速率不要太快,让接收方来得及接受。

2.什么方式进行流量控制?

  a.利用滑动窗口机制可以很方便的在TCP连接上实现对发送方的流量控制。

  b.TCP的窗口单位是字节,不是报文段,发送方的发送窗口不能超过接收方给出的接收窗口的数值。

滑动窗口机制示意图:

         

1.设A向B发送数据。在连接建立时,B告诉了A:“我的接收窗口rwnd = 400”(这里rwnd表示recevier window)。

2.发送方的发送窗口不能超过接收方给出的接收窗口的数值,请注意,TCP的窗口单位是字节,不是报文段

3.再设每一个报文段为100字节长,而数据报文段序号的初始值设为1(图中第一个箭头上面的序号为seq=1。从1开始,data里有100个字节的数据。)

4.图中箭头上面大写ACK表示首部中的确认位ACK(应答标识,表示接收到信息),小写ack表示确认字段的值(表示接收到了哪些具体的数据)。

分析:

a.接收方的主机A进行了三次流量控制,第一次把窗口减小到rwnd  =300。

b.第二次又减小到rwnd = 100。

c.最后减到rwnd = 0,即不允许发送方再发生数据了。

d.这种使发送方暂停发送的状态将持续到主机B重新发出一个新的窗口值为止。

e.B向A发送的三个报文段都设置了ACK = 1,只有在ACK = 1时确认号字段才有意义。(相当于判定条件,只有条件成立时,才去查下面的信息)

3.以上处理的不足

  死锁问题

   1.B向A发送了零窗口的报文段后不久,B的接收缓存又有了一些存储空间。于是B向A发送了rwnd = 400的报文段,然而这个报文段在传送过程中丢失了。

   2.A一直等待收到B发送的非零窗口的通知,而B也一直等待A发送的数据,如果没有其他措施,这种相互等待的死锁局面将一直持续下去。

4.解决方法

  1.TCP为每一个连接设有一个持续计时器。

  2.只要TCP连接的一方收A到对方的零窗口通知,就启动持续计时器。

  3.若持续计时器设置的时间到期,就发送一个零窗口探测报文段(仅携带1字节的数据),而对方B就在确认这个探测报文时给出了现在的窗口值。

  4.如果窗口值仍然是零,那么收到这个报文段的一方就重新设置持续计时器。

  5.如果窗口不是零,那么死锁的僵局就可以打破了。

5.三种TCP传输机制

  1.TCP维持一个变量,它等于最大报文段长度MSS。只要缓存中存放的数据达到了MSS字节时,就组装成一个TCP报文段发送出去。

  2.发送方的应用进程指明要求发送报文段,即TCP支持的推送(push)操作。

  3.发送方的一个计时器期限到了,这时就把当前已有的缓存数据装入报文段(但长度不超过MSS)发送出去。

6.如何控制TCP发送报文段的时机?

  TCP的实现中广泛使用Nagle算法

  1.若发送应用进程把要求发送的数据逐个地送到TCP的发送缓存,则发送方就把第一个数据字节先发送出去,把后面到达的数据字节都缓存起来。

  2.当发送方收到第一个数据字节的确认后,再把发送缓存中的所有数据组装成一个报文段发送出去,同时继续对随后到达的数据进行缓存,只有在收到对前一个报文段的确认后才继续发送下一个报文段。

  3.当数据到达较快而网络速率较慢时,用这样的方法可明显减少所用的网络带宽。

  4.Nagle算法还规定,当到达的数据已达到发送窗口大小的一半或已达到报文段的最大长度时,就立即发送一个报文段。这样就可以有效的提高网络的吞吐量。

7.糊涂窗口综合症(傻窗口)

  1.TCP接收方的缓存已满,而交互式的应用进程一次只从接收缓存中读取为1个字节(这样就使接收缓存空间仅腾出1个字节)

  2.然后向发送方发送确认,并把窗口设置为1个字节(但发送的数据报是40字节长)。

  3.接收方收到确认,仍然将窗口设置为1个字节,并发送。

  4.这样进行下去,使网络的效率很低。

8.如何解决糊涂窗口综合证

  1.让接收方等待一段时间,使得或者接收缓存已有足够空间容纳一个最长的报文段,或者等到接收缓存已有一半空闲的空间。

  2.只要出现这两种情况之一,接收方就发出确认报文,并向发送方通知当前的窗口大小。

  3.此外。发送方也不要发送太小的报文段,而是把数据积累成足够大的报文段,或达到接收方缓存的空间的一半大小。

Nagle算法和解决糊涂窗口综合证配合使用,使得在发送方不发送很小的报文段的同时接收方也不要在缓存刚刚有了一点小的空间就急忙把这个很小的窗口大小信息通知给对方。



猜你喜欢

转载自www.cnblogs.com/sunweiye/p/11106932.html
今日推荐