所有包的发送都要先经过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 : 发送数据包的逻辑