TCP 重传、滑动窗口、流量控制、拥塞控制

简介: TCP 重传、滑动窗口、流量控制、拥塞控制

小林NB

TCP 重传

TCP 实现可靠传输的方式之一。

当发送端的数据到达接收主机时,接收端主机会返回一个确认应答消息,表示已收到消息;如果消息丢失导致接收方没有接收到消息,就会通过重传机制解决

超时重传机制

在发送数据时,设定一个定时器,当超过指定的时间后,没有收到对方的 ACK 确认应答报文,就会重发该数据,也就是我们常说的超时重传

超时重传的时间称为RTO,超时重传时间 RTO 的值应该略大于报文往返 RTT 的值

  • 当超时时间 RTO 较大时,重发就慢,性能差;
  • 当超时时间 RTO 较小时,会导致可能并没有丢就重发,于是重发的就快,会增加网络拥塞,导致更多的超时,更多的超时导致更多的重发

大于报文往返 RTT:

RTT 指的是数据发送时刻到接收到确认的时刻的差值,也就是包的往返时间。

它是一个动态变化的值,需要根据实际网络状况得到的采样,再通过一定的算法计算得到

如果超时重发的数据,再次超时的时候,又需要重传的时候,TCP 的策略是超时间隔加倍。

也就是每当遇到一次超时重传的时候,都会将下一次超时时间间隔设为先前值的两倍。两次超时,就说明网络环境差,不宜频繁反复发送。

快速重传

超时触发重传存在的问题是,超时周期可能相对较长。

TCP 还有另外一种快速重传(Fast Retransmit)机制,它不以时间为驱动,而是以数据驱动重传

快速重传的工作方式是每次ACK当前最后一个未接收到(或者是丢失了)的段号。当收到三个相同的 ACK 报文时,会在定时器过期之前,重传丢失的报文段。

如果已经接收到了后面的序号,前面丢失了,如何知道该重传哪些呢?

使用SACK(selective acknowledgement)方法可以解决, 选择性确认

SACK 方法

这种方式需要在 TCP 头部「选项」字段里加一个 SACK 的东西,它可以将已收到的数据的信息发送给「发送方」,这样发送方就可以知道哪些数据收到了,哪些数据没收到,知道了这些信息,就可以只重传丢失的数据

Duplicate SACK 方法

Duplicate SACK 又称 D-SACK,主要使用了 SACK 来告诉「发送方」有哪些数据被重复接收了。

  1. ACK 丢包描述:
    如果多个连续的ACK包丢失,发送方会认为丢包了,如果超时就会触发了重传机制
    措施:
    如果重传后成功接收首个数据包,在SACK字段标记这段数据报号范围。
    这样就能告诉发送方,之前的包已经收到了,是ACK包丢失导致了重复发包,然后继续按照ACK后面发包
  2. 网络延时描述:
    某个数据包因为网络问题很久没到达,该包触发快速重传后,又发送了一次;最后有两个包到达了接收方
    措施:
    SACK字段标记这段重复数据报号范围,告知发送放该段重复发送
  3. 小结
  1. 可以让「发送方」知道,是发出去的包丢了,还是接收方回应的 ACK 包丢了;
  2. 可以知道是不是「发送方」的数据包被网络延迟了;
  3. 可以知道网络中是不是把「发送方」的数据包给复制了;

滑动窗口

流量控制

TCP 的流量控制是一种机制,用于确保在数据发送方和接收方之间的数据传输速率匹配,以避免接收方被过多的数据淹没而导致缓冲区溢出。以下是关于 TCP 流量控制的介绍:

  1. 原理
  • TCP 流量控制基于滑动窗口机制,其中每个 TCP 连接都有一个接收窗口和一个发送窗口。
  • 接收方通过 TCP 报文中的窗口字段通知发送方自己的可接收字节数量,即接收窗口大小。
  • 发送方根据接收窗口大小调整自己的发送速率,确保不会发送超出接收方缓冲区容量的数据量。
  • 发送窗口 swnd 和接收窗口 rwnd 是约等于的关系
  1. 过程
  • 发送方发送数据,并等待接收到对应的确认应答(ACK)。
  • 接收方根据接收缓冲区的空闲空间大小动态调整接收窗口的大小,并通过 ACK 报文通知发送方。
  • 发送方根据接收窗口大小调整发送窗口,确保发送的数据量不超过接收方的缓冲区容量。
  1. 应用
  • TCP 流量控制广泛应用于各种网络应用中,如 Web 浏览器、文件传输、视频流媒体等,确保数据传输的稳定和高效。

拥塞控制

在网络出现拥堵时,如果继续发送大量数据包,可能会导致数据包时延、丢失等,这时 TCP 就会重传数据,但是一重传就会导致网络的负担更重,于是会导致更大的延迟以及更多的丢包,这个情况就会进入恶性循环被不断地放大....

于是,就有了拥塞控制,控制的目的就是避免「发送方」的数据填满整个网络。

为了在「发送方」调节所要发送数据的量,定义了一个叫做「拥塞窗口」的概念。

拥塞窗口」是发送方维护的一个的状态变量,它会根据网络的拥塞程度动态变化的

前面提到的TCP发送窗口,它的大小是MIN(拥塞窗口,接收窗口)

只要网络中没有出现拥塞,cwnd 就会增大;网络中出现了拥塞,cwnd 就减少;

只要「发送方」没有在规定时间内接收到 ACK 应答报文,也就是发生了超时重传,就会认为网络出现了拥塞。

慢启动

启动的意思就是一点一点的提高发送数据包的数量。

具体规则是:当发送方每收到一个 ACK,拥塞窗口 cwnd 的大小就会加 1。 容易理解这样实现了指数增长

慢启动并不会无限增长,有一个叫慢启动门限 ssthresh (slow start threshold)状态变量。

  • cwnd < ssthresh 时,使用慢启动算法。
  • cwnd >= ssthresh 时,就会使用「拥塞避免算法」。

拥塞避免算法

具体规则是:每当收到一个 ACK 时,cwnd 增加 1/cwnd。 此时窗口增长速度为线性。

线性的大概原因是,每当发送串口内的所有数据都经过了一轮发送后,且收到了ACK,才会让cwnd增加一

就这么一直增长着后,网络就会慢慢进入了拥塞的状况了,于是就会出现丢包现象,这时就需要对丢失的数据包进行重传。

当触发了重传机制,也就进入了「拥塞发生算法」

拥塞发生

当网络出现拥塞,也就是会发生数据包重传,重传机制主要有两种:

超时重传

这个时候,ssthresh 和 cwnd 的值会发生变化:

  • ssthresh 设为 cwnd/2
  • cwnd 重置为 1 (是恢复为 cwnd 初始化值,我这里假定 cwnd 初始化值 1)
  • 重新进入慢启动状态

快速重传

TCP 认为这种情况不严重,因为大部分没丢,只丢了一小部分,则 ssthreshcwnd 变化如下:

  • cwnd = cwnd/2 ,也就是设置为原来的一半;
  • ssthresh = cwnd;
  • 进入快速恢复算法

快速恢复

快速恢复算法如下:

  • 拥塞窗口 cwnd = ssthresh + 3 ( 3 的意思是确认有 3 个数据包被收到了);
  • 重传丢失的数据包;
  • 如果再收到重复的 ACK,那么 cwnd 增加 1;
  • 如果收到新数据的 ACK 后,把 cwnd 设置为第一步中的 ssthresh 的值,原因是该 ACK 确认了新的数据,说明从 duplicated ACK 时的数据都已收到,该恢复过程已经结束,可以回到恢复之前的状态了,也即再次进入拥塞避免状态;

快速恢复是拥塞发生后慢启动的优化,其首要目的仍然是降低 cwnd 来减缓拥塞,所以必然会出现 cwnd 从大到小的改变。

过程2(cwnd逐渐加1)的存在是为了尽快将丢失的数据包发给目标,从而解决拥塞的根本问题(三次相同的 ACK 导致的快速重传),所以这一过程中 cwnd 反而是逐渐增大的。

学习自小林coding


相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务&nbsp;ACK 容器服务&nbsp;Kubernetes&nbsp;版(简称&nbsp;ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
相关文章
|
5天前
|
网络协议 算法 网络性能优化
TCP滑动窗口、流量控制及拥塞控制详解
TCP滑动窗口、流量控制及拥塞控制详解
|
5天前
|
缓存 人工智能 算法
TCP的滑动窗口和拥塞控制
TCP的滑动窗口和拥塞控制
14 0
|
5天前
|
网络协议 网络架构
什么是TCP重传?
TCP(Transmission Control Protocol)是一种可靠的、面向连接的传输层协议,用于在网络上可靠地传输数据。在TCP中,数据通过数据包进行传输,而TCP重传是TCP协议中的一个重要机制,用于确保数据的可靠传输。
23 1
|
5天前
|
网络协议 算法 网络性能优化
|
5天前
|
缓存 网络协议 算法
【传输层】TCP、三次握手、四次挥手、可靠传输、TCP拥塞控制、慢开始、拥塞避免、快重传、快恢复
【传输层】TCP、三次握手、四次挥手、可靠传输、TCP拥塞控制、慢开始、拥塞避免、快重传、快恢复
66 0
|
6月前
|
缓存 网络协议 算法
图解TCP、UDP,流量控制,拥塞控制,一次看懂
图解TCP、UDP,流量控制,拥塞控制,一次看懂
|
7月前
|
网络协议
TCP特性的滑动窗口,流量控制
TCP特性的滑动窗口,流量控制
|
9月前
|
网络协议 网络性能优化 网络架构
拥塞控制
拥塞控制
97 0
|
11月前
|
存储 网络协议 网络性能优化
TCP 滑动窗口详解(非常实用)
TCP 滑动窗口详解(非常实用)
|
网络协议 算法 网络性能优化
详解 TCP(三次握手 + 四次挥手 + 滑动窗口 + 拥塞控制 + 和 UDP 做对比)
1. TCP / IP五层模型和OSI七层模型 1)OSI七层模型 2)TCP/IP 五层模型 2. TCP和UDP 1) TCP首部结构 2)UDP首部结构 3)TCP和UDP的区别 2.2 UDP和TCP对应的应用场景 3. TCP 建立连接时的三次握手 1)为什么需要三次握手,而不是两次 2)为什么是三次握手,而不是四次握手 3)如果第三次握手的 ACK 报文丢失,会发生什么 4. TCP 建立连接时的四次挥手 1)为什么需要四次挥手 2)为什么主动断开方的 TIME_WAIT 状态必须等待 2MSL 5. TCP 如何保证可靠性 1)检验和 2)序列号/确认应答: 3)滑动窗口:
155 0