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
相关文章
|
JavaScript API 虚拟化
20个基于DPDL开源项目,带你冲破内核瓶颈(上)
20个基于DPDL开源项目,带你冲破内核瓶颈
|
存储 NoSQL Java
什么是Cookie与Session之Session详解
什么是Cookie与Session之Session详解
1173 0
|
IDE Linux 开发工具
零基础也能学会!Linux下安装RStudio工具及实现远程访问的详细指南
RStudio Server 使你能够在 Linux 服务器上运行你所熟悉和喜爱的 RStudio IDE,并通过 Web 浏览器进行访问,从而将 RStudio IDE 的强大功能和工作效率带到基于服务器的集中式环境中。
|
8月前
|
机器学习/深度学习 数据采集 边缘计算
深度学习在智慧渔业中的应用:鱼类识别、计数与追踪的技术演进与挑战
中国是全球最大水产品生产国,水产养殖产量连续32年居世界首位。传统鱼类监测方法效率低、主观性强,而深度学习凭借其强大的特征提取能力,正推动鱼类识别与行为分析技术革新,助力智慧渔业发展。
|
Shell Android开发
MT8385 Android AB分区系统升级(命令模式)
MT8385 Android AB分区系统升级(命令模式)
404 0
|
机器学习/深度学习 自然语言处理
YOLOv5改进 | 2023 | CARAFE提高精度的上采样方法(助力细节长点)
YOLOv5改进 | 2023 | CARAFE提高精度的上采样方法(助力细节长点)
744 2
|
前端开发 JavaScript PHP
Thinkphp在线客服系统源码多语言外贸版_PHP客服系统源码Uniapp开发搭建+论文设计
Thinkphp在线客服系统源码多语言外贸版_PHP客服系统源码Uniapp开发搭建+论文设计
|
监控 网络协议 Linux
在Linux中,什么是DDoS攻击?如何在Linux中防御DDoS攻击?
在Linux中,什么是DDoS攻击?如何在Linux中防御DDoS攻击?
|
机器学习/深度学习 固态存储 计算机视觉
【YOLOv8改进】 RFB (Receptive Field Block):多分支卷积块
**RFB Net是针对目标检测的轻量级解决方案,它通过设计灵感来自人眼感受野的模块提升特征表示。RFB块包含多分支卷积,模拟不同尺度和偏心率,增强轻量模型如SSD的性能。在保持实时速度的同时,RFB Net在准确性上媲美深度检测器。代码可在GitHub找到。**
|
存储 安全 文件存储
如何在群辉NAS使用Docker搭建容器魔方并实现无公网ip远程访问
如何在群辉NAS使用Docker搭建容器魔方并实现无公网ip远程访问
987 0