TCP 流量控制和拥塞控制

MSS:MAX  Segement Size  TCP 一次传输的最大数据长度
RTT: Roud Trip Time 从发送端发送开始到收到接收端的 ACK 的确认,总共经历的时间延迟。
RTO: 拥塞控制从发出原始包到重传该包到时间叫做 RTO (Retransmission TimeOut)

为啥需要流量控制?

发送数据的方式有两种:

  1. 每次发送一个,然后等待确认,然后再发送下一个
  2. 每次发送 N 个,然后等待对方一起确认
  • 方式1的问题,主要是效率太低,一个 RTT 只能发送一个包
  • 方式2的问题, 不能确保接收者一次性接收到这么多数据,同时网络带宽不一定够,可能会有丢包的情况。

方式1 的问题就是流量控制问题TCP,采用了滑动窗口解决
方式2 的问题说的是拥塞控制问题。

现在说下为啥需要流量控制:

TCP uses an end-to-end flow control protocol to avoid having the sender send data too fast for the TCP receiver to receive and process it reliably. Having a mechanism for flow control is essential in an environment where machines of diverse network speeds communicate.

简单的说,TCP 使用 端到端端流量控制协议来避免发送端数据发送数据太快,导致接收端不能可靠端接收和处理数据。 在不同网络网络速度的机器通讯环境中,流量控制是完全有必要的。

滑动窗口如何流量控制?

通过wireshark抓包数据,可以看到滑动窗口

上面的 Win 标识就是接收端告诉发送端自己还有多少缓冲区可以接收数据。

滑动窗口


接收方每次收到数据包,可以在发送确定报文的时候,同时告诉发送方自己的缓存区还剩余多少是空闲的,我们也把缓存区的剩余大小称之为接收窗口大小,用变量win来表示接收窗口的大小。发送方收到之后,便会调整自己的发送速率,也就是调整自己发送窗口的大小,当发送方收到接收窗口的大小为0时,发送方就会停止发送数据,防止出现大量丢包情况的发生。

流量控制的死锁问题

如果这个窗口不为0的应答在传输过程丢失,发送者一直等待下去,而接收者以为发送者已经收到该应答,等待接收新数据,这样双方就相互等待,从而产生死锁。

如何解决死锁问题

TCP 采用的持续基数器的方式解决死锁问题, 当发送者接收到窗口0 的应答之后就启动该计时器,时间一到,便主动询问接收者窗口大小。如果接收者仍然返回0 ,那么就重置该计时器,如果不为0,表示报文丢失,那么重置窗口,然后开始发送,这样避免的死锁问题。

流量控制和拥塞控制有什么区别

  • 拥塞控制是作用于网络的,防止过多数据注入网络, 避免网络出现负载过大的情况。
  • 流量控制是作用于接收者的,是用来控制发送者速率,使得接收者来得及接收,防止分组丢失。

拥塞控制

拥塞控制的4个算法:慢启动,拥塞避免,快速重传和快速恢复

拥塞窗口

TCP发送方新增的窗口,congestion window,简称cwnd。对应上文,发送方取拥塞窗口和滑动窗口的最小值作为发送上限,即谁严格谁起决定因素。

慢启动算法

  1. 连接建立开始, 发送方不了解网络的情况, cwind 初始化比较小的值, RFC j建议 2-4 MSS
If (MSS <= 1095 bytes)then win <= 4 * MSS;
If (1095 bytes < MSS < 2190 bytes)then win <= 4380;
If (2190 bytes <= MSS)then win <= 2 * MSS;
  1. 如果发送出去的包都被 ACK,说明没有达到拥塞,则增加拥塞窗口,每收到 N 个 ACK, 那么cwnd 增加 N 个 MSS, 呈指数增长。这个过程叫做慢启动。

拥塞避免

慢启动维护了 cwnd,还会维护拥塞窗口临界值 ssthresh, 一般是 2^16-1, 一旦达到 ssthresh ,进入拥塞避免。

拥塞避免环节,有点类似 redis,string里面点扩容环节,无论一个RTT收到多少个 ACK , 每次确认只增加一个 MSS, 呈线性关系增长。

快速重传和快速恢复

快速重传

进入拥塞避免之后, 最终还是会碰到拥塞点, 如果发送方此时得不到确认,发送方决定等待一端时间,如果一端时间后,还是得不到确认,那么就发起重传,这个过程叫做超时重传,这个从原始包发送到发起重传点这段时间,叫做 RTO(Retransmission TimeOut)

快速恢复

  • 在收到3个重复的ACK之后,ssthresh设置为cwnd的一半,然后把cwnd设置为ssthresh加3个单位的大小,接着重传丢失的报文段。
  • 如果这个时候再次收到重传的ACK,那么拥塞窗口增加1。
  • 如果收到的是新的数据包的ACK,把cwnd设置为第一步的ssthresh的值。为什么这么做,因为如果收到的新的ACK,说明网络已经恢复了,可以进入拥塞避免的线性增长阶段了。
  • 第一个例子里为什么加3呢,因为这个时候连续的收到3个ACK包,那么可以认为网络还有3个单位大小的余额,同时也可以这么想,说明有3个“老”的数据包已经从网络上离开了。

欢迎关注:程序员开发者社区

参考资料

  • https://zhuanlan.zhihu.com/p/37379780
  • https://www.cnblogs.com/iou123lg/p/9017044.html

TCP流量控制和拥塞控制相关推荐

  1. TCP/IP协议族之运输层(TCP流量控制和拥塞控制 [1])

    TCP的流量控制 1. 利用滑动窗口实现流量控制 如果发送方把数据发送得过快,接收方可能会来不及接收,这就会造成数据的丢失.所谓流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收. 利用滑动 ...

  2. 计算机网络·详解TCP流量控制,拥塞控制,运输连接管理

    文章目录 一.TCP流量控制 二.TCP拥塞控制 三.TCP运输连接管理 一.TCP流量控制 目的:让发送方不要发太快(既让接收方接收得过来,又不让网络发生拥塞) 取决于接收方rwnd接收能力 利用连 ...

  3. 计算机网络之(7):TCP流量控制、拥塞控制 + 网络层

    文章目录 TCP 流量控制 Go back N Selective Repeat Go back N v.s. Selective Repeat 流量控制中的问题 方法 1:接收方主动 方法2: 发送 ...

  4. 计算机网络---TCP流量控制和拥塞控制

    (一) TCP 流量控制 TCP提供流量控制服务来消除发送方(发送速率太快)使接收方缓存区溢出的可能性,因此 流量控制是一个速度匹配服务(让发送方慢一点,要让接收方来得及接收,实现匹配发送方的发送速率 ...

  5. TCP流量控制与拥塞控制(重要)

    本文参考了一些优秀的书籍->图解TCP/IP,TCP协议卷一,小林coding,还有等等的知乎,百度. 小林coding  小林coding 知乎牛客的文章 : 万字长文 | 23 个问题 TC ...

  6. TCP流量控制与拥塞控制区别

    1. 流量控制(端到端) 流量控制,是利用滑动窗口协议控制发送端流量,是为了解决发送数据过快导致接收方来不及接收的问题. 具体是消息接收方会发送流量控制报文,通知发送方窗口大小,发送方发送的数据大小不 ...

  7. 网络 -- TCP流量控制、拥塞控制

    文章目录 1.流量控制部分 1.1 滑动窗口 1.2 流量控制 1.3 发送方的延迟Nagle算法 2. 拥塞控制 流量控制:点对点关系;发送方与接收方的通信, 主要是接收方能力较差时引起问题. 当发 ...

  8. TCP流量控制、拥塞控制

    1. 流量控制 1.1 什么是流量控制?流量控制的目的? 如果发送者发送数据过快,接收者来不及接收,那么就会有分组丢失.为了避免分组丢失,控制发送者的发送速度,使得接收者来得及接收,这就是流量控制.流 ...

  9. TCP流量控制和拥塞控制 最新网狐荣耀版源码下载

    搭建准备 1.网狐荣耀版源码下载: 下载 2.visual studio 2015 下载 3.下载jdk1.8 安装步骤: 一.安装visual studio 2015,在百度就能搜索到下载地址,在教 ...

最新文章

  1. 从ftp获取文件并生成压缩包
  2. Day 29:编写你的第一个 Google Chrome 扩展程序
  3. 有源降噪装置专利(转)
  4. 24 PP配置-生产车间控制-定义工单号码范围
  5. 心血来潮,小试c++11
  6. python下载numpy库_安装numpy库
  7. 动态规划——洛谷1020_导弹拦截(1999年的)
  8. 从后台servlet中,获取jsp页面输入的值,来删除用户一行信息
  9. 小学生计算机基础知识课件,计算机基础知识课件(图表部份).ppt
  10. 经典莱斯康混响插件LX480 Complete限时43%OFF
  11. 软件工程与计算-11-人机交互设计
  12. 六年级计算机学习,小学六年级计算机学习教案(24页)-原创力文档
  13. java手机刷机精灵,按钮救星(按键精灵所有者读写权限)
  14. 算法相关-互联网计算广告学
  15. 使用python输出真值表
  16. cyk的小学数学题 小学数学
  17. 透过华为军团看科技之变(二):机场轨道
  18. python--真气网监测站点数据的抓取
  19. 天气预报显示服务器拒绝访问,天气预报
  20. [连载 1] 如何将协议规范变成开源库系列文章之 WebSocket

热门文章

  1. 十亿用户数据,上千个用户标签维度,用户分析怎么做?
  2. Windows--远程桌面账号密码输入正确却显示凭据失败
  3. 双节锂电升压充电芯片FP6291
  4. STM32单片机蓝牙APP语音识别智能家居系统风扇灯空调窗帘温度湿度入侵检测
  5. MEM/MBA 写作-论说文(04)文章结构
  6. 在iOS上增加手势锁屏、解锁功能
  7. 德国语言考试c1,德国留学语言考试
  8. STM32F10x TIM1 CH3/CH4 的重映射PWM输出
  9. keil 生成三角波dac0832_傻瓜式印章制作工具,一键生成,不需要的不要看。
  10. 百度搜索低调改版搜索界面!