TCP是如何实现流量控制的?

50 篇文章 0 订阅
44 篇文章 0 订阅

洪爵上节给大家介绍了TCP报文段的首部格式:

《面试必问的TCP,你真的回答对了吗?》

今天就给大家讲一下TCP的流量控制是如何实现的吧~

可能很多人面试被问到过流量控制和拥塞控制的一个区别是什么,在回答这个问题之前,你肯定需要知道流量控制和拥塞控制到底是什么?

首先说下,为什么需要流量控制。一般来说,我们总是希望数据是能传输的更快一些,但是如果发送方发送数据过快,可能会导致接收方来不及接收导致数据丢失。至于流量控制(flow control)就是让发送方的发送速率不要太快,让接收方来得及接收。

接下来我们举一个例子,假设TCP建立连接后,接收方B告诉发送方A,接收方窗口大小(receiver window,简称rwnd)为400字节:
在这里插入图片描述

一开始,B告诉了A,我的rwnd = 400,所以发送方的发送窗口不能超过接收方给出的接收窗口rwnd。需要注意的是,我们之前讲TCP都是通过报文段的方式发送,但是TCP窗口的单位是字节。这里我们假设每个报文段为100字节的大小,并且数据报文段的初始值假设是为1(实际过程是个随机值)用seq表示,大写ACK表示确认位,小写ack表示确认字段的值(听不懂的童鞋肯定没有看洪爵写的TCP报文首部介绍,赶紧去阅读学习再来!)。

通过图片能发现,主机B一共进行了三次流量控制,第一次是把接收窗口减小到rwnd = 300,第二次减少到100,最后减少到0,所以接收窗口它是会动态的变化的,减到0之后,就不允许发送方发送数据了,除非接收方重新给发送方一个新的窗口值为止。需要注意的是,在告诉发送方窗口值的时候,ACK也需要置为1,因为只有ACK = 1确认号字段才是有效的。

不知道大家有没有考虑过这样一个问题,如果B向A发送了0窗口的报文段后,B的缓存区有了闲置空间后,B向A发送了rwnd = 400的报文段,但是这个报文段在传输的过程丢失了。A一直等不到B发送的非0窗口通知,B也在等待A发送数据。这会造成互相等待的死锁局面。

为了solve这个question,TCP它为每一个连接都设有一个持续计时器。这个计时器什么时候会启动呢?在TCP连接的某一方收到对方的0窗口通知,就会启动持续计时器,若时间到期了,就会发送一个0窗口探测报文段(包含有1字节的数据),对面会在确认这个探测报文段的时候给出现在的窗口值,如果窗口依然是0,那么收到这个报文段的一方就会重新设置持续计时器。如果不是0,那么就可以开始传输数据了。

需要注意的是,TCP中规定,即使设置为0窗口,也需要接收零窗口探测报文段、确认报文段和携带紧急数据的报文段。

好的,流量控制就介绍到这里啦!

愿每个人都能带着怀疑的态度去阅读文章并探究其中原理。

道阻且长,往事作序,来日为章。

期待我们下一次相遇!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

KnightHONG

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

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

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

打赏作者

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

抵扣说明:

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

余额充值