tcp拥塞控制整理

简介: tcp拥塞控制整理

tcp拥塞控制相关整理

每次面试的时候都会被聊到这个话题,但每当要说时,就发现并不能侃侃而言。

按照自己的理解整理tcp拥塞控制一些知识,参考网络,做汇总笔记,如有不对,请指正~

概述tcp

tcp是流式,可靠的传输控制协议。

1:流式传输: 计算机数据的本质是0/1序列(文本流),tcp协议实现了端口到端口的通信,虚拟了文本流的通信。

但是,传输层的下一层是网络层,即ip层,会把数据打包发送,ip层的MTU长度限制,会使tcp协议将数据切割成片段,打包依次发送。

2:可靠传输:为了保证数据的可靠传输,tcp采用ack回复+重新发送机制保证(网络中丢包问题)

3:思考:ack和重新发送机制,必然影响到tcp的传输效率,tcp如何在传输可靠与传输效率上做控制的?

==》传输可靠:ack和重传机制

==》传输效率:拥塞控制(发送方)和流量控制(接收方)

拥塞控制和流量控制

拥塞控制:防止过多的数据注入网络,避免网络数据负载过大。(作用与发送方)(慢启动 拥塞避免 快重传 快恢复)

流量控制:告知发送方,接收方可以接收到的数据缓冲区大小,保证数据能完整接收到。(作用于接收方)

流量控制(作用于接收端)

让发送端发送频率不那么快,保证接收端能来得及接收。

tcp协议中定义了一个16位的窗口大小(65535字节),描述了接收方接收窗口大小。

tcp的发送方发送窗口大小,不能大于接收端发回的窗口大小。(如果接收方窗口大小返回0,就停止发送,直到发送非零窗口大小(如果这个报文丢失会死锁?定时器解决,零窗口探测))

tcp滑动窗口(连续ARQ协议):

tcp流量控制是通过滑动窗口实现的:连续ARQ协议

回退N帧ARQ协议

==》接收端丢弃第一个没接收到的数据包后面的所有包,

==》发送端收到NACK后,从NACK中指示的包

选择性重传ARQ协议

==》发送端连续发送数据包但对每个数据包都设有个一个计时器

==》当在一定时间内没有收到某个数据包的ACK时,发送端只重新发送那个没有ACK的数据包。

tcp滑动窗口概念:

发送方的拥塞窗口:一般就是我们所说的滑动窗口

接收窗口:tcp首部字段中的一个16bit的字段,描述当前套接字的接收窗口大小。

本质是描述接收方的tcp数据缓冲区大小,在tcp首部中含有一个16bit的字段,发送方会根据这个数据计算自己能发送的数据的长度。

如果接收方窗口大小为0,则发送方停止发送数据。

tcp滑动窗口的实现:

tcp拥塞窗口大小:采用慢启动和拥塞控制算法机制控制,参考下文。

这里有几个概念,一直很模糊:

接收窗口(RWND):tcp首部中一个16bit字段(可扩展),ack回复中会带该字段,描述了接收窗口大小,发送方发送数据要小于该值,达到限流。

拥塞窗口(CWND):发送方维护的一个窗口大小,是动态变化的,通过慢启动,拥塞避免控制方案。

发送窗口(swnd):取拥塞窗口和接收窗口中的较小值,一般和拥塞窗口 值大小一样。

慢启动门限(ssthresh):通过慢启动对阻塞窗口进行控制使,cwnd小于ssthresh时成倍数增长,大于ssthresh时加1控制,该值一开始限定,也是动态变化的。

最大报文段长度(MSS): tcp这里一般用MTU的值,其实要协商的,一般MSS值为1460,我们所描述的拥塞窗口大小,是以此为单位的

总结:流量控制即,通过拥塞窗口和接收窗口,控制发送数据的大小。

拥塞控制(作用与发送端)

拥塞控制作用于网络,防止过多的数据注入网络,造成网络负载过大(路由器缓冲区等可以造成网络阻塞)。

tcp拥塞控制方法:

1:慢启动,拥塞避免

2:快重传,快恢复

慢启动,拥塞避免(这里得拥塞窗口和发送窗口一直相等变化)

拥塞窗口:发送方维持了一个动态变化的窗口,取决于网络的拥塞情况。

慢启动和拥塞避免算法(描述了网络的拥塞状况),主要控制了对拥塞窗口的限制。

慢启动算法:

在主机开始时,逐步探测网络状况,改变发送窗口的大小,加倍增长。

拥塞避免算法:

在慢启动的基础上,当发送窗口大于慢启动门限值时,使用该算法改变窗口大小。 加1

判断网络出现拥塞:

在改变发送窗口进行数据传输时,如果没有按时收到确认,可以认为时网络拥塞,这时候,把慢启动门限值降为当前拥塞窗口值得一半,重置拥塞窗口的大小为1,重新进行慢启动运算。

慢启动算法和拥塞避免算法控制“发送窗口改变”:

1:初始化时,拥塞窗口cwnd为1,慢启动门限定位为16

2:采用慢启动算法,实现数据得传输,如果没有发送网络拥塞,发送窗口以2的倍数增长(单位时MSS)(如果发送网络拥塞时,依次执行第5步)。

3:当下一次发送窗口(即拥塞窗口)的值大于慢启动门限值(ssthresh),改为拥塞避免算法,每次发送窗口+1

4:继续进行传输数据,发送窗口(拥塞窗口)值一直在变化,增大。

5:当发送窗口增大到出现网络拥塞时(没有按时收到ack),把慢启动门限值修改为当前拥塞窗口的1/2, 重置当前发送窗口为1,重新开始慢启动,依次第二步循环。 ===》即发生超时重传的场景

注意:这里在滑动窗口的基础上,有已经接收到对端回复,发送但没有接收到对端ack回复,待发送的数据等数据的维护,以及滑动窗口的移动。

快重传算法和快恢复算法

快重传和快恢复时配合使用,一般发生快重传时,就会触发执行快恢复。

快重传:

发送方只要连续收到三个重复确认的序号,会立即重发没有收到的报文。

tcp认为这种情况不严重,只丢失了一部分数据,进入快恢复算法:

1:改变拥塞窗口值为原来的一半(这里的拥塞窗口和发送窗口一样)

2:改变慢启动门限为拥塞窗口值(第一步计算后的),

3: 继续执行拥塞避免算法。

汇总

发送窗口,拥塞窗口,接收窗口

===》发送窗口 是拥塞窗口和接收窗口中的较小值,一般和拥塞窗口一致,因为接收窗口一般很大

我们通常所说的窗口大小,以MSS(最大报文段长度为单位)

流量控制: 通过接收窗口(tcp首部16bit的字段,可扩展)限制,使接收端能正常接收到数据(该值为0停止发送)。

拥塞控制(调整拥塞窗口,对发送数据进行控制,发送窗口动态变化的,慢启动门限也动态变化):

==》使用慢启动和拥塞避免算法,

==》快重传和快恢复算法

拥塞窗口的基础上,内部有已经发送,允许发送,还没有不允许发送,数据包的一个控制,延迟ack等的控制。

除此之外,tcp其他可靠性通过定时器实现:

==》建立连接定时器,重传定时器(RTO),坚持定时器(persist timer),延迟定时器(Delayed ACK),保活定时器(Keep Alive),FIN_WAIT_2定时器,TIME_WAIT定时器

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
存储 C语言
大端存储和小端存储
1.大小端字节序 2.大端存储 3.小端存储 4.为什么会有大小端存储模式之分? 5.如何判断当前机器是大端存储还是小端存储 方法1 方法2
4387 0
|
网络协议 安全 网络安全
【UDP】——为什么 UDP 数据包不能超过 512 个字节
一开始了解的是 DNS 服务使用的是 UDP 协议,后面看到 DNS 服务主要使用 UDP 协议,在少数情况(传输的数据超过 512 个字节)下也会使用 TCP 协议,因为 UDP 数据包不能超过 512 个字节。那问题来了,为什么 UDP 数据包不能超过 512 个字节呢?
5269 0
【UDP】——为什么 UDP 数据包不能超过 512 个字节
|
7月前
|
数据采集 传感器 人工智能
数字孪生:虚实融合驱动产业变革的核心技术引擎
数字孪生技术正从概念走向产业核心,广泛应用于智能制造、智慧能源、智慧城市等领域,实现全生命周期管理与智能决策。本文系统解析其技术本质、核心体系、应用实践及未来趋势,并结合奥维数字等本土企业案例,展现中国在该领域的创新突破与产业化前景。
1668 0
|
网络协议 算法 安全
TCP协议(三次握手、流量控制、拥塞控制)
TCP协议是一种可靠的传输层通信协议,通过三次握手建立连接,确保数据安全传输。流量控制通过接收窗口避免接收方缓冲区溢出,拥塞控制则利用拥塞窗口调节网络传输速度,防止网络拥堵。三者协同工作,保障TCP在复杂网络环境中实现高效、可靠的数据传输。
3604 11
|
11月前
|
安全 Linux API
Fmt库在CentOS 7的应用指南
Fmt库为C++提供了一个安全、高效的字符串格式化机制,尤其是对比传统的C风格字符串操作函数,Fmt库大幅提高了开发效率,减少了运行时错误。它的现代C++设计使得代码既简洁又表意清晰,大大降低了代码的维护难度。
443 11
|
11月前
|
达摩院 安全 Anolis
Anolis OS 23 架构支持家族新成员:Anolis OS 23.3 版本及 RISC-V 预览版发布
Anolis OS 23.3在保障基础功能持续演进、完善安全漏洞的修复的同时,实现了对 RISC-V 的初步支持。
|
存储 前端开发 安全
【面试题】: bs架构与cs架构的区别以及各自优缺点
bs架构与cs架构的区别以及各自优缺点
9172 0
|
存储 负载均衡 NoSQL
一文让你搞懂 zookeeper
一文让你搞懂 zookeeper
20180 16
|
网络协议 算法 程序员
网络必修课:以太网报文格式详解
嗨,大家好!今天,我要带大家深入了解以太网报文格式,这是现代网络通信的重要基础。无论你是网络工程师、开发者,还是对技术感兴趣的朋友,这篇文章都将为你揭开以太网的神秘面纱,让你更好地理解和应用这一关键技术。准备好了吗?让我们开始吧!
1145 4
|
Java Maven
修改配置maven镜像仓库位置,将maven镜像更换成阿里镜像
修改配置maven镜像仓库位置,将maven镜像更换成阿里镜像
7187 0