TCP拥塞控制

TCP拥塞控制

文章目录

一、前言

TCP除了可靠传输和流量控制机制,还有一个机制------拥塞控制~

二、梳理

  • 可靠传输:保证传输过程中不丢包
  • 流量控制:解决发送端和接收端处理速度不协调的问题
  • 拥塞控制:网络集合之间的互相关系

三、拥塞控制

3.1 概念

在某段时间内,若对网络中某一资源的需求超过了该资源所提供的可用部分,网络性能就要变坏,这种情况就叫做拥塞(congestion)

网路层没有重传机制 ,一定会丢包。整个过程是类似交通堵塞的。

怎么解决呢?拥塞控制关注的是整体。

这里也采用窗口的方法,先试探,如果路不好走就降低速度或采取别的路。相比之下,流量控制是考虑端与端的传输,更讲究协商的方法。

  • 计算机网络中的链路容量(带宽)、交换节点中的缓存和处理机等都是网络的资源
  • 拥塞控制是一个全局性的过程
    • 涉及到所有的主机、路由器,以及与降低网络传输性能有关的所有因素
    • 是需要靠所有节点共同努力的结果
    • 防止过多的数据注入到网络中,使网络能够承受现有的网络负荷
  • 相比而言,流量控制是点对点通信的控制

3.2 拥塞控制的常用算法

  • 方法概述

    慢开始(slow start,慢启动)、拥塞避免(congestion avoidance)、快速重传(fast retransmit)、快速恢复(fast recovery)

  • 几个缩写

    • cwnd(congestion window):拥塞窗口

      试探出来的。一开始窗口很小,随着试探,窗口不断增大(但是不能超过接收窗口)

    • rwnd(receive window):接收窗口

    • swnd(send window):发送窗口,swnd = min(cwnd, rwnd)

      发送窗口就是拥塞窗口和接收窗口的最小值

3.2.1 慢开始

MSS:最大段的长度,发送数据是按段发送的,尽管它的单位是字节,因此需要告知最大段是多少。

先发了100的数据包,进行试探。发M2和M3实际是确认1次

  • cwnd的初始值比较小,然后随着数据包被接收方确认(收到一个ACK)
    • cwnd成倍增长(指数级)
    • 当增长到会丢包时开始往回调整(一直在试)
3.2.2 拥塞避免
  • ssthresh(slow strat threshold)):慢开始阈值,cwnd达到与之后,以线性方式增加

    不是到了阈值就丢包哦~

  • 拥塞避免(加法增大):拥塞窗口缓慢增大,以防止网络过早出现拥塞

    不会超过接收窗口的

  • 乘法减小:只要网络出现拥塞,把ssthresh减为拥塞峰值的一半,同时执行慢开始算法(cwnd又恢复到初始值)

  • 当网络出现频繁拥塞时,ssthresh值就下降的很快

3.2.3 快重传

如何出现快速丢包呢?

当M3丢包时,此时M4、M5等已经发送,正常来说,应该回一个SACK(选择确认)包,但是现在变了,继续重复确认M2(请求发送M3),当收到3个连续的M2重复确认,才会重传M3。而M4、M5、M6都会记录的(发送方有缓存),最后会确认M6。

  • 接收方

    • 每收到一个失序的分组后就立即发出重复确认
    • 使发送方及时知道有分组没有到达
    • 而不要等待自己发送数据时才进行确认
  • 发送方

    • 只要连续 收到3个重复确认(总共4个相同的确认 ),就应当立即重传对方尚未收到的报文段

      在这里M3不属于超时重传,是快重传,不会调整cwnd(拥塞窗口)

    • 而不必继续等待重传计时器到期后再重传

    改进机制:对于个别丢失的报文段,发送方不会出现超时重传,也就不会误认为出现了拥塞而错误地把拥塞窗口cwnd的值减为1。实践证明,使用快重传可以使整个网络的吞吐量提高约20%

3.2.4 快恢复

现在的主流方法

  • 当发送方连续收到3个重复确认,说明网络出现拥塞
    • 就执行"乘法减小"算法,把ssthresh减为拥塞峰值的一半
  • 与慢开始不同之处是现在不执行慢开始 算法,即cwnd现在不恢复到初始值
    • 而是把cwnd值设置为新的ssthresh值(减小后的值)
    • 然后开始执行拥塞避免算法("加法增大"),使拥塞窗口缓慢地线性增大

到底怎么界定出现3个重复确认是个别情况还是拥塞?

快重传 + 避免拥塞 + 慢开始 / 快恢复都是可以的,甚至阈值可以在编程时自己指定

四、小结

到此,滑动窗口才真正有了含义,并不单单取决于通信双方的约定,更考虑的是集合的通信,是不断地试探,才确定下来的。

相关推荐
米羊1212 小时前
fastjson (1概述)
网络·安全
登山人在路上2 小时前
Nginx负载均衡策略
服务器·nginx·负载均衡
zzhclc2 小时前
pyrosm windows 如何搭建环境 使用conda
linux·运维·服务器
bkspiderx2 小时前
HTTP跨域问题深度解析:4种实用解决方案与场景适配
网络·http·nginx反向代理·cors·跨域资源共享·http跨域问题
沐浴露z2 小时前
详细解析 SYN泛洪
服务器·网络
QT 小鲜肉2 小时前
【Linux命令大全】001.文件管理之slocate命令(实操篇)
linux·运维·服务器·数据库·笔记
北方的流星2 小时前
华为PPPoE协议的配置
运维·网络·华为
zfj3213 小时前
Linux 系统 I/O 监控命令大全
linux·服务器·数据库·io·监控
oMcLin3 小时前
Linux 系统服务器的 KVM 虚拟化实战:搭建、配置与管理
linux·运维·服务器