TCP的可靠性传输机制

简介: TCP的可靠性传输机制

1. TCP是一种面向连接,可靠的,字节流的传输协议


TCP使用了 重传机制,滑动窗口,流量控制,拥塞控制来实现可靠的传输


重传机制


1.快速重传


当接收端连续发送3个相同ack给发送端的时候,就证明了ACK的数据在传输过程中丢失,就会立刻发生重传机制。快速重传机制只解决了一个问题,就是超时时间的问题,但是它依然面临着另外一个问题。就是重传的时候,是重传之前的一个,还是重传所有的问题。


比如对于上面的例子,是重传 Seq2 呢?还是重传 Seq2、Seq3、Seq4、Seq5 呢?因为发送端并不清楚这连续的三个 Ack 2 是谁传回来的。


根据 TCP 不同的实现,以上两种情况都是有可能的。可见,这是一把双刃剑。


2.SACK重传机制


通过 添加sack来记录已经收到的数据序列号,这样就能清楚的分清楚上一次重传丢失的序列号来自哪个序列。


拥塞控制


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


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


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


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


发送窗口swnd, 接收窗口rwnd。


拥塞窗口变化规则:


  • 只要网络中没有出现拥塞,cwnd增大

  • 网络中出现了拥塞,cwnd就会减少

  • 如果发送方没有在规定时间内接收到ACK应答报文,就是发生了超时重传,就被当作网络中出现了拥塞。


拥塞控制的四个算法:


  1. 1.慢启动

  2. 2.拥塞避免

  3. 3.拥塞发生

  4. 4.快速恢复

  5. 一. 慢启动

  6. 当发送方没收到一个ACK,拥塞窗口cwnd的大小就会加1

  • cwnd初始值 = 1, 收到ACK确认应答之后,cwnd + 1,每次发送2个

  • 当收到2个的ACK取人应答之后,cwnd增加2,于是发送4个

  • 当收到4个的ACK确认的时候,每个cwnd都加1,就是发送4 + 4 = 8个

有一个叫慢启动门限 ssthresh (slow start threshold)状态变量。


当cwnd < ssthresh时,使用慢启动算法


当cwnd >= ssthresh时,使用拥塞避免算法


二. 拥塞避免算法


ssthresh的大小 约等于 65535字节


那么进入拥塞避免算法后,它的规则是:每当收到一个 ACK 时,cwnd 增加 1/cwnd。


当 8 个 ACK 应答确认到来时,每个确认增加 1/8,8 个 ACK 确认 cwnd 一共增加 1,于是这一次能够发送 9 个 MSS 大小的数据,变成了线性增长。

20200905112400609.png

使用拥塞避免算法时减缓拥塞窗口的增长速率。最后当网络足够拥塞的时候,就会发生丢包现象,出现重传。


然后就会触发重传机制,执行拥塞发生算法


三. 拥塞发生


当发生数据包重传之后,有两种重传机制:


  • 超时重传

  • 快速重传

超时重传: 发生了超时重传之后,就会使用用拥塞发生算法


ssthresh 设为 cwnd / 2, cwnd 重置为1


然后就进行慢启动。


快速重传: 当发生丢了一个中间包的情况下,发送三次前一个报的ACK,就会进行快速重传,不需要等待超时重传


这种情况之下:


cwnd = cwnd / 2


ssthresh = cwnd


进入快速恢复算法


快速恢复


当收到3个重复的ACK说明网络情况不是很差,不需要进行超时重传等算法


cwnd = ssthresh + 3 ( 3 的意思是确认有 3 个数据包被收到了)


重传丢失的数据包;


如果再收到重复的 ACK,那么 cwnd 增加 1;


如果收到新数据的 ACK 后,把 cwnd 设置为第一步中的 ssthresh 的值,原因是该 ACK 确认了新的数据,说明从 duplicated ACK 时的数据都已收到,该恢复过程已经结束,可以回到恢复之前的状态了,也即再次进入拥塞避免状态

20200905114128469.png

20200905114220671.png

资料参考 https://zhuanlan.zhihu.com/p/133307545


参考小林coding的博客内容

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
网络协议 算法 网络性能优化
|
3月前
|
监控 测试技术 持续交付
大模型测试怎么做?从模型评估、幻觉检测到 RAG 系统测试全指南
本指南系统讲解大模型测试全流程:涵盖多维度评估(私有评测集构建、指标选择)、幻觉检测(事实核查、一致性与对抗测试)、RAG分层验证(检索/生成/端到端),以及持续集成实践与避坑指南,助力团队落地可靠评估体系。
|
12月前
|
人工智能 算法 NoSQL
LRU算法的Java实现
LRU(Least Recently Used)算法用于淘汰最近最少使用的数据,常应用于内存管理策略中。在Redis中,通过`maxmemory-policy`配置实现不同淘汰策略,如`allkeys-lru`和`volatile-lru`等,采用采样方式近似LRU以优化性能。Java中可通过`LinkedHashMap`轻松实现LRUCache,利用其`accessOrder`特性和`removeEldestEntry`方法完成缓存淘汰逻辑,代码简洁高效。
544 0
|
网络协议 算法 程序员
第十问:TCP协议是怎么做到可靠性的?它的可靠指的是到哪一层的可靠?
TCP(传输控制协议)是一种面向连接的传输层协议,其核心特性是可靠性。TCP通过数据分片与排序、确认机制(ACK)、超时重传、流量控制、拥塞控制、校验和等机制,确保数据从发送方到接收方的完整性和有序性。这些机制共同作用,使TCP能够在复杂网络环境中实现稳定的数据传输。TCP的可靠性主要指的是从传输层到传输层的可靠性,传输层之上的可靠性则由应用程序负责。
|
监控 负载均衡 网络协议
TCP重传与超时机制:解锁网络性能之秘
TCP重传与超时机制:解锁网络性能之秘
4434 0
|
网络协议 算法 网络性能优化
TCP 重传、滑动窗口、流量控制、拥塞控制
TCP 重传、滑动窗口、流量控制、拥塞控制
|
存储 JSON 数据格式
Jmeter系列(45)- 详解 Jmeter 跨线程组取参数值的方法,免代码!
Jmeter系列(45)- 详解 Jmeter 跨线程组取参数值的方法,免代码!
894 0
Jmeter系列(45)- 详解 Jmeter 跨线程组取参数值的方法,免代码!
|
缓存 网络协议 Linux
网络的救命稻草:重传机制如何确保数据顺利传输?
在网络传输中,数据的可靠性和稳定性一直是一个重要的挑战。幸运的是,重传机制应运而生,为我们解决了这个问题。本文将深入探讨重传机制在网络中的应用和工作原理。我们将介绍TCP中最常见的超时重传和快速重传,以及SACK和D-SACK这两种高级重传机制。了解这些机制如何工作可以帮助我们更好地理解数据传输的可靠性和稳定性的保障。
1044 1
网络的救命稻草:重传机制如何确保数据顺利传输?
|
网络协议 安全 前端开发
QUIC 和 TCP:了解为何 QUIC 是未来的网络协议
在过去的三十年里,HTTP(超文本传输协议)一直是互联网的支柱。我们可以通过 HTTP 浏览网页、下载文件、流式传输电影等。这一协议随着时间的推移已经得到了重大改进。