QoS(Quality of Service,服务质量)是网络技术中用来确保某些数据流的优先级和服务质量的一系列策略和机制。在实时通信和流媒体传输中,QoS尤为重要,因为它可以减少延迟、丢包和抖动,从而提高用户体验。包括NACK策略、TWCC策略等。NACK是一种反馈机制,当接收端检测到丢包时,它会向发送端发送一个NACK消息,请求重新发送丢失的数据包。TWCC是一种拥塞控制机制,旨在减少网络拥塞和丢包。下面详细讲解一下这几种抗丢包策略。
一、NACK生成策略
NACK全称为Negative Acknowledgment Packet,是一种对RTP数据传输层进行反馈的RTCP包,包类型为205,反馈类型为1。相对TCP的ACK接收确认,NACK则是未接收确认。
如图所示,Receiver在收到报文4之后发现报文2、3未到达,暂时将报文2、3放入丢失nack列表。在超过一定乱序阈值,或者超过一定抖动时间(根据rtt计算),向Sender请求重传丢失的报文2、3。具体设计如下。
对于NACK来说,需要维护NACK数组来存储NACK信息。NACK数组,存储NACK信息并计算rtcp-nack,NACK信息如下:
type nack struct {
params *nackParams
seqNum uint16
bornAt time.Time
tries uint8
lastNACKedAt time.Time
}
NACK包含params、seq、bornAt、tries等字段,seq表示丢包rtp序列号,bornAt记录NACK信息生成时间,tries表示此NACK包发送次数。SFU通过这些信息记录NACK包的状态。
SFU系统在处理数据流时,采用了一种丢包检测和重传策略,确保了通信的流畅性和数据的完整性。每当SFU接收到一个RTP(Real-time Transport Protocol)包,它会细致地检查该包的序列号。如果发现序列号之间存在间隙,SFU会敏锐地识别出这些间隙所代表的潜在丢包,并立即构建相应的NACK(Negative Acknowledgement)数据,将其有序地存储在NACK数组中。
SFU的智能之处在于,一旦接收到NACK数组中序列号对应的RTP包,它便能迅速将对应的NACK数据从数组中移除,确保数据流的连续性和完整性。此外,SFU在每次接收RTP包时,都会对NACK数组进行实时的检查与维护。如果数组中的元素保存时间超过了20毫秒的阈值,SFU将主动向发送端发送NACK报文,并记录该RTP报文的尝试次数,最多不超过10次。
SFU的重传策略同样体现了其智能化设计。如果某个RTP包的NACK数据尝试次数不为零,SFU将采用指数回避算法,根据实时的往返时间(RTT)计算出合适的时间间隔,以优化重传时机,增加重传成功的概率。这种策略不仅减少了不必要的网络负载,还显著提升了通信效率和质量。
当数据传输链路遭遇高丢包率时,这不仅增加了接收端对特定数据包进行重传请求的频率,而且若不对NACK请求的次数加以合理限制,接收端可能会陷入一个无休止的NACK请求循环,这无疑会对网络性能造成严重影响。然而,通过引入一种精心设计的丢包检测和重传机制,我们能够迅速而有效地应对这一挑战。该机制不仅能够快速响应丢包事件,而且通过优化重传流程,避免了因无限循环发送NACK而导致的网络拥堵和资源浪费。
二、TWCC策略
拥塞控制的目标是产生尽可能接近可用的端到端带宽的发送速度,webrtc应用程序生成的媒体流与其他并发流公平的共享网络带宽。Transport wide Congestion Control(TWCC)通过 RTP transport wide cc sn header 和 RTCP transport feedback message 扩展,基于丢包和延迟估算带宽占用是否有拥塞,从而调整媒体流的发送速率,主要的估算和决策在发送方,采用了线性回归和最小二乘法。
下面重点讲讲TWCC策略,它首先定义了对 RTP 包头和 RTCP 反馈消息的扩展,其中包括一些信息。
1. 到达时间模型
在WebRTC中,可以通过延迟梯度来衡量网络状况,延迟梯度不是一个个包来计算的,而是通过将包分组,然后计算这些包组之间的延迟,这样做可以减少计算次数,同时减少误差。
2. recv delta
recv delta长度为一个字节或两个字节,是RTCP Feedback Message中的字段,记录每个包与之前收到的包的间隔时间。如图所示。
它是250us的倍数,reference_time是当前包组第一个 packet到达的时间, 所以:
当包的状态为Packet received,此时 fb packet会通过recv delta 记录其与前一个RTP包到达时间的间隔,单位是 250us.
3. 基于延迟的拥塞控制算法
简单来说,TWCC(传输层宽度控制协议)的工作流程可以概括为以下几个步骤:
a. 在发送端,每个RTP(实时传输协议)数据包都会被赋予一个独一无二的序列号(Seq)并记录发送时间send_time。这些序列号扮演着至关重要的角色,它们使得接收端能够追踪每个数据包的传输情况。
b. 接收端在捕获到RTP数据包时,会详细记录每个包的到达时间arrive time。通过分析这些时间数据,接收端能够计算出数据包的到达时间间隔recv delta。然后,接收端会定期将这些数据汇总,并通过TWCC反馈包的形式发送回发送端。
c. 发送端一旦接收到TWCC反馈,便会利用这些延迟信息来评估当前的网络状况。发送端将这些 RTP 包的发送时间send_time, 到达时间 arrive_time 取出来, 并将它们分组。recv delta可以直接从rtcp报文中提取,发送端计算发送时间间隔send_delta=g(i)-g(i-1)(表示第i个报文的发送时间)
d. 计算当前时刻时延变化和累计时延变化:
e. 将累积延迟变化进行指数平滑
f. 以到达时间为横轴, 延迟变化为纵轴进行线性回归, 计算其拟合出的趋势线的斜率。
X轴为arrive_time,并不是i个包组的到达时间,而是第i个包组最后一个包的到达时间减去第一个包组的最后一个包的到达时间
Y轴为smoothed,即上面算出的平滑累计延迟变化
g. 将计算出来的斜率与一个动态阈值进行比较,来发现是否发生拥塞。如果观察到拥塞,此时发送端会相应地降低其数据发送速率。相反,则表明网络状况较为顺畅,发送端则可以适度增加发送速率,以优化传输效率。对于每次接收到视频帧t(i)时,过度使用检测器都会产生一个信号s,该信号基于排队延迟梯度m[(t(i)]和阈值来驱动FSM(下面的有限状态机)的状态σ:
当时m[t(i)]>γ时,算法通过增加帧间隔时间∆T的变量ɛ来跟踪在这种情况下花费的时间。当ɛ达到ɛ(max)=100ms且m[t(i)]>m[t(i-1)]时,产生过度使用信号。
另一方面,如果m[t(i)]减少γ到以下,则产生未充分利用信号,而当-γ≤m[t(i)])≤γ时触发正常信号。
h. 根据以上检测结果,调整带宽估计速率,GCC采用AIMD算法。针对速率控制分为两部分,一个是基于丢包的带宽估计,一个是上述所说的基于延迟的带宽估计,最终会综合比较两者之间的值,取两者之间的最小值作为带宽估计结果。
总结
NACK与TWCC是Qos中的重要策略之一,NACK机制只重传丢失的数据包,这意味着它不需要像前向纠错(FEC)那样在发送端添加额外的冗余数据。因此,NACK在带宽使用上更为高效,减少了不必要的带宽消耗。通过及时重传丢失的数据包,NACK机制能够减少音频、视频通话中的卡顿和中断现象,从而提升用户的通话体验。因此我们在公司自研的SFU中主要采用NACK策略。
对于TWCC,其中的核心是带宽估计。带宽估计如图所示。
从图表中可以明显观察到,可用带宽与预估带宽之间展现出了高度的一致性。尽管在调整过程中偶尔会出现轻微的过冲现象,但TWCC(Transport Wide Congestion Control)策略以其出色的收敛能力迅速调整,确保了网络状态的稳定。这种快速收敛的能力主要得益于TWCC策略的延迟敏感性。TWCC通过接收端发送的RTCP(Real-time Transport Control Protocol)包,例如TWCC报告,来实时监测并评估网络状况。这些反馈信息包括数据包的到达时间和丢包状态等关键指标,为TWCC提供了及时的拥塞检测能力。
这种机制使得TWCC能够及时捕捉到网络状态的变化,并迅速采取相应的拥塞控制措施。通过这种方式,TWCC能够避免网络拥塞的进一步恶化,提高通信的稳定性。正是基于TWCC策略的这些优势,我们公司在自主研发的SFU(Selective Forwarding Unit)中,决定主要采用TWCC策略。
更多产品和技术文章,敬请关注👆
360智汇云是以"汇聚数据价值,助力智能未来"为目标的企业应用开放服务平台,融合360丰富的产品、技术力量,为客户提供平台服务。
目前,智汇云提供数据库、中间件、存储、大数据、人工智能、计算、网络、视联物联与通信等多种产品服务以及一站式解决方案,助力客户降本增效,累计服务业务1000+。
智汇云致力于为各行各业的业务及应用提供强有力的产品、技术服务,帮助企业和业务实现更大的商业价值。
官网:https://zyun.360.cn
客服电话:4000052360