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. spring 5.x 系列第11篇 —— 整合memcached (xml配置方式)

    文章目录 一.说明 1.1 XMemcached客户端说明 1.2 项目结构说明 1.3 依赖说明 二.spring 整合 memcached 2.1 单机配置 2.2 集群配置 2.3 存储基本类型 ...

  2. 【MySQL插入更新重复值】ON DUPLICATE KEY UPDATE用法

    要插入的数据  与表中记录数据的 惟一索引或主键中产生重复值,那么就会发生旧行的更新 弊端:造成主键自增不连续.适合数据量不大的表. ON DUPLICATE KEY UPDATE后面的条件 eg有如 ...

  3. Java 8 新特性-Stream更优雅的处理集合入门

    Java 8 新特性之--Stream 一. 简单介绍 Stream是Java 8提出了的一种新的对集合对象功能的增强.它集合Lambda表达式,对集合提供了一些非常便利,高效的操作,使得代码具有非常 ...

  4. GO代码生成代码小思小试

    推进需求 GO 项目,可整体生成一个运行文件到处跑,是极爽之事.但如果有资源文件要得带着跑,则破坏了这种体验. 例如下边这个项目结构,resource 目录下为资源文件,main.go 中会通过路径引 ...

  5. 基于百度云的OCR识别(Python)

    2019年7月3日早上,在百度AI开发者大会上,一个来自山西的青年,将一瓶矿泉水浇在了同样来自山西的李彦宏身上. 可以回顾一下 https://b23.tv/av57665929/p1 ,着实让人一惊 ...

  6. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'wher id = 41' at line 1

    where 没有打完整

  7. java虚拟机-简介

    一.什么是JVM JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现 ...

  8. java-NIO-概念

    现在使用NIO的场景越来越多,很多网上的技术框架或多或少的使用NIO技术,譬如Tomcat,Jetty 一.概述 NIO主要有三大核心部分:Channel(通道),Buffer(缓冲区), Selec ...

  9. Tensorflow教程(2)Tensorflow的常用函数介绍

    1.tf.constant tf.constant用来定义一个常量,所谓常量,广义上讲就是“不变化的量”.我们先看下官方api是如何对constant函数来定义的: tf.constant( valu ...

  10. SQL Server 表结构操作

    一.创建表 --直接定义主外键 create table wallet( ID ) primary key, ,) not null, Name ) default '余额', Member_ID ) ...