流量控制

为什么要TCP流量控制?

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

TCP流量控制不是为了减少网络压力,那是TCP拥塞控制的作用。

下面简单介绍一下TCP流量控制的目的: 
作用对象:相互连接着的两个终端(发送端接收端)。 
解决问题:解决发送端与接收方吞吐量不匹配的问题,比如当一个发送端A每秒发10个数据包,而接收端B每秒只能接受1个数据包,那么就会出现丢包的情况,所以发送端与接收端要的吞吐量要匹配。 

目的:让发送端根据接收端的接收能力动态的调整发送速率

如何进行TCP流量控制?

利用滑动窗口机制可以很方便的在TCP连接上实现对发送方的流量控制。TCP的窗口单位是字节,不是报文段,发送方的发送窗口不能超过接收方给出的接收窗口的数值。这里采用滑动窗口机制,一是不用每次发送完成都需要等待收到确认消息才能继续发送,二是参考接收端的接收能力,限制发送数据段大小,避免丢失现象。

发送窗口在连接建立时由双方商定。但在通信的过程中,接收端可根据自己的资源情况,随时动态地调整对方的发送窗口上限值(可增大或减小)。

接收方通过通告发送方自己的窗口大小,从而控制发送方的发送速度,从而达到防止发送方发送速度过快而导致自己被淹没的目的。

滑动窗口

发送端已发送了 400 字节的数据,但只收到对前 200 字节数据的确认,同时窗口大小不变。还可发送 300 字节。

发送端收到了对方对前 400 字节数据的确认,但对方通知发送端必须把窗口减小到 400 字节(发送窗口缩小)。现在发送端最多还可发送 400 字节的数据。

发送窗口与接收窗口关系:

TCP是双工的协议,会话的双方都可以同时接收、发送数据。TCP会话的双方都各自维护一个“发送窗口”和一个“接收窗口”。其中各自的“接收窗口”大小取决于应用、系统、硬件的限制(TCP传输速率不能大于应用的数据处理速率)。各自的“发送窗口”则要求取决于对端通告的“接收窗口”,要求相同。

 

这里写图片描述

首先介绍TCP流量控制需要的几个变量:

  1. LastByteSent :最后发送的数据包的序号,由发送端进行维护
  2. LastByteAck:最后收到的ACK包确认的数据包序号,由发送端进行维护
  3. rwnd:接收窗口,由发送方进行维护,表示接收方还有多少空余空间,由接收方发回(与ACK一起?待查)。接收方将其rwnd值放入它发送给发送方的报文段的接收窗口字段中,通知发送方它在该连接的缓存中还有多少可用空间。
  4. LastByteRead:由接收方维护,表示应用程序最后从缓存里面读取的数据包的序号
  5. RcvBuffer:接收方缓存的最大值
  6. LastByteRcvd:从网络中到达的最后一个放入接收缓存的数据包的序号

如果要:要保证不因为溢出而丢包,即保证接收方缓存足以接收即将收到的数据。 
即:LastByteRcvd−LastByteRead≤RcvBuffer

LastByteRcvd−LastByteRead≤RcvBuffer

又:rwnd=RcvBuffer−[LastByteRcvd−LastByteRead]

rwnd=RcvBuffer−[LastByteRcvd−LastByteRead]


要达成TCP流量控制,需要满足下式:将未确认的数据量控制在值rwnd内:LastByteSent−LastByteAck≤rwnd

LastByteSent−LastByteAck≤rwnd

 

TCP报文段发送时机的选择:

TCP报文段发送时机主要有以下几种选择途径。

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

2)由发送方的应用程序指明要求发送报文段,即TCP支持的推送操作

3)是发送方的一个计时器期限到了,这时就把当前已有的缓存数据装入报文段发送出去。

具体是如何进行的?

如图所示,说明了利用可变窗口大小进行流量控制。设主机A向主机B发送数据。双方确定的窗口值是400.再设每一个报文段为100字节长,序号的初始值为seq=1,图中的箭头上面大写ACK,表示首部中的确认为ACK,小写ack表示确认字段的值。

     接收方的主机B进行了三次流量控制。第一次把窗口设置为rwind=300,第二次减小到rwind=100最后减到rwind=0,即不允许发送方再发送数据了。这种使发送方暂停发送的状态持续到主机B重新发出一个新的窗口值为止

     假如,B向A发送了零窗口的报文段后不久,B的接收缓存又有了一些存储空间。于是B向A发送了rwind=400的报文段,然而这个报文段在传送中丢失了。A一直等待收到B发送的非零窗口的通知,而B也一直等待A发送的数据。这样就死锁了。为了解决这种死锁状态,TCP为每个连接设有一个持续计时器只要TCP连接的一方收到对方的零窗口通知就启动持续计时器,若持续计时器设置的时间到期,就发送一个零窗口探测报文段(仅携带1字节的数据),而对方就在确认这个探测报文段时给出了现在的窗口值。

最简单的思路:rwnd=0时咱们不发送了,但这样会存在一个问题,就是如果之后没有ACK,那么连接就相当于断开了。 
所以真正的解决方案是:当rwnd=0时,发送端发送只有一个字节的数据的报文段。这些报文段将会被接收方确认。最终缓存开始清空,并且确认报文里将包含一个非0的rwnd值

如何恢复?

等下一次ACK到来可能rwnd就变大了,到时候就可以发送更多的数据了。

UDP不提供流量控制。

 

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值