建立WebRTC連接的第二步是獲取ICE服務地址。
ICE全稱:Interactive Connectivity Establishment,建立互動連接。
ICE 服務地址,主要是 TURN 和 STUN 服務器的地址,用于 WebRTC 在 NAT 網絡環境中協商建立連接。
上代碼:
import boto3
import jsonchannel_arn = "arn:aws-cn:kinesisvideo:cn-*****-*:*************:channel/********************/*************"
endpoint_https = "https://*-*******.kinesisvideo.cn-*****-*.amazonaws.com.cn"
region = "cn-*****-*"ak = str1
sk = str2
token = long_str3# 初始化 boto3
kvs_signaling = boto3.client("kinesis-video-signaling",aws_access_key_id=ak,aws_secret_access_key=sk,aws_session_token=token,region_name=region,endpoint_url=endpoint_https
)# 獲取ice server配置
ice_config = kvs_signaling.get_ice_server_config(ChannelARN=channel_arn
)print(json.dumps(ice_config, indent=4))
返回結果為:
/Users/testmanzhang/PycharmProjects/xxxx_yyyyyyy_zzzzz/.venv/bin/python3 /Users/testmanzhang/PycharmProjects/xxxx_yyyyyyy_zzzzz/get_ice.py
{"ResponseMetadata": {"RequestId": "7ea34817-****-403c-b637-******","HTTPStatusCode": 200,"HTTPHeaders": {"date": "Tue, 27 May 2025 06:00:54 GMT","content-type": "application/json","content-length": "1022","connection": "keep-alive","x-amzn-requestid": "7ea*****-bbd9-****-b637-*********","access-control-allow-origin": "*","access-control-allow-headers": "Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token","x-amz-apigw-id": "LNo7g****hTIEeHw=","access-control-allow-methods": "GET,OPTIONS,POST","access-control-expose-headers": "x-amzn-RequestId,x-amzn-ErrorType","x-amzn-trace-id": "Root=1-68355516-7e6*55914f*****d61fb25*7;Sampled=1;Lineage=2afa022c:0"},"RetryAttempts": 0},"IceServerList": [{"Uris": ["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"],"Username": "****:djE6YXJuOmF*********W5lc2lzdmlk****tbm9ydGgtMTozMzM5MzI0Nz******Y2hhbm5lbC9semdkNTQ5NmE3OTA3MjQzZTIy*********czNzA1MDk1","Password": "R5k/Hgc0vq******hmc2Wbr9uvAyH****=","Ttl": 300},{"Uris": ["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"],"Username": "*******:djE6YXJuOmF3******5lc2lzdmlkZW86Y24tbm9ydGgtMTozMzM*******NzU6Y2hhbm5lbC9semdkNTQ******MjQzZTIyZC8****A1MDk1","Password": "PO/VB*******ReePi/40*****u/Osk******","Ttl": 300}]
}Process finished with exit code 0
返回字段解析:
字段 | 含義 |
---|---|
username | 連接 TURN Server 時需要的用戶名 |
password | TURN Server 的訪問密碼 |
uris | 這個 ICE Server 支持的地址及協議類型 |
ttl | 憑據的有效期(秒) |
協議解析:
協議 | 描述 |
---|---|
udp | 首選,延遲低 |
tcp | 防火墻阻斷 UDP 時使用 |
tls | TLS over TCP,進一步穿透公司防火墻 |
另外,從打印結果中可以看出,返回了兩組KVS提供的TURN服務地址,我看了下app端開流過程中返回的ICE服務地址也是兩組TURN服務地址,為什么是兩組呢,原因如下:
1、高可用(High Availability)
AWS 提供多組 TURN 服務器是為了確保在 WebRTC 建連時具備冗余性和容錯性:
-
如果其中一個 TURN 服務器不可達,或者建立連接失敗,客戶端可以嘗試另一組服務器。
-
TURN 是“付費”的資源,AWS 有時候會根據地理位置或負載情況動態分配多個實例。
2、負載均衡(Load Balancing)
不同的 TURN 地址可能映射到不同的 AWS 實例或者地理位置:
-
AWS 會根據 Signaling Channel 的配置(如在中國區
cn-*****-*
)提供最近的數據中心 IP。 -
每組服務器都包含多個 URI(UDP、TCP、TLS),以適配不同網絡環境。
3、并行連接嘗試(ICE Trickle / Candidate Gathering)
WebRTC 會同時嘗試多個候選地址,按“連接成功的先后順序”選擇最佳路徑:
-
兩組服務器 + 每組多種協議(UDP、TCP、TLS)=> 提高連接成功率,尤其是在公司、學校等有防火墻限制的環境中。
下一篇,AWS WebRTC:獲取ICE服務地址(part 2)介紹WebRTC中ICE Agent的作用,如何跟ICE server聯動,跟ICE server的關系。