ice 筆記

ice作用:與candidates相關的工作. moule: 驗證ICE支持能力,候選地址採集,候選地址優先級排序(默認候選地址),角色確定和角色作用,checklist and 連通性檢測.

ice 流程:gather candidates(優先級排序;去除冗餘;選擇默認Candidate)--sdp(offer/answer)--connectivity check---nominated flag/valid list---state completed 
ice state: frozen--waiting--in progressing ---completed

ice 架構圖: 沒找到
0 名詞解釋
candidate info:IP address, port and transport protocol, 
and properties:the foundation, component ID, priority, type(reflexive,relay,local), and related transport address:
agent is client or server; 
component-id: is rtp or rtcp candidate identify,rtp is 1,rtcp is 2
foundation : is composed of 1 to 32 <ice-char>
BASE: 指與反射地址對應的本機地址。本機地址的BASE就是本機地址。
Relayed Candidate的Base就是Candidate 自己,如果Relayed Candidate和Host Candidate相同,這個地址應該被丟棄。
1 turn server and stun server 區別?
stun bind 就是爲了直連穿透nat。
stun bind request 中username:ice-ufra; pwd: ice-pwd

stun的返回的ip,port rtp也用這個,因爲這個翻譯的地址已經和內網地址綁定了,肯定有效不能找錯
因爲RTP與RTCP包總是以0b10(v=2)打頭,而STUN是0b00
turn server 只管交互信令,即信令核心交換sdp
TUN服務器的端口號 默認是3478

turn server 實現:[https://blog.csdn.net/CrystalShaw/article/details/103505029]
2 驗證ICE支持能力
sdp a=candidate,...
3 候選地址採集 gathering candidates
三種方法.local candidates,nat 反射(stun server), relay ip(turn server)
4 候選地址優先級排序
每個agent 3 個candidates則3*3=9次檢測,檢測即STUN bingding,stun request/response.根據rtt選擇最優的
每種candidates有權重,根據公式計算優先級,sort
計算候選的優先級。設置主機候選的類型優先參數爲最高值126,服務器反射候選的類型優先參數爲100,中繼候選的類型優先參數爲最低值0.
本地參數設爲65 535,分組ID爲1。
經計算,主機候選的優先級爲2 130 706 431,服務器反射候選的優先級爲1 694 498 815,中繼候選的優先級爲16 777 215。
按候選優先級高低排序。
分配主機候選的基礎(Foundation)屬性爲1,服務器反射候選的基礎屬性爲2,中繼候選的基礎屬性爲3。
5 默認候選地址
優先級最高的
6 sdp 解碼 (offer 就是sdp)
Lite必須在SDP包含一個“a=ice-lite”。如果是Full實現,則不能包含該屬性。sdp: This specification defines seven new SDP attributes -- 
 the "candidate", "remote-candidates", "ice-lite", "ice-mismatch", "ice-ufrag", "ice-pwd", and "ice-options" attributes.
sdp example: 
     The offer, with the variables replaced with their values, will look like (lines folded for clarity):
       v=0
       o=jdoe 2890844526 2890842807 IN IP4 10.0.1.1
       c=IN IP4 192.0.2.3
       a=ice-pwd:asd88fgpdd777uzjYhagZg
       a=ice-ufrag:8hhY
       m=audio 45664 RTP/AVP 0
       a=rtpmap:0 PCMU/8000
       a=candidate:1 1 UDP 2130706431 10.0.1.1 8998 typ host
       a=candidate:2 1 UDP 1694498815 192.0.2.3 45664 typ srflx raddr 10.0.1.1 rport 8998
notes: a="lite"在sdp中(這個是config的)
7 offer-answer
offer/update -answer,第一次offer-answer,之後用UPDATE 更新
offer內容是sdp(a=candidate,video,audio,a="lite")
兩個同時發送offer,都是full,誰是controlling?
https://datatracker.ietf.org/doc/rfc6337/?include_text=1  第4章
理解爲基於uac和uas,這個應該是connect的時候知道的,uac 發送prack,uas 發送 update
雙方通過信令 or http 交換sdp,sdp中包含candidates
8 角色確定和角色作用
controlling特有的屬性
controlled特有的屬性:a=remote-candidates attribute.
三種情況:full,lite 模式與controlling,controlled 關係
1) 兩個full 
offer一方是server,是controlling.另一方是client,controlled
2) 一個full,一個lite 
肯定是full一方發送offer。offer一方是server,是controlling.另一方是client,controlled
3) 兩個lite
offer一方是server,是controlling.另一方是client,controlled
9 對於full實現來說,還將構造check list以及開始連通性檢測
webrtc使用sdp除了描述媒體類型,還有一些ice的連接候選項。
I 服務器提供offer sdp
II chrome瀏覽器收到sdp之後,創建應答sdp和ice 候選項發送到服務器。
III 雙方都收到sdp之後會首先進行ice連接(即一條udp鏈路)。
IV 連接建立之後,發起dtls交互,得到遠端和本地的srtp的key ??
(分別用於解密遠端到來的srtp和加密本地即將發出去的rtp數據包)。
執行連接檢查(ice select pair)( 根據優先級進行排序, 凍結候選地址  )
(1) 按優先級對candidate pair進行排序
根據上面三種的權重,計算優先級
https://blog.csdn.net/dxpqxb/article/details/22040017?locationNum=10
(2) 按照優先級順序對每個candidate pair發起檢查
(3) 對單agent發起的檢查進行確認

checklist列表和其他模塊之間的關係彙總
候選配對狀態計算:ice candidates: Frozen,Waiting,In-Progress,Succeeded,Failed
ice state 運行狀態,完成狀體,失敗狀態(ice 結束)
waiting 狀態即準備test的candidates pair,frozen指沒有測試的candidates pair

connect check:兩種模式,兩種角色,兩種提名
Full Implementation Procedures and Lite Implementation Procedures
controlling nominate REGULAR NOMINATION or AGGRESSIVE NOMINATION.
regular 和 aggressive 提名: 前者一對一對測試,後者只要測試成功一對就media發包 

連通性檢測. 
1) 提名  (1) regular 每對都檢測,最終根據rtt 提名   (2) aggressive 則第一個測試通過的就是 
2) 兩端提名的pair不一樣.統一兩端;聽controlling的,因爲controlling nominate?
統一兩端pair用update offer

STUN Extensions:
required
0x0024 : priority
0x0025 : use-candidate (nominated pair flag)
optional
0x8029 : ice-controlled
0x802a : ice-controlling
stun extension:  USE-CANDIDATE,ICE-CONTROLLED,ICE-CONTROLLING
10 lite特有屬性
都有獨立ip. 不做收集ip,和check connect.a="lite" 在sdp中 
When two lite implementations connect, no checks are sent.
Lite 實現無需收集candidate,只包含自身的host candidate。
lite 不需要連通性檢測.lite 肯定是獨立ip(因爲一定能連上它,不做stun bind),
只要能夠正常"響應"連通性檢測的請求即可
11 定時檢查
12 notify 媒體
接收和發送rtp,rtcp數據(srtp加密)了,通過ice的連接發送出去。
(dtls 和 srtp 的數據包都是通過ice的udp連接進行傳輸的。)

others:
trickle ice:
實際使用webrtc開發音視頻應用時遇到的一個問題是呼叫“建立很慢”,原因是:ice過程耗費過多時間
a=ice-options:trickle 通知對端支持trickle,即sdp裏面描述媒體信息和ice候選項的信息可以分開傳輸。
使用Trickle ICE必須定義一個方式表明支持Trickle ICE,雙方都要支持trickle ice
這中間時間浪費在所有candidate都獲取後才發送,所以爲了加速通話建立時間,把連通性檢測的時間提前,方案叫trickle ice, 
其思想是客戶端一邊收集candidate一邊發送給對方,比如local candidate 不需要通過stun獲取直接就可以發起,
這降低了了連通性檢測完成的時間

 

turn server 實現:https://blog.csdn.net/CrystalShaw/article/details/103505029

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章