TCP拥塞算法详解
 
 ps:详解TCP拥塞算法就是为了说明瓶颈所在。
 
先解释一下概念
拥塞:对网络中某一资源的需求超出了该资源所能提供的可用部分
拥塞窗口:以字节为单位,表示能通过的数据报的个数
 
TCP传统拥塞控制算法(参考TCP/IP详解一卷)
 
传统拥塞控制算法有四个阶段
------------------------------------------------------------------
慢开始
    由小到大逐渐增大拥塞窗口数量(注意!慢开始只是起点低,增加速度并不慢 指数增加)
 
阶段转变:当报文数目达到拥塞窗口的初始门限时,由慢开始变为拥塞避免阶段
------------------------------------------------------------------
拥塞避免
     拥塞窗口缓慢增大,线性增大
     特点:拥塞避免其实就是为了避免报文数增长过快导致丢包
     说明:丢包是无法避免的,TCP是可靠的并不是说他不丢包而是有重传机制可以保证报文丢失后的再次传输
 
阶段转变:当出现第一个丢包时,触发快重传机制,重传完成后进入快恢复阶段
------------------------------------------------------------------
这个阶段涉及两个操作
1、快重传
       接收方收到失序报文段口发出重复确认,发送方收到三个重复确认立即进行重传
       分析一下:1、为什么叫快重传,其实就是区别去超时重传,超时重传是在发包是设置定时器,超过时间没收到返回的ACK就进行重传;而快重传是接收端发现收到的报文段失序后,理解发送三条相同报文告知发送端你该重传了,别再等定时器了!
       通俗的描述一下快重传机制:收端收的报文是有顺序的,例如收端收到了1,2,4收端发现3不见了,就会连续像发端发送3个2告诉发送端我没收到3,你先把3发给我。
    
如果重传还是没有传输成功是如何处理的?
  此处有两个标准一个是时间一个是次数,如果在指定时间或次数内没有重传成功会终结该链接。
2、快恢复
     发送方收到三个重复确认后慢开始门限减半
     新的拥塞窗口大小=新的慢开始门限(丢包时拥塞窗口的一半)+3 (3代表3个重传的报文段)
 
阶段转变:重新确认拥塞窗口大小后,将状态变更到拥塞避免阶段
--------------
传统算法瓶颈
根据上述基础知识就可以知道TCP传统拥塞算法对丢包、时间都非常敏感!!!
 
以同步轨道卫星通信为例分析瓶颈:
1、卫星链路实测往返时延达到500ms以上,传统拥塞算法的定时器、传输机制都不适用
2、卫星链路不稳定会受到天气、太阳等的影响,相比较地面网络丢包和误码率都大很多
 
综上所述:就会导致TCP业务传输吞吐量始终在30%左右,浪费资源。(丢包折半丢包折半的死循环)
--------------
解决方案
TCP加速器是如何解决上述问题的呢?
 
前人做过很多探索,如 修改本地TCP协议、调整缓冲区等
经过很多探索之后,现在主流的就有两种:单边加速和双边加速
 
之前的文章提到过,单边就是优化算法,双边更倾向于变更协议
 
单边方面来说使用广算法多
BBR:谷歌的算法,现在买外国服务器搭BBR加速已经成为很普遍了,但使用是要注意内核版本BBR对内核版本要求较高
Zeta:我国的一款算法,具体没有使用过,看宣传是基于传输历史学习的,可以通过学习传输历史调整发送节奏降低丢包率
当然也可以自定义,只要透明代理做的好,算法完全可以在加速器中自行选择优化方向
 
 
双边加速 (现阶段基本都是星空链路使用UDP,由加速器来进行报文发送、确认)
主要采用的就是RFC 3135中的隧道机制
       性能增强代理可以封装消息以跨特定链路传送消息或强制消息遍历特定路径。封装隧道另一端的PEP在最终传送到接收端系统之前移除隧道封装器。分布式分离连接TCP实现可以使用隧道作为用于在分布式PEP之间进行连接的装置。 隧道也可用于支持强制TCP连接,该连接使用非对称路由来遍历分布式PEP实现的端点。
双边加速可以最大限速的利用压缩机制,现阶段网络安全问题越来越突出,压缩不仅仅能提升传输速率还能提高安全性,何乐而不为呢?
 
总而言之,TCP协议的优化点就是变更算法变更协议,前者资源多开发难度小,后者开发难度大但优化空间高;总之适合的才是最好的~~~没有必要一味追求单边双边。
 
 转发请注明出处,谢谢~
 
 
 
 

TCP拥塞算法瓶颈及TCP加速器解决方案的更多相关文章

  1. 深入浅出 BPF TCP 拥塞算法实现原理

    本文地址:https://www.ebpf.top/post/ebpf_struct_ops 1. 前言 eBPF 的飞轮仍然在快速转动,自从 Linux 内核 5.6 版本支持 eBPF 程序修改 ...

  2. Linux kernel 4.9及以上开启TCP BBR拥塞算法

    Linux kernel 4.9及以上开启TCP BBR拥塞算法 BBR 目的是要尽量跑满带宽, 并且尽量不要有排队的情况, 效果并不比速锐差 Linux kernel 4.9+ 已支持 tcp_bb ...

  3. TCP拥塞控制算法 优缺点 适用环境 性能分析

    [摘要]对多种TCP拥塞控制算法进行简要说明,指出它们的优缺点.以及它们的适用环境. [关键字]TCP拥塞控制算法 优点    缺点   适用环境公平性 公平性 公平性是在发生拥塞时各源端(或同一源端 ...

  4. 浅谈TCP拥塞控制算法

    TCP通过维护一个拥塞窗口来进行拥塞控制,拥塞控制的原则是,只要网络中没有出现拥塞,拥塞窗口的值就可以再增大一些,以便把更多的数据包发送出去,但只要网络出现拥塞,拥塞窗口的值就应该减小一些,以减少注入 ...

  5. TCP拥塞控制算法

    转自浅谈TCP拥塞控制算法 本篇文章介绍了几种经典的TCP拥塞控制算法,包括算法原理及各自适用场景. 回顾上篇文章:浅谈 redis 延迟 前言 TCP 通过维护一个拥塞窗口来进行拥塞控制,拥塞控制的 ...

  6. 【转载】TCP拥塞控制算法 优缺点 适用环境 性能分析

    [摘要]对多种TCP拥塞控制算法进行简要说明,指出它们的优缺点.以及它们的适用环境. [关键字]TCP拥塞控制算法 优点    缺点   适用环境公平性 公平性 公平性是在发生拥塞时各源端(或同一源端 ...

  7. 一文带你掌握【TCP拥塞窗口】原理

    ❝ 关注公众号:高性能架构探索.后台回复[资料],可以免费领取 ❞ 学过网络相关课程的,都知道TCP中,有两个窗口: 滑动窗口(在我们的上一篇文章中有讲),接收方通过通告发送方自己的可以接受缓冲区大小 ...

  8. TCP 拥塞窗口原理

    学过网络相关课程的,都知道TCP中,有两个窗口: 滑动窗口(在我们的上一篇文章中有讲),接收方通过通告发送方自己的可以接受缓冲区大小(这个字段越大说明网络吞吐量越高),从而控制发送方的发送速度. 拥塞 ...

  9. 网络拥塞控制(三) TCP拥塞控制算法

    为了防止网络的拥塞现象,TCP提出了一系列的拥塞控制机制.最初由V. Jacobson在1988年的论文中提出的TCP的拥塞控制由“慢启动(Slow start)”和“拥塞避免(Congestion  ...

随机推荐

  1. 手动实现一个 IOC/DI 容器

    第一章为源码解析. 第二章为实现一个简单的 IOC 容器. 第三章进阶 Spring 插件开发. 手动实现一个 IOC/DI 容器 上一篇文章里我们已经对 Spring 的源码有了一个大概的认识,对于 ...

  2. spring 5.x 系列第15篇 —— 整合dubbo (xml配置方式)

    文章目录 一. 项目结构说明 二.项目依赖 三.公共模块(dubbo-common) 四. 服务提供者(dubbo-provider) 4.1 productService是服务的提供者( 商品数据用 ...

  3. HTML行内元素、块级元素、行内块级元素的特点与区别

    元素 HTML 元素指的是从开始标签(start tag)到结束标签(end tag)的所有代码. 元素分类方式 HTML 可以将元素分类方式分为行内元素.块状元素和行内块状元素三种,这三者可以通过设 ...

  4. 【】input中 type=number 去掉箭头

    css中设置: input::-webkit-outer-spin-button, input::-webkit-inner-spin-button { -webkit-appearance: non ...

  5. Springboot 连接 使用 Redis Example

    通过一个简单的例子使用Springboot 连接并使用Redis. 本文假设已经安装好Redis. 1.首先将URL转换为一个ID ,并使用 StringRedisTemplate 将ID 和 URL ...

  6. CSS3文本与字体

    一.CSS3 换行 1.word-break(规定自动换行的处理方法) word-break: normal / break-all / keep-all; /* normal:使用浏览器默认的换行规 ...

  7. PHP中var_dump、&&和GLOBALS的爱恨纠缠

    var_dump函数:用来打印显示一个变量的内容与结构: &&:定义一个可变变量.php中,在定义变量时,需要在前面加上一个“&”符号,当加上两个“&&”符号时 ...

  8. SpringMVC框架的简单理解

    首先,让我们来看下下图 SpringMVC解决了View和Controller的交互问题 其中有几个重要组成部分: (1) DispatcherServlet: 前端控制器 用于接收所有请求,并负责分 ...

  9. SpringBoot第二十一篇:整合ActiveMQ

    作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/11190048.html 版权声明:本文为博主原创文章,转载请附上博文链接! 引言   前一章节中 ...

  10. 每日一问:Android 滑动冲突,你们都是怎样处理的

    坚持原创日更,短平快的 Android 进阶系列,敬请直接在微信公众号搜索:nanchen,直接关注并设为星标,精彩不容错过. 在 Android 开发中,滑动冲突总是我们一个无法避免的话题.而对于解 ...