前言

在前面的《浅谈网络通信中的 ACK、NACK 和 REX》一文中,我们知道了网络通信中的丢包重传的相关理论和方法,既在网络发生丢包的情况下的补救措施,本文则往前进一步,介绍下如何通过流量整形技术,尽可能地避免网络发生丢包。

举个栗子

下面我们就以高速路堵车为例,举例说明:

堵车的原因有很多种,我们先聊聊图中的这种:假设某公路是 3 股道,也就是说,每时刻能同时进入该公路的车辆并行是 3 辆,那么,如果某一时间段,同时试图并行进入该公路的车辆超过 3 辆,则必然会出现由于公路的承载能力不够带来的 “堵车”。(如上图所示)

网络传输也类似,假设网络带宽是 2Mbps,如果在每秒硬塞给网络的数据包 > 2Mbps,网络通道也会受不了。不过它的表现形式与公路不一样的地方在于:超出网络承载能力的数据包,可能会被网卡/路由器/交换机给丢掉,即我们常说的丢包(loss)。

对于网络传输而言,丢包带来的成本是很高的,因为一些重要的数据包丢失后,是需要 “重传” 的,而 “重传” 太多,来回反复会增加了数据传输的延时,也会进一步恶化网络负荷,最终极大地降低了传输的效率。

因此,我们需要从根本上尽可能地减少 “丢包” 的产生,简单来说,就是控制单位时间内送入网络传输的数据量,尽量平滑且不要超过网络带宽承载能力。

控制对象

既然要控制送入网络传输的数据量,就得先找到数据是怎么产生的,又是在通过哪个环节送入到网络的。

如图,音视频传输的数据 “源头” ,无外乎就是本地的音视频文件、麦克风采集的音频流、摄像头采集的视频流、桌面采集到的屏幕流等,它们经过编码压缩和封包处理,然后经过 “发送模块” 送入到网络中。

设置和修改采集的配置(如:分辨率、帧率)、编码器的配置(如:GOP 间隔、码率)等,是可以减少实时产生的总数据量的,但是数据的产生并不是 “平滑” 的,特别是视频流/屏幕流,画面的突变,会带来数据量的突变,因此,送入到 “发送模块” 的数据量,也并不会总是 “平滑” 的。

从上面的 “堵车” 理论,为了避免丢包,我们需要尽可能地将数据 “平滑” 地送入网络中,因此,“流量整形” 在此派上了用场,它作用于 “发送模块”,目标是调整数据传输的平均速率,防止突发性的流量暴增导致网络拥塞和丢包。

流量整形

如何平滑输入和输出,一个最容易想到方法,就是增加 “缓冲”,让输入的数据先进入 “缓冲区” ,然后用恒定的 “速率” 从缓冲区取数据输出。这种方法称之为 “漏桶算法”。

  • 漏桶算法(Leaky Bucket)

    如图,使用一个 packet buffer(漏桶),把所有输入的 packet 缓存起来。

设置一个目标的输出码率(比如:3Mbps),固定的时间间隔(比如:10ms),读取 packet buffer(漏桶)中固定数量的 packet(如:3Mbit * 10ms / 1000 = 0.03Mbit)进行网络发送。注:如果某时刻缓冲区没有数据,则不用发送了。

  • 漏桶算法的缺点
    漏桶算法有一个明显的缺点,因为非常精准的网络带宽无法预判,那么假设你设置了一个比较小的目标码率(如 3Mbps),可能小于真实的网络带宽(如 10Mbps),这时,如果业务上产生了一些突发的流量,真实的网络带宽本可以允许更快地完成发送,但经过了漏桶算法后,依然会以恒定的目标码率慢慢地发送。所以说,漏桶算法无法充分用满网络资源来降低传输延时。针对这种问题可以提供如下俩种解决方案。

    1. 先慢启动,然后将漏桶的目标码率持续上探,直到出现网络恶化(如:丢包增多)后再降下来,如此反复,维持一个动态平衡,使得漏桶算法的目标码率持续无限逼近网络的承载能力
    2. 改进漏桶算法,允许其在执行过程中,偶尔出现一些超过预设平均值的突发传输能力,用于应对业务上的流量突发,即:令牌桶算法
  • 令牌桶算法(Token Bucket)
    令牌桶算法在漏桶算法基础上,提出一个改进,就是新增了 “令牌” 和 “令牌桶”。

“令牌” 代表着允许传输的字节数量,我们以固定的时间间隔(比如:10ms)产生并送入 “令牌” 到 “令牌桶”,“令牌桶” 设置一个 “令牌” 数量上限(满了没有消耗就丢掉新增的令牌),因此,一次传输最大的允许突增的字节数 = M x B

发送模块,以固定 t ms 的时间间隔去读取 packet buffer,读取的字节数 X 必须接近但小于等于当前 “令牌桶” 中允许传输的字节数(即:“令牌桶” 里剩余的 “令牌个数” x B)。并且,传输完了多少字节,则删除掉 “令牌桶” 里对应个数的 “令牌”。

这种方法解决突发流量的关键点在于 “令牌” 是可以积累的,可能缓冲区在前 N ms 都没有突发的数据,这时,“令牌” 依然在产生,并且被积累在了 “令牌桶”,一旦缓冲区突增了大量的数据,则可以在短时间内快速消费掉。当然,为了防止突破网络承载能力导致丢包,“令牌桶” 的最大 “令牌数量” 也相应做了一些限制。

总结:

关于网络通信中的流量整形就简单介绍到这里了,“漏桶算法” 和 “令牌桶算法” 其实在很多的地方都有使用,比如服务端的限流降级,比如音视频的平滑丢帧等等,当然,也还有一些基于这些算法的各种改进策略,这里就不一一介绍了。下面推荐几个讲的比较好的博主给大家,希望感兴趣的同学慢慢深入研究

  • 流量控制算法——漏桶算法和令牌桶算法(力推)
  • 高并发系统限流-漏桶算法和令牌桶算法(力推)

浅谈网络通信中的流量整形相关推荐

  1. java 中的单元测试_浅谈Java 中的单元测试

    单元测试编写 Junit 单元测试框架 对于Java语言而言,其单元测试框架,有Junit和TestNG这两种, 下面是一个典型的JUnit测试类的结构 package com.example.dem ...

  2. mybatis与php,浅谈mybatis中的#和$的区别

    浅谈mybatis中的#和$的区别 发布于 2016-07-30 11:14:47 | 236 次阅读 | 评论: 0 | 来源: 网友投递 MyBatis 基于Java的持久层框架MyBatis 本 ...

  3. 浅谈CSS3中display属性的Flex布局,关于登陆页面属性框的设置

    声明:本文转发自三里屯柯南的浅谈CSS3中display属性的Flex布局http://www.cnblogs.com/xuyuntao/articles/6391728.html 基本概念 采用Fl ...

  4. python sys模块作用_浅谈Python中的模块

    模块 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式.在Python中,一个.py文件就称之为一个模块(Mod ...

  5. python生成器和迭代器作用_浅谈Python中的生成器和迭代器

    迭代器 迭代器协议 对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么返回一个异常来终止本次迭代.(只能往前走,不能往后退!) 迭代器对象 遵循了(实现了)迭代器协议的对象.(对象内 ...

  6. oracle hash join outer,CSS_浅谈Oracle中的三种Join方法,基本概念 Nested loop join: Outer - phpStudy...

    浅谈Oracle中的三种Join方法 基本概念 Nested loop join: Outer table中的每一行与inner table中的相应记录join,类似一个嵌套的循环. Sort mer ...

  7. 浅谈caffe中train_val.prototxt和deploy.prototxt文件的区别

    浅谈caffe中train_val.prototxt和deploy.prototxt文件的区别 标签: caffe深度学习CaffeNet 2016-11-02 16:10 1203人阅读 评论(1) ...

  8. python中 是什么类型_浅谈python中的变量默认是什么类型

    浅谈python中的变量默认是什么类型 1.type(变量名),输出的结果就是变量的类型: 例如 >>> type(6) 2.在Python里面变量在声明时,不需要指定变量的类型,变 ...

  9. 浅谈Java中的Set、List、Map的区别

    就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...

最新文章

  1. Jvm 系列(二):Jvm 内存结构
  2. vim介绍,vim颜色显示,vim一般模式下移动光标,vim一般模式下的复制、剪切和粘贴...
  3. C 语言实现数组冒泡排序
  4. java学习(89):Charactor包装类统计
  5. 【Java】关于Java中的各种流
  6. 使用计算机眼睛保护方法,电脑工作者保护眼睛的22个方法
  7. 设计模式---观察者模式(C++)
  8. CSS3 结构性伪类选择器(1)
  9. 让 Edit 只接受数字《转》
  10. 计算机频繁启动是何原因,电脑开机频繁断电又重启怎么回事?
  11. Julia中的numerator()函数
  12. GitHub开源:支持100多种语言的OCR文字识别
  13. 《微信小程序-证件照换底色》之三:微信小程序接收django的图片并部署到windows服务器上
  14. 修改服务器tcp会话数,windows2012服务器TCP连接数
  15. 汉诺塔(河内塔)问题(递归)
  16. 群晖网络不通_群晖系统安装zerotier one进行内网穿透过程中常见问题及解决方法...
  17. ISE verilog 综合错误提示:ERROR:Xst:880 - Johnson_source.v line 45: Cannot mix blocking and non blocking
  18. 谣言检测文献阅读二—Earlier detection of rumors in online social networks using certainty‑factor‑based convolu
  19. 一个为华为ICT网络赛道准备的小白
  20. idea ctrl+alt+向左箭头不能用

热门文章

  1. 【无人机】欧盟发布无人机新规
  2. 上大学有用吗?35岁以上的程序员都去哪里了
  3. 一、STM32启动文件详细解析
  4. python-Python 3中字符串可以被改变吗?
  5. iPhone SE 3 5G版发布在即 旧款将降价到千元出头
  6. B站举办2021年度百大UP主盛典 科技知识类UP主占比翻倍
  7. realme GT2 Pro获3C认证:65W超级快充加持
  8. 华为关联公司哈勃投资晟芯网络 持股10%
  9. 小屏党失望!iPhone 13四款机型,mini版没了
  10. 头条搜索发布2020年十大流行语:逆行者、集美、后浪位列前三