TCP如何利用滑动窗口实现流量控制(15分钟醍醐灌顶)

TCP如何利用滑动窗口实现流量控制

前言:
  • 为什么需要流量控制 因为如果发送方把数据发送的过快,接收方就可能来不及接收,这就会造成数据的丢失
  • 流量控制就是让发送方的发送速率不要太快,让接收方来得及接收所有数据
  • TCP中是通过滑动窗口机制在TCP连接上实现对发送方的流量控制(接收方控制发送方
流量控制的具体细节:
  • 假设先不考虑拥塞控制,发送方的发送窗口等于接收方的接收窗口

  • 假设一个如下的TCP连接情况:

    • 主机A和主机B已建立TCP连接,主机A给主机B发送数据,主机B对主机A进行流量控制

    • 为了叙述简单,假设主机A缓冲区的数据会按照一个包100字节的块发送,如下所示:

      请添加图片描述

  • 1、若在最开始的时候,主机B告诉主机A自己的接收窗口为400,那么主机A将自己的发送窗口设置为400

  • 2、主机A发送1~100号的数据,主机A发送101~200号数据,主机A继续发送201~300号数据,理论上可以一直将发送窗口内的数据全部发完

  • 3、若主机A发送的1~100号101~200号数据顺利到达主机B并被主机B接收, 但是201~300号意外丢失了。主机B会返回响应ACK=1,ack=201,rwnd=300,这表示主机B已接收到201号之前的数据,(假设)并将自己的接收窗口设置为300

    • (这是主机B对主机A的一次流量控制,因为其缩小了自己的接收窗口)
  • 4、主机A接收到主机B发来的响应后

    • 因为知道了201号之前的数据已被成功接收,所以会将发送窗口向前滑动,将201号之前的数据移出发送窗口,同时可以销毁缓冲区内201号之前的数据。
    • 又因为主机B的接收窗口调整为300,所以主机A将自己的发送窗口也调整为300,此时发送窗口内数据的序号为201~300301~400401~500
  • 5、主机A继续发送301~400401~500也即发送窗口内的数据;发送窗口内的数据发送完后发送方暂停发送

  • 6、主机A每次发送TCP报文段都会开启一个重传计时器,假设现在201~300号数据对应的重传计时器超时了,主机A会再次将该段数据包装好并发送去seq=201,data...

  • 7、若主机B接收到201~300号数据,将返回响应ACK=1,ack=501,rwnd=100,表示主机B已成功接收501号之前的数据,并假设将自己的接收窗口设置为100

    • 这是主机B对主机A的又一次流量控制,因为其缩小了自己的接收窗口
  • 8、主机A接收到主机B发来的响应后,与第4步类似

    • 因为知道了501号之前的数据已被成功接收,所以会将发送窗口向前滑动,将501号之前的数据移出发送窗口,同时可以销毁缓冲区内501号之前的数据
    • 又因为主机B接收窗口调整为100,所以主机A将自己的发送窗口也调整为100,此时主机A发送窗口内的数据序号为501~600号
  • 9、主机A继续发送其发送窗口内的501~600号数据,发送窗口内的数据全部发送完,所以暂停发送数据

  • 10、主机B接收到501~600号数据,将返回ACK=1,ack=601,rwnd=0进行累计确认,表示主机B已成功接收600号以前的数据,这里再次假设调整了自己的接收窗口为0

    • 这是主机B对主机A的又一次流量控制,因为其又改变了自己的接收窗口
  • 11、主机A接收到主机B的响应后,类似第4、第8步

    • 发送窗口向前滑动,将600号之前的数据移出发送窗口,销毁缓冲区内600号之前的数据
    • 调整发送窗口大小为0

    请添加图片描述

  • 12、此时主机A的发送窗口为0,不能再发送普通的TCP数据报,并等待主机B发送改变其接收窗口的指令

  • 13、若主机B的接收缓存腾出了一些存储空间,将接收窗口调整为300,并通告主机Arwnd=300,但是该数据包意外丢失了

  • 14、主机A一直等不到主机B发送的调整其接收窗口的数据包,此时如果不采取措施就会陷入死锁,也即主机A等待B,主机B等待A。TCP流量控制中采取的解决方法如下:

    • TCP为每一个连接设置一个持续计时器,只要TCP的一方收到对方的零窗口通知,就启动该持续计时器
  • 15、直到持续计时器超时,主机A主动发送一个零窗口探测报文段该报文仅有1字节;主机B接收到该探测报文后立刻告知主机A自己的发送窗口大小

    • 如果主机B的接收窗口还是0,主机A再重新开启一个持续计时器,然后等待持续计时器超时
    • 如果主机B的接收窗口不是0,上述的死锁局面就解决了

    请添加图片描述

问题1:在主机B接收窗口为0时还怎么接收主机A的0窗口探测报文段呢?不是接收窗口已经为0了吗?

:TCP规定,就算接收窗口为0,也必须接受零窗口探测报文段确认报文段、以及携带有紧急数据的报文段

问题2:如果零窗口探测报文段也丢失了怎么办?

零窗口探测报文段也有设置的有重传计时器,如果丢失,等待该计时器超时,然后重传零窗口探测报文段


总结起来就是:
  • 发送方解析接收方的响应数据包,根据接收方的接收窗口大小调整自己的发送窗口大小;

  • 发送方通过向前滑动发送窗口的方式移除已确认被正确接收的数据,并将他们从缓冲区删除;

  • 发送方只发送自己发送窗口内的数据

  • 发送窗口向前滑动的前提是发送窗口的数据确认被正确接收


这是学习湖科大计网时我做的学习笔记,老师讲的太好了,建议去看原版,B站就有!!!

  • 24
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咖啡与乌龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值