Pacer

139 阅读1分钟

所有包的发送都要先经过pacer, 之后才能通过网络发送给对端

pacer的作用

让数据在网络上发送的更平滑, 防止因数据量的突增导致网络发生拥塞

左侧: 正常数据包的发送量, 分布很不均匀, pacer把大量的包以均匀的间隔发送出去, 右侧则为pacer处理后的结果

创建Pacer

  • 创建pacer的起点在CreatePeerConnection

  • pacer在创建Call对象的过程中创建

  • 设置bitrate_config的参数是在创建pacer的时候所使用的

  • PacedSender对象就是我们所说的Pacer

  • Pacer默认的工作模式periodic: 周期工作模式

  • Pacer的主要逻辑都是由PacingController来实现的

  • 创建Pacer时需要指定平滑处理的目标码率 默认300kbps

  • pacer对象创建好后 启动pacer线程, 所有包都会插入队列通过该线程发送出去

两个重要的函数

  • NextSendTime, 下图, 获取每次执行的时间(periodic模式: 5毫秒)

  • 返回值的单位是微秒

  • ProcessPackets, 下图, 周期处理包的发送, 在NextSendTime指定的时间点触发执行

Pacer的两种工作模式

  • kPeriodic, 周期模式, 也是默认模式

  • kDynamic, 动态模式, 一种新模式, 还未正式使用

总结

  • pacer的作用 : 防止瞬间发送大量数据包导致网络拥塞

  • pacer是在创建peerConnection时, 内部创建call对象后, 在call对象的构造函数中创建, 同时创建pacer时会设置工作模式和目标码率等参数

  • 两个重要函数 : 

  • NextSendTime : 指定下一次执行packetsend的时间点

  • processPackets : 发送数据包的逻辑