4、流量整形与预留:SRP(流预留协议)的Talker/Listener模型、带宽预留计算、优先级与VLAN
好,咱们接着聊。前面几章我们把AVB的时钟同步和队列机制讲清楚了,这一章要解决一个核心问题:怎么保证音视频流在网络上不被挤掉?
说白了,以太网天生是“尽力而为”的。你发一个包,我发一个包,大家挤在一起,交换机只能排队处理。但音视频不一样——音频丢一个包就是“啪”的一声杂音,视频丢一帧就是画面撕裂。所以AVB引入了SRP(Stream Reservation Protocol,流预留协议),专门来干这件事。
核心思想:在数据发送之前,先跟网络“打个招呼”——我要发多少数据,占用多少带宽,你们沿途的交换机给我留好位置。谁先预留,谁就优先。
4.1 Talker/Listener模型:谁在说话,谁在听?
SRP定义了两个角色:Talker(说话者)和Listener(收听者)。这个模型很直观,你想想看,会议室里一个人发言,其他人听,网络里也是一样。
- Talker:发送音视频流的设备。比如一个麦克风阵列、一个摄像头、或者一个音频编码器。它负责向网络声明:“我要发流了,流ID是xxx,带宽是yyy,优先级是zzz。”
- Listener:接收音视频流的设备。比如一个音箱、一个显示器、或者一个解码器。它负责向网络回应:“我要收这个流,请沿途交换机给我留带宽。”
我刚开始接触SRP时,总觉得这玩意儿跟IGMP(组播管理协议)有点像。确实,它们都涉及组播和成员管理,但SRP多了一个带宽预留的动作。IGMP只管“谁加入了组”,不管“路上堵不堵”。SRP则明确告诉交换机:“这个流需要多少资源,你看着办。”
4.2 带宽预留计算:别把网络撑爆了
预留带宽不是拍脑袋定的,得算。AVB标准里给出了一个公式,我把它简化一下,方便你理解:
预留带宽 = 数据包大小(字节) × 8 × 发送频率(包/秒)
举个例子:
- 一个48kHz、24bit、2声道的音频流,每个音频帧大小是 48k × 24 × 2 / 8 = 288,000 字节/秒。
- 如果每个以太网包封装 6 个音频帧,那每个包大小约 288,000 × 6 / 48000 = 36 字节(加上头部约 60 字节)。
- 发送频率是 48k / 6 = 8000 包/秒。
- 预留带宽 = (60 + 36) × 8 × 8000 ≈ 6.144 Mbps。
我的经验:实际项目中,我习惯多预留 20% 的余量。因为网络里还有前导码、帧间距这些开销,而且交换机处理时也有抖动。别卡得太死,否则一旦网络有点波动,流就断了。
AVB标准规定,整个网络中预留的总带宽不能超过链路带宽的75%。为什么是75%?因为剩下的25%要留给普通以太网流量(比如控制指令、ARP、DHCP等)。我曾经在一个项目中,把所有带宽都预留给了音视频流,结果控制指令发不出去,设备直接“失联”了。嗯,从那以后我再也不敢超过75%了。
4.3 优先级与VLAN:谁先走,谁后走?
预留了带宽还不够,还得给这些流一个“特权”。AVB用了两个机制:优先级和VLAN。
优先级(802.1Q Priority)
以太网帧头里有一个3位的PCP字段(Priority Code Point),可以表示0~7共8个优先级。AVB规定:
- 优先级3:用于A类流(低延迟,比如音频,通常要求2ms以内)
- 优先级2:用于B类流(中等延迟,比如视频,通常要求50ms以内)
- 优先级0~1、4~7:留给其他流量
你可能会问:“为什么A类用3,B类用2,而不是反过来?” 其实这是历史原因,早期标准里A类用4,后来为了兼容改了。我个人习惯是:严格按照标准来,别自己乱改优先级。因为交换机厂商都是按这个标准做硬件队列的,你改了优先级,可能就排错队了。
VLAN(802.1Q VLAN Tag)
VLAN在这里有两个作用:
- 隔离流量:把音视频流放在一个独立的VLAN里,避免被其他广播风暴干扰。
- 标记优先级:VLAN标签里同时携带了PCP优先级信息。
我在一个项目中遇到过这样的情况:两个不同的音视频系统共用同一个网络,但VLAN没分开,结果A系统的广播包把B系统的流给冲断了。后来我把它们分到不同的VLAN,再配合SRP预留,问题就解决了。
注意:VLAN ID的分配要统一规划。我见过有人把VLAN 1(默认管理VLAN)拿来跑音视频流,结果交换机配置一改,整个网络都乱了。建议单独分配一个VLAN ID,比如100或200,专门给AVB用。
4.4 实际配置示例
说了这么多理论,咱们看一个实际配置。假设你有一个Talker(麦克风阵列)和一个Listener(音箱),中间经过一台支持AVB的交换机。配置流程大致如下:
// Talker端配置(伪代码)
srp_talker_register(
stream_id = 0x0001,
destination_mac = 0x91E0F0000100, // AVB组播MAC
vlan_id = 100,
priority = 3, // A类流
interval = 125, // 125微秒一个包(A类标准)
max_frame_size = 150, // 最大帧长
max_interval_frames = 1 // 每个间隔最多1帧
);
// Listener端配置
srp_listener_register(
stream_id = 0x0001,
destination_mac = 0x91E0F0000100,
vlan_id = 100
);
// 交换机自动完成带宽预留
// 预留带宽 = (150 + 20) * 8 * (1 / 0.000125) ≈ 10.88 Mbps
注意,这里的max_frame_size包含了以太网头部、VLAN标签、以及AVB的附加头部。实际项目中,我建议用抓包工具(比如Wireshark)实际测量一下包大小,别光看理论值。因为不同厂商的封装方式可能略有差异。
4.5 避坑指南
最后,分享几个我踩过的坑:
- 预留带宽不足:我曾经只算了音频数据本身,忘了算以太网头部和AVB头部,结果实际流量比预留的大,导致丢包。记住,算带宽时要把所有开销都算进去。
- VLAN不匹配:Talker和Listener的VLAN ID必须一致,否则流过不去。我遇到过有人把Talker配成VLAN 100,Listener配成VLAN 200,结果折腾了半天才发现。
- 优先级冲突:如果网络里同时有A类和B类流,确保交换机正确映射了优先级。有些老交换机不支持AVB的优先级映射,需要手动配置。
好了,这一章的内容就到这里。SRP是AVB的核心,理解了Talker/Listener模型、带宽计算、优先级和VLAN,你就掌握了音视频流在以太网上“畅通无阻”的秘诀。下一章,我们会聊聊更高级的话题——时钟同步与时间感知,看看怎么让多个设备“步调一致”。