turn協議的工做原理

Allocate請求

客戶端經過發送Allocate請求給STUN服務器,從而讓STUN服務器爲A用戶開啓一個relay端口。
 
 

a) 客戶端A向STUN Port發送Allocate請求(圖中綠色部分)
** b) **STUN服務器接收到客戶端A的Allocate請求,服務器一看是Allocate請求,則根據relay端口分配策略爲A分配一個端口。
c) 服務器發送response成功響應。在該response中包含XOR-RELAYED-ADDRESS屬性。該屬性值就是A的relay端口的異或結果。
d) 客戶端接收到response後,就知道了本身的relay地址。該relay地址是個公網地址,能夠看做是客戶端A在公網上的一個代理,任何想要聯繫A的客戶 端,只要將數據發送到A的relay地址就能夠了,具體的轉發原理請看下一小節。服務器

Relay端口消息的轉發

任何想要聯繫客戶端A的人,只要知道客戶端A的relay地址就能夠了。flex

(1)A的Relay端口接受其餘客戶端的消息

 
 

如上圖所示:由於客戶端A位於NAT後,因此其餘客戶端沒法和A創建直接的通訊。可是客戶端A在STUN服務器上申請了一個端口(上圖中:A的relay端口),其餘客戶端想要和A通訊,那麼只須要將信息發送到「A的relay端口」,STUN服務器會將從relay端口接收到的信息經過STUN Port發送給A。代理

(2)A的響應消息原路返回

A應答其餘客戶端發來的消息的時候,是經過原路返回的。code


 
 

思考
1.STUN服務器爲何不直接從A的relay端口把數據轉發給A呢(以下圖所示)?而非要從STUN端口發送?
orm

 
 

2.客戶端A的響應消息在原路返回的時候,A的響應消息是先發送到了STUN Port,而後再經由A的relay Port發出的。那麼A的relay Port是怎麼知道它要把數據發送到哪呢?

 

Refresh請求

STUN服務器給客戶端A分配的relay地址都具備必定的有效時長,多是30秒或者1分鐘或者幾十分鐘。客戶端若是須要STUN服務器一直爲它開啓這個端口,就須要定時的向STUN服務器發送請求,該請求用刷新relay端口的剩餘時間。
在標準的TURN(RFC 5766)協議中,客戶端A向STUN服務器發送Allocate請求,STUN服務器在響應消息中添加了一個「LifeTime」的屬性,該屬性表示relay的存活時間。 客戶端須要在relay的存活時間內週期性的調用REFRESH請求,服務端接收到REFRESH請求後,刷新剩餘時間;當REFRESH請求中的lifetime屬性爲0時,說明是客戶端主動要求關閉relay地址。io

STUN端口的保活

因爲與STUN服務器通訊使用的是UDP,因此爲了保持一個長鏈接,須要客戶端週期性的向STUN服務器的STUN Port發送心跳包。
週期性心跳包的目的就是,使得NAT設備對客戶端A的反射地址(Server Reflexive Address)一直有效。使得從STUN Port發送的數據能經過A的反射地址到達A。此處不理解的能夠查閱「NAT 類型的分類以及NAT的做用」。
此處解釋了,7.2.2.3中的第一個問題,由於客戶端A沒有和relay Port保活,又因爲NAT的特性,數據直接經過relay port轉發給A時,NAT直接就丟棄了,因此A是收不到的。因此數據必須通過STUN服務器的STUN Port發送。form

Relay轉發的時候添加STUN頭(Send和Data請求)

 
 

如上圖所示是B主動給A發消息:「Hello」,A迴應「Hi」的過程。
序號一、二、三、四、5爲B的發送請求(藍色箭頭方向);
序號六、七、八、九、10爲A的迴應,原路返回(綠色箭頭方向)。
注意:在「Hello」發送的過程當中,一、2階段時,發送的數據爲裸的UDP數據。在四、5過程當中,是被STUN協議包裝過的「Hello」,稱之爲Data indication。
一樣在「Hi」發送的過程當中,六、7階段爲被STUN協議包裝過的「Hi」,稱之爲Send indication,九、10是裸的UDP數據。
在四、5階段,因爲數據是從STUN Port轉發下來的,爲了可以讓客戶端A知道這個包是哪一個客戶端發來的,因此,STUN 協議對「Hello」進行了從新的包裝,最主要的就是添加了一個XOR-PEER-ADDRESS屬性,由裸數據包裝成STUN協議的過程,咱們稱之爲添加了STUN頭。XOR-PEER-ADDRESS的內容就是客戶端B的反射地址(Server Reflexive Address)。
在六、7階段,A的響應原路返回,爲了可以讓A的relay port知道最終發往哪一個客戶端,所以也爲「Hi」添加了STUN頭,也是添加了XOR-PEER-ADDRESS屬性,內容就是客戶端B的反射地址(Server Reflexive Address)。這樣A的relay port就知道「Hi」的目的地址。
第3階段是:從A的relay端口收到數據,添加STUN頭後,最後從STUN Port 發出的過程。
第8階段是:從STUN Port 接收到帶STUN 頭的數據,去掉STUN頭,最後從A的relay端口發出的過程。class

客戶端B主動發送信息給A的交互流程如上圖所示,那麼客戶端A主動發送信息給客戶端B的交互流程是怎樣的呢,你能畫出來嗎?
要知道客戶端A主動發消息給客戶端B,應該將消息發往客戶端B的relay port哦。。原理

做者:古則 連接:https://www.jianshu.com/p/4a15556c6318 來源:簡書 簡書著做權歸做者全部,任何形式的轉載都請聯繫做者得到受權並註明出處。
相關文章
相關標籤/搜索