计算机网络——TCP拥塞控制

前置概念:

  1. MSS:TCP连接建立时,收发双方协商通信时每一个报文段所能承载的最大数据长度(不包括文段头)。
  2. ACK:即接收方发送的确认字符,表示接收到的字符无错误。ACK是累计确认,当ACK为n,表示0 ~ n-1字节已经成功接收且无误,希望发送方下一次从Seq=n开始发送。
  3. 滑动窗口:为实现流水线可靠数据传输,使得发送方批量发送数据,接收方批量接收数据而引入。发送方窗口内数据包:(可发送&&未发送) || (已经发送&&未收到确认反馈)
  4. RTT:一个数据包来回的时间

 

新概念:

  1. 拥塞窗口:一种滑动窗口,根据反馈实时调整大小,限制发送方发送速率,从而避免拥塞。
  2. 慢启动阶段:拥塞窗口从1个MSS开始,每接收到一个ACK后大小翻倍,指数增长。
  3. 拥塞避免阶段:拥塞窗口大小达到慢启动阀值后进入拥塞避免阶段。每经过一个RTT,滑动窗口大小+1个MSS,线性增长。
  4. 快重传:接收方收到失序的报文后,对已经成功接收到的报文段发送重复确认(冗余ACK)。发送方累计收到3个重复确认后,就知道重复确认的下一个报文段丢失,随即立刻重传。
  5. 快恢复:快重传后,通信双方可知网络中有个别报文段丢失,使用快恢复算法,设置阀值为当前窗口的一半,设置窗口大小为当前窗口的一半+3个MSS。快恢复后会进入拥塞避免阶段。

 

拥塞控制方法:

  1. 超时重发时,设置慢启动阀值为当前滑动窗口的一半,之后设置滑动窗口为1个MSS。
  2. 重复确认时(3个冗余ACK),执行快重传和快恢复,设置慢启动阀值为当前滑动窗口的一半,并设置滑动窗口大小为:慢启动阈值+3个MSS。乘性减小。
  3. 窗口大小阀值以下,慢启动,乘性增长;阀值以上,拥塞避免,线性增长

 

 

过程分析:

  刚开始传输时,由于没有阀值,进入慢启动阶段,拥塞窗口指数增长。由于指数增长,因此一定会发生拥塞,部分数据包超出缓存而被丢弃,引发超时重传。超时后,拥塞窗口回到1个MSS,且此时有了阀值。1个MSS一定小于阀值,因此重新进入慢启动阶段,直到到达阀值。到达后,进入拥塞避免阶段,窗口随着时间线性增大(每经过一个RTT,+1个MSS)。

  如果监测到3个冗余ACK,此时TCP执行快重传和快恢复,重新设置阀值(当前窗口的一半)和窗口大小(当前窗口的一半+3个MSS),此时拥塞窗口一定比阀值大3个MSS,因此仍然处于拥塞控制阶段,窗口大小线性增长。

  如果监测到超时,拥塞窗口回到1个MSS,设置阀值,重新进入慢启动阶段。

 

TCP的相对公平性:

  使用同一个路由器的各主机,按照拥塞控制模型,必定发生拥塞。利用拥塞避免阶段滑动窗口大小乘性减小的特点,速度快的主机先拥塞,乘性减小,给速度慢的主机提速反向超的机会。若速度快的和速度慢的同时拥塞,结果乘性减小后两者差距也会变小。

  

 

 

posted @   汇编不会编  阅读(411)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示