WebRTC 网络连接、NAT 穿透与安全机制深度拆解
一、总览WebRTC 的 P2P 连接涉及三大核心机制:ICE 框架- 解决 NAT 穿透SDP 协商- 媒体能力匹配DTLS-SRTP- 端到端加密二、ICE 框架与 NAT 穿透机制2.1 ICE 的核心流程ICE(Interactive Connectivity Establishment)实现了在复杂网络环境下自动发现可连接的地址对。源码结构:p2p/base/ ├── port_allocator.h # 端口分配器基类 ├── port.h # Port 基类(Host/STUN/TURN) ├── connection.h # 连接对管理 └── p2p_transport_channel.cc # ICE 主控制逻辑候选地址类型体系根据RFC 5245,WebRTC 实现四种候选地址类型:// api/candidate.h - 候选类型定义enumIceCandidateType{kHost,// 本地IP(无NAT)kSrflx,// Server Reflexive(通过STUN发现的外网IP)kPrflx,// Peer Reflexive(从远端返回的我们IP)kRelay// Relay(通过TURN中继)};工作原理图解:┌─────────────────────┐ │ 本地应用 │ └──────────┬──────────┘ │ ┌──────▼──────────────────────────┐ │ P2PTransportChannel │ │ (ICE 控制器) │ └──────┬───────────────────────────┘ │ ┌──────▼────────────────────┐ │ PortAllocator │ │ (BasicPortAllocator) │ └──┬──────────────────────┬──┘ │ │ ┌──▼───────────┐ ┌────▼──────────┐ │ Host Port │ │ STUN Port │ │ (UDP/TCP) │ │ (Server Refl) │ │ 例:192.168..│ │ 例:42.197... │ └──────────────┘ └────┬──────────┘ │ ┌────▼──────────┐ │ TURN Port │ │ (Relay) │ │ 例:relay.xx.│ └───────────────┘2.2 Port 类型实现Host Port(直接连接)位置:p2p/base/port.h(line 150+)// 代表本地网络接口上的一个通信端点classPort{public:virtual~Port();// 候选地址conststd::vectorCandidatecandidates()const;// 发送数据virtualintSendTo(constvoid*data,size_t size,constSocketAddressaddr,constAsyncPacketSocket::Optionsoptions,boolpayload)=0;// 接收数据处理voidOnReadPacket(constReceiveBufferbuf,constSocketAddressaddr);};Host Port 生命周期:绑定本地网络接口立即可用(无需外部查询)仅在同一 LAN 内有效STUN Port(Server Reflexive 地址)位置:p2p/base/stun_port.h(line 49+)classUDPPort:publicPort{public:// 创建 STUN 端口staticstd::unique_ptrUDPPortCreate(constPortParametersRefargs,AsyncPacketSocket*socket,boolemit_local_for_anyaddress,std::optionalTimeDeltastun_keepalive_interval);};STUN 工作原理:┌────────────┐ ┌──────────────┐ │ 本地客户端 │ │ STUN 服务器 │ └─────┬──────┘ └──────┬───────┘ │ 1. Binding Request │ │ From: 192.168.1.100:54321 │ ├───────────────────────────────────────── │ │ │ │ 2. Binding Response │ │ XOR-MAPPED-ADDRESS: │ │ 42.197.xxx:54321 │ │ ─────────────────────────────────────────┤ │ │ │ 候选地址 = 42.197.xxx:54321 │ │ (Server Reflexive Address) │关键参数(p2p/base/stun_port.h line 44-46):// STUN 保活间隔 - 防止 NAT 绑定过期inlineconstexprTimeDelta kHighCostPortKeepaliveLifetime=TimeDelta::Seconds(2*60);// 高成本网络(蜂窝)每2分钟发送一次TURN Port(中继地址)位置:p2p/base/turn_port.h(line 55+)classTurnPort:publicPort{public:enumPortState{STATE_CONNECTING,// 连接中STATE_CONNECTED,// TCP/TLS 已连接STATE_READY,// TURN Alloca