上一篇,已经获取到了ICE服务地址,从返回结果中看,是两组TURN服务地址。
拿到这些地址有什么用呢?接下来就要说到WebRTC中ICE Agent的作用了,返回的服务地址会传给WebRTC最终给到ICE Agent。
ICE Agent的作用:
1、收集候选地址(ICE Candidates),包括 host
、srflx
、relay
、prflx
:
类型 | 来源说明 |
---|---|
host |
本地 WebRTC自己通过系统网络接口直接获取的。 |
srflx |
使用 STUN 服务器,发现 NAT 映射后的公网 IP |
prflx |
在通信过程中由对端反推出的 IP(较少见) |
relay |
使用 TURN 服务器,提供中继服务 |
2、测试连接性(connectivity checks):尝试不同的候选对组合
ICE Agent 通过发送 STUN Binding Request 检查候选对(candidate pair)的可连通性。
STUN Binding Request 是 ICE 用来做连接性检测的标准机制。
无论对端 candidate 是哪种类型(host、srflx、relay),只要能够被访问,它就可以接收到并响应 STUN 消息。
检查是否连通 = 看是否能收到 STUN Binding Response。
虽然 relay 类型的候选地址是由 TURN 服务提供的,但它本质上依然支持 STUN Binding Request 的收发,作为 ICE 的连接性检测机制的一部分。
3、优选路径(nominating best candidate pair):优先使用能直连的、延迟最小的路径;当直连失败时,才使用 TURN 中继。
会按 ICE 优先级 测试连接路径,比如:
Host ↔ Host
Host ↔ srflx
srflx ↔ srflx
relay ↔ relay(最慢,最贵)
通常优先选择 非中继的直连链路(即 P2P)。
补充说明一下,收集候选地址(candidates)指的是仅收集本端(local)的候选地址,包括 host
、srflx
、relay,
将这些候选地址通过信令通道(比如 SDP)发送给对方,就是说本地收集完成后,WebRTC 应用会通过 SDP(Session Description Protocol) 把这些 candidates 发送给对端。
4、接收。对端候选地址的获取来自信令过程,对端收集完自己的候选地址后,会通过信令通道传送过来(在 SDP 中或者通过 trickle ICE 逐步发送),本地 ICE Agent 会接收到这些对端候选,并将其组合成 candidate pairs(候选对)进行连接性检测。
这时候我对比了一下,iOS app端的打印日志:
[iOS-P2P:2f214551-*****A1100*****] ICE servers retrieved - Count: 3
2025-05-19 15:48:29.611+0800 [Open Stream] ✅✅✅ INFO className:Channel+Tracker fuction:logP2PEvent(_:details:) line:25
[iOS-P2P:2f214551-C2E2DA110017952] ICE[1/3] - turn:***-***-***-***.t-*****.kinesisvideo.cn-****-*.amazonaws.com.cn:443?transport=udp, turns:***-***-***-***.t-*******.kinesisvideo.cn-*****-*.amazonaws.com.cn:443?transport=udp, turns:***-***-***-***.t-*******.kinesisvideo.cn-****-*.amazonaws.com.cn:443?transport=tcp
2025-05-19 15:48:29.612+0800 [Open Stream] ✅✅✅ INFO className:Channel+Tracker fuction:logP2PEvent(_:details:) line:25
[iOS-P2P:2f214551-*****A1100*****] ICE[2/3] - turn:**-***-***-***.t-********.kinesisvideo.cn-****-*.amazonaws.com.cn:443?transport=udp, turns:**-***-***-***.t-*******.kinesisvideo.cn-****-*.amazonaws.com.cn:443?transport=udp, turns:**-***-***-***.t-*********.kinesisvideo.cn-***-*.amazonaws.com.cn:443?transport=tcp
2025-05-19 15:48:29.613+0800 [Open Stream] ✅✅✅ INFO className:Channel+Tracker fuction:logP2PEvent(_:details:) line:25
[iOS-P2P:2f214551-C2E2DA110017952] ICE[3/3] - stun:stun.kinesisvideo.*.amazonaws.com:443
iOS app的日志中是有stun返回的,为什么boto3请求却没有返回呢,查了一下:
AWS 的 WebRTC Signaling Channel 默认不提供 STUN Server,只靠 TURN 来确保连接可靠性。
AWS 官方设计如此:
AWS 的
get_ice_server_config()
接口返回的 IceServerList 默认只包含 TURN server。这些 TURN server 本身就能提供中继功能(比 STUN 更通用),AWS 更倾向于提供自己可控的服务。
AWS 文档说明:
The returned ICE server list contains TURN-only servers. STUN servers are not included in this API.
我问了一下iOS开发同学,确实在本地配置了STUN server:
stun.kinesisvideo.{数字}.amazonaws.com
下一篇:AWS WebRTC:获取ICE服务地址(part 3)介绍STUN服务和TURN服务的作用。