网络模型基础:OSI七层模型与TCP/IP四层模型,RTP/RTCP协议栈定位

做WebRTC流控,绕不开网络模型。很多人觉得这是基础课,直接跳过去看代码。我个人习惯是,先把地基打牢。你想想看,流控策略本质上就是在跟网络层打交道,不理解网络模型,调优的时候很容易抓瞎。

这一章,我们就把OSI七层模型和TCP/IP四层模型掰开揉碎了讲清楚,然后重点看看RTP/RTCP这对兄弟在协议栈里到底站在什么位置。

2.1 OSI七层模型:理想化的通信蓝图

OSI七层模型,全称是开放系统互连参考模型。它是个理论框架,定义了网络通信的七个层次。每个层各司其职,下层为上层提供服务。

我刚开始接触网络时,觉得这七层太抽象。后来在项目中排查一个视频卡顿问题,从应用层一路追到物理层,才真正体会到分层的好处——每一层的问题都可以独立排查。

层级 名称 核心职责 典型协议/设备
7 应用层 为用户提供网络应用服务 HTTP, FTP, SIP
6 表示层 数据格式转换、加密、压缩 SSL/TLS, JPEG
5 会话层 建立、管理、终止会话 NetBIOS, RPC
4 传输层 端到端可靠传输、流量控制 TCP, UDP
3 网络层 路由选择、逻辑寻址 IP, ICMP, 路由器
2 数据链路层 帧封装、介质访问控制、差错检测 以太网, PPP, 交换机
1 物理层 比特流传输、电气特性 网线, 光纤, 集线器

关键理解:OSI是概念模型,实际工程中很少完全照搬。但它教会我们一件事——分层解耦。每一层只关心自己的事,出了问题也只在那一层解决。

2.2 TCP/IP四层模型:互联网的实战派

OSI七层模型太理想化了。互联网真正跑起来,用的是TCP/IP四层模型。它把七层压缩成了四层,更贴近实际工程。

说白了,TCP/IP模型就是互联网的「实战派」。它去掉了表示层和会话层,把应用层以上的东西全塞进了一层。

TCP/IP四层 对应OSI层级 核心协议
应用层 5/6/7 HTTP, SIP, RTP, RTCP
传输层 4 TCP, UDP
网络层 3 IP, ICMP
网络接口层 1/2 以太网, WiFi

注意看,RTP和RTCP在TCP/IP模型里被归到了应用层。但严格来说,它们更像是「半传输层」的协议。为什么这么说?往下看。

2.3 RTP/RTCP协议栈定位:站在UDP肩膀上的实时传输双雄

RTP(实时传输协议)和RTCP(实时传输控制协议)是WebRTC的命根子。它们俩是双胞胎,一个负责运数据,一个负责反馈质量。

它们的协议栈位置,我画了张图,你一看就明白。

RTP/RTCP 协议栈定位 应用层 (Application Layer) WebRTC 应用 / 浏览器 / 自定义客户端 RTP / RTCP 层 RTP: 媒体数据传输 | RTCP: 质量反馈与控制 传输层 (Transport Layer) UDP (主要) / TCP (降级) 网络层 (Network Layer) IP (IPv4 / IPv6) 网络接口层 (Network Interface Layer) 协议栈方向

这张图里,RTP/RTCP被单独拎出来放在应用层和传输层之间。为什么这么画?

因为RTP虽然跑在UDP之上,但它做的事情远不止「传输」那么简单。它要处理时间戳、序列号、负载类型标识、SSRC同步源标识等等。这些功能,严格来说已经超出了传输层的范畴。

我的经验:在WebRTC源码里,RTP/RTCP的实现是在应用层完成的。但调试的时候,我习惯把它们当作「传输层扩展」来看待。这样更容易理解为什么流控算法要同时关注RTP的发送速率和RTCP的反馈报文。

2.4 RTP与RTCP的分工协作

RTP和RTCP共用同一个UDP端口对(一个偶数端口给RTP,下一个奇数端口给RTCP)。它们的分工非常明确:

  • RTP:负责搬运媒体数据。音频帧、视频帧,都封装成RTP包发出去。它不保证可靠传输,也不保证顺序到达。实时性优先。
  • RTCP:负责反馈信道质量。发送端报告(SR)、接收端报告(RR)、源描述(SDES)、BYE报文等。流控算法全靠RTCP的反馈来调整发送策略。

我记得有一次线上问题,用户反馈视频卡顿。我抓包一看,RTCP的接收端报告里丢包率飙到了15%。但RTP流本身还在正常发。这就是典型的「RTP埋头苦干,RTCP喊救命」的场景。

避坑指南:我曾经遇到过一个坑——RTCP的反馈周期默认是5秒。对于WebRTC这种毫秒级流控来说,5秒太长了。等RTCP报告过来,网络状况早就变了。所以实际工程中,我们会把RTCP的发送间隔压缩到1秒甚至更短。但要注意,RTCP报文本身也会占用带宽,不能压得太狠。

2.5 为什么WebRTC选择UDP而不是TCP?

这个问题面试经常问。答案其实很简单:实时性。

TCP有重传机制,丢包了会等重传,这会导致延迟不可控。WebRTC做的是实时通信,延迟超过400ms,用户就能感觉到明显的卡顿。所以WebRTC选择UDP,丢包了不重传,而是通过FEC(前向纠错)和流控算法来补偿。

但UDP也有缺点——它没有拥塞控制。这就是为什么WebRTC要在应用层自己实现一套流控机制。GCC(Google Congestion Control)、REMBB、Transport-CC,这些都是为了弥补UDP在拥塞控制上的缺失。

特性 TCP UDP WebRTC的选择
可靠性 可靠,有重传 不可靠,无重传 UDP + 应用层补偿
延迟 高(重传导致抖动) 低(无重传) UDP
拥塞控制 内置(慢启动、拥塞避免) 无 应用层实现(GCC等)
适用场景 文件传输、网页浏览 实时音视频、在线游戏 实时通信

一句话总结:WebRTC选择UDP,是因为它把「实时性」放在了「可靠性」前面。丢包可以忍,延迟不能忍。而RTP/RTCP就是在这个UDP的「快车道」上,自己建了一套「交通管制系统」。

2.6 本章小结

这一章我们理清了网络模型的基础。OSI七层是理论框架,TCP/IP四层是实战模型。RTP/RTCP站在UDP的肩膀上,一个负责运数据,一个负责反馈质量。理解了这个定位,后面讲GCC算法、Transport-CC时,你就能知道它们到底在哪个层级发挥作用。

嗯,基础打牢了,后面才能跑得快。