【網(wǎng)絡(luò)通信 -- WebRTC】WebRTC 基礎(chǔ)知識(shí) -- ICE 交互總結(jié)
【1】ICE 的一般概念簡(jiǎn)介
ICE 角色
offer (主動(dòng)發(fā)起)的一方為 controlling 角色
answer (被動(dòng)接受)的一方為 controlled 角色
full ice agent 必須是 controlling role,lite ice agent 是 controlled;srs 僅支持 lite ice
ICE 模式
FULL ICE,雙方都要進(jìn)行連通性檢查;ice 客戶端實(shí)現(xiàn),該模式既可以收 binding request,也可以發(fā) binding request
Lite ICE,在 FULL ICE 和 Lite ICE 互通時(shí),只需要 FULL ICE 一方進(jìn)行連通性檢查,Lite 一方只需回應(yīng) response 消息,該模式對(duì)于部署在公網(wǎng)的設(shè)備比較常用;只接受并回復(fù) binding request 請(qǐng)求,不會(huì)主動(dòng)發(fā)送 binding request 請(qǐng)求給對(duì)方
sdp 中有 a=ice-lite 字樣
srs 服務(wù)器采用 lite-ice 模式
Candidate 地址
媒體傳輸?shù)暮蜻x地址,組成 candidate pair 做連通性檢查,確定傳輸路徑
Type 類型
Host (Host Candidate),該地址是一個(gè)真實(shí)的主機(jī),參數(shù)中的地址和端口對(duì)應(yīng)一個(gè)真實(shí)的主機(jī)地址,該地址來源于本地的物理網(wǎng)卡或邏輯網(wǎng)卡上的地址,對(duì)于具有公網(wǎng)地址或者同一內(nèi)網(wǎng)的端可以用;
Srvflx (Server Reflexive Candidate),該地址是通過 Cone NAT (錐形 NAT) 反射的類型,參數(shù)中的地址和端口是端發(fā)送 Binding 請(qǐng)求到 STUN/TURN server 經(jīng)過 NAT 時(shí),NAT 上面分配的地址和端口
Relay (Relayed Candidate),該地址是端發(fā)送 Allocate 請(qǐng)求到 TURN server,由 TURN server 用于中繼的地址和端口,該地址和端口是 TURN 服務(wù)用于在兩個(gè)對(duì)等點(diǎn)之間轉(zhuǎn)發(fā)數(shù)據(jù)的地址和端口,是一個(gè)中繼地址端口;( 可能是本機(jī)或 NAT 地址);
Prflx(Peer Reflexive Candidate),該地址是通過發(fā)送 STUN Binding 時(shí),通過 Binding 獲取到的地址;在建立連接檢查期間新發(fā)生,參數(shù)中的地址和端口是端發(fā)送 Binding 請(qǐng)求到 STUN/TURN server 經(jīng)過 NAT 時(shí),NAT 上分配的地址和端口
Componet ID
傳輸媒體的類型,1 代表 RTP; 2 代表 RTCP
WebRTC 采用 Rtcp-mux 方式,也就是 RTP 和 RTCP 在同一通道內(nèi)傳輸,減少 ICE 的協(xié)商和通道的保護(hù)
Priority
Candidate 的優(yōu)先級(jí)
Base
candidate 的基礎(chǔ)地址
SDP 中的 Candidate 地址描述
ICE 保活
對(duì)于每個(gè) ICE 通道,都需要為其會(huì)話進(jìn)行保護(hù)
采用 STUN binding request 或者 STUN binding indication
如果沒有收到響應(yīng),則會(huì)重傳,直到最大重傳次數(shù)
ICE 角色沖突的解決方法
當(dāng)兩端角色都為 controlling 或者 controlled 角色沖突時(shí),在連通性檢查階段,要求發(fā)送信息 binding request 消息中必須要帶上 tie-breaker 屬性
當(dāng)出現(xiàn)沖突時(shí),比較 tie-breaker 大小,值比較大的則被認(rèn)為是 controlling,同時(shí)回應(yīng) 487 錯(cuò)誤給對(duì)端,對(duì)端收到消息 487 錯(cuò)誤后切換角色
私信【1】領(lǐng)取上圖學(xué)習(xí)webRTC高級(jí)開發(fā)技術(shù),資源資料共享
【2】ICE 的一般過程
收集 candidates
客戶端無法知道自己的外網(wǎng) IP,需要發(fā)送 stun 包給 stun 服務(wù),stun 服務(wù)返回對(duì)應(yīng)客戶端的出口 IP 和端口,返回來的地址和自己本地地址做比對(duì)便可以知道 NAT 類型
根據(jù) Componet ID,獲取本機(jī) host address;從 STUN 服務(wù)器獲取 srvflx address;從 TURN 服務(wù)器獲取 relay address;同時(shí)生成 foundation;
刪除重復(fù)的 candidate 收集地址完成后,需要去掉重復(fù)的 candidate,如果兩個(gè) candidate 的地址一樣,并且 Base 地址也一樣則刪除
交換 candidates
ICE 交換 candidates 方式可以使用 sdp 交換,也可以使用單獨(dú)信令交換
ICE 交換 candidates sdp 方式
ICE 使用 offer/answer 方式,雙方通過 SDP 協(xié)商交換 candidate 信息;
Candidate 信息包括 type, foundation, base, component id, transport
SDP 示例
生成 candidate pairs
在本端收到遠(yuǎn)端 candidates 后,將 Component ID 和 transport protocol 相同的 candidates 組成 pair
修整 candidate pair,如果是 srvflx 地址則需要用其 base 地址替換
連通性檢查
將 candidate pairs 按照優(yōu)先級(jí)排序,供連通性檢查使用,其實(shí)就是把 sdp 中的 candidate 地址和本地的 candidate 地址進(jìn)行排隊(duì),組成一個(gè) checklist 表,生成按優(yōu)先級(jí)排序的鏈表,按優(yōu)先順序發(fā)起每個(gè)候選地址對(duì)的檢查;
連通性檢查成功的 candidate pair 按優(yōu)先級(jí)排序的鏈表,用于 ICE 提名和選擇最終路徑,連通性檢查完畢后,開始進(jìn)行優(yōu)先級(jí)排序
如果 checklist 中存在 relay candidate,則必須先為 relay candidate 創(chuàng)建 permission;permission 就是一個(gè)許可,如果沒有創(chuàng)建許可,發(fā)送的包將被丟棄 (針對(duì) TURN 時(shí)使用)
ICE 使用 STUN binding request/response,包含 Fingerprint 檢驗(yàn)校驗(yàn)機(jī)制
如果 A 收到 B 的 response 則代表連通性檢查成功,否則需要進(jìn)行重傳直到超時(shí),在建立連接時(shí),如果沒有響應(yīng),則會(huì)以 RTO 時(shí)間進(jìn)行重傳,每次翻倍,直到最大重傳次數(shù);
STUN 請(qǐng)求采用 STUN short-term credential 方式認(rèn)證,即一段時(shí)間如果沒有 stun 包發(fā)送時(shí),該連接會(huì)過期失效,因此需要不斷地發(fā)送 stun 包并收到回復(fù)的 stun 包,用來保持連接有效性;剛開始建聯(lián)時(shí),以 50ms 間隔頻率發(fā)送,后期穩(wěn)定后是以 2.5s 的間隔頻率發(fā)送,維持連接的有效性
STUN USERNAME 屬性 ”RemoteUsername : localUsername”
兩端在 SDP 協(xié)商時(shí)交換 ice-pwd 和 ice-ufrag,以得對(duì)端用戶名和密碼,計(jì)算 stun 包中的 MESSAGE-INTEGRITY 時(shí),需要自己本地的 ice-pwd 去計(jì)算 Hmac-SHA1,生成對(duì)應(yīng)的屬性值串,用來檢查消息的完整性
生成 validlist
將連通性檢查成功的 candidate pair 按優(yōu)先級(jí)排序加入 validlist,此時(shí)本地 candidate 填寫的是公網(wǎng)映射地址,remote candidate 填寫的是對(duì)端發(fā)送的 STUN binding request 地址
提名 candidate pair
由 controlling 提名哪對(duì) candidate pair 為 valid pair
提名方式分為普通提名和進(jìn)取型提名
普通提名方式會(huì)做兩次連通性檢查,在第一次做連通性檢查時(shí)不會(huì)帶上 USE-CANDIDATE 屬性,而是在生成的 validlist 中選擇 pair 再進(jìn)行一次連通性檢查,這時(shí)會(huì)帶上 USE-CANDIDATE 屬性,并且置位 nominated flag (ICE 提名地址對(duì))
進(jìn)取型方式則是每次發(fā)送連通性檢查時(shí)都會(huì)帶上 USE-CANDIDATE 屬性,并且置位 nominated flag (ICE 提名地址對(duì)),不會(huì)再去做第二次連通性檢查
選擇最終傳輸?shù)刂?/p>
ICE 在提名的 valid pair 中選擇優(yōu)先級(jí)最高的那對(duì)作為本次 ICE 流程傳輸?shù)刂罚缓箝_始建立 DTLS 連接,開始握手,交換證書
【3】ICE 交互示例解析
如果 A 收到 B 的 response,則代表連通性檢查成功,否則需要進(jìn)行重傳直到超時(shí)
在建立連接時(shí),如果沒有響應(yīng),則會(huì)以 RTO 時(shí)間進(jìn)行重傳,每次翻倍,直到最大重傳次數(shù)
STUN 請(qǐng)求,采用 STUN short-term credential 方式認(rèn)證
STUN USERNAME 屬性 ”
RemoteUsername:localUsername”
兩端在 SDP 協(xié)商時(shí)交換 ice-pwd 和 ice-ufrag,以得對(duì)端用戶名和密碼
STUN 檢查請(qǐng)求中需要檢查地址的對(duì)稱性,請(qǐng)求的源地址是響應(yīng)的目的地址,請(qǐng)求的目的地址是響應(yīng)的源地址,否則都設(shè)置狀態(tài)為 Failed
ICE 的完整實(shí)現(xiàn)過程
1. 為中繼候選地址生成許可 (Permissions)
2. 從本地候選往遠(yuǎn)端候選發(fā)送 Binding Request
在 Binding 請(qǐng)求中通常需要包含特殊的屬性,以在 ICE 進(jìn)行連接性檢查的時(shí)候提供必要信息
PRIORITY 和 USE-CANDIDATE
終端必須在其 request 中包含 PRIORITY 屬性,指明其優(yōu)先級(jí),優(yōu)先級(jí)由公式計(jì)算獲得;如果有需要也可以給出特別指定的候選 (即 USE-CANDIDATE 屬性)
ICE-CONTROLLED 和 ICE-CONTROLLING
在每次會(huì)話中,每個(gè)終端都有一個(gè)身份,存在兩種身份,即受控方(controlled role) 和主控方(controlling role),主控方負(fù)責(zé)選擇最終用來通訊的候選地址對(duì),受控方被告知哪個(gè)候選地址對(duì)用來進(jìn)行哪次媒體流傳輸,并且不生成更新過的 offer 來提示此次告知;發(fā)起 ICE 處理進(jìn)程 (即生成 offer)的一方必須是主控方,而另一方則是受控方;如果終端是受控方,那么在 request 中就必須加上 ICE-CONTROLLED 屬性;如果終端是主控方,就需要 ICE-CONTROLLING 屬性
生成 Credential
作為連接性檢查的 Binding Request 必須使用 STUN 的短期身份驗(yàn)證;驗(yàn)證的用戶名被格式化為一系列 username 段的聯(lián)結(jié),包含了發(fā)送請(qǐng)求的所有對(duì)等端的用戶名,以冒號(hào)隔開;密碼就是對(duì)等端的密碼
3. 處理 Response
當(dāng)收到 Binding Response 時(shí),終端會(huì)將其與 Binding Request 相聯(lián)系,通常通過事務(wù) ID;隨后將會(huì)將此事務(wù) ID 與候選地址對(duì)進(jìn)行綁定
終端收到成功響應(yīng)之后,先檢查其 mApped address 是否與本地記錄的地址對(duì)有匹配,如果沒有則生成一個(gè)新的候選地址,即對(duì)等端的反射地址;如果有匹配,則終端會(huì)構(gòu)造一個(gè)可用候選地址對(duì) (valid pair);
通常很可能地址對(duì)不存在于任何檢查列表中,此時(shí)檢索檢查列表中沒有被服務(wù)器反射的本地地址,將這些地址的本地候選轉(zhuǎn)換成服務(wù)器反射地址的基地址并把冗余的地址去除掉;
失敗響應(yīng)
如果 STUN 傳輸返回 487(Role Conflict) 錯(cuò)誤響應(yīng),終端首先會(huì)檢查其是否包含了 ICE-CONTROLLED 或 ICE-CONTROLLING 屬性;如果有 ICE-CONTROLLED 終端必須切換為 controlling role; 如果請(qǐng)求包含 ICE-CONTROLLING 屬性則必須切換為 controlled role;切換完成,終端必須將使得產(chǎn)生 487 錯(cuò)誤的候選地址對(duì)放入檢查隊(duì)列中,并將此地址對(duì)的狀態(tài)設(shè)置為 Waiting
成功響應(yīng),一次連接檢查在滿足下列所有情況時(shí)候就被認(rèn)為成功
STUN 傳輸產(chǎn)生一個(gè) Success Response
response 的源 IP 和端口等于 Binding Request 的目的 IP 和端口
response 的目的 IP 和端口等于 Binding Request 的源 IP 和端口