turn協議部分摘錄----draft-ietf-behave-turn-14

1、簡介

  本文定義了一個名爲TURN的協議,它允許兩個處於NAT環境的主機利用中繼進行通訊。client能夠在TURN Server上分配資源,與peer(對端)進行通訊,也能夠決定何時應該停止通訊。client需要關聯一個TURN Server的地址作爲中繼,稱爲relayed server address。當client發送報文給TURN Server,TURN Server使用relayed server address作爲源地址向其他peer進行中繼轉發報文。
在這裏插入圖片描述
  使用的TURN的client必須使用一些方法來獲取對端peer的relayed-transport-address地址及每個peer的本機IP及端口。該方法並不在這裏討論。
  雖然TURN稀有一適用於兩個主機都位於NAT之後的情況,但是TURN協議的TURN Server的要求很高,server必須要有很大帶寬。所以使用TURN協議的最佳情景是-----當兩個主機沒有直接通信路徑時。當TURN與ICE一起使用時,ICE會優先去查找有無直接通信路徑,如果實在找不到纔會啓用TURN協議
  TURN支持每個relayed-transport-address同時與多個peer(對端)通信。

2、功能一覽

  一般情況TURN 客戶端在內網中,TURN Server在公網。TURN客戶端使用TURN Server作爲中繼來和位於其它網絡的對端通信。
在這裏插入圖片描述
上圖的幾個地址概念:
  Server-Reflexive Address: 客戶端向turn server發送消息,該消息經過NAT再發送出去,所以turn server接收到消息 後實際獲得的IP地址,即是NAT的地址(一般是公網地址)。這個地址就叫做客戶端的Server-Relexive地址。turn serve向客戶端發送消息時,目的地址就是server-reflexive地址,當該消息達到NAT後,NAT會再將該地址轉發給客戶端。

  Relayed_Transport_Address: 客戶端使用TURN協議來創建和管理ALLOCATION。allocation是turn server端的數據結構,而Relayed_Transport_Address是該數據結構中重要的組成部分。該地址是turn server本身地址,用於客戶端和對端進行消息交互。稱爲中轉地址,客戶端和對端通信消息都要拿這個地址(turn server)做中轉。

  當peers(對端)位於NAT之後,客戶端必須使用peer的Server-Reflexive IP來做標記而不是使用peer的本地IP。拿上圖例子來說。客戶端給peer A發送應用數據時,客戶端必須使用192.0.2.150:32102而不是192.168.100.2:49582 。

4、傳輸

   TURN在TURN server與peers之間總是使用UDP進行數據傳輸,但是客戶端和turn server之間可以使用UDP,TCP和TLS over tcp 三種方式.

在這裏插入圖片描述

5、Allocation

  客戶端使用Allocation事務來在turn server創建一個allocation結構。客戶端發送一個Allocate request到服務器,然後服務器通過Allocate success響應回覆客戶端,在該響應中帶有客戶度的中繼IP地址(relayed transport address)。
  客戶端可以在Allocate request中攜帶一些屬性如lifetime。
  如果需要安全認證則因爲server中轉數據包需要佔用很大帶寬,故server一般會要求客戶端使用long-term認證
在這裏插入圖片描述

  一旦中繼地址分配成功,客戶端必須定期發送Refresh request來保活該地址。這個定期時間由lifetime屬性規定(單位爲秒),默認是600s,可修改。

流程:
在這裏插入圖片描述
抓包:
在這裏插入圖片描述

6、Permissions

   TURN提供了一種繞過企業防火牆的機制,該機制就稱爲permissions。
一個Allocation可以有0或多個permission,每個permission由一個IP地址和lifetime組成。當turn server接收到一個來自於中繼地址(relayed transport address)的UDP數據報文時,它首先會檢查permission列表,如果該UDP報文的源地址IP和某個permission匹配,這個UDP報文就會被轉發給客戶端,否則丟棄該UDP報文。
一個permission如果不refresh,則會在5分鐘後過期。
在這裏插入圖片描述

  客戶端可以使用CreatePermission 請求或ChannelBind 請求來安裝或刷新一個permission。
  一個CreatePermission請求可以用來安裝或刷新多個permission,這個屬性對於ICE來說非常重要。出於安全考慮,permission只能有經過安全認證的事務(transaction)來安裝及刷新。

  Send indications及ChannelData Message並不能安裝或刷新permission。
  permission保存在一個allocation結構中,因此在一個allocation中添加一個新的permission或一個permission過期並不會影響其他的allocation。
在這裏插入圖片描述

7、發送機制

  在客戶端和對端使用turn server進行應用數據交互時有兩種發送機制可用。
第一種是send and Data方式,第二種是使用channel。這兩種方式都能僅用一箇中繼地址(relayed transport address)使客戶端和多個對端進行通信。
在這裏插入圖片描述

第一種方式:

  Send indications被用於客戶端向server發送應用數據,而Data indication被用於服務器向客戶端發送數據
在這裏插入圖片描述

流程:
在這裏插入圖片描述
在上圖中發送的 CreatePermission請求中需要添加XOR-PEER-ADDRESS屬性, 該屬性的值爲對端A的反射地址(server reflexive address),如果沒有該地址則server不會給客戶端及對端A轉發數據。
在這裏插入圖片描述
數據交互:
在這裏插入圖片描述

第二種方式;

   在一些使用場景如Voip(視頻電話),爲了節約帶寬可以使用ChannelData message。該方法不使用STUN頭而是使用特有的4字節的頭部來包含channel number(通道號)等信息。每個在使用的通道號都已經和一個特定的對端綁定了,因此turn server就作爲對端的本地地址(host transport address)的速記。
在這裏插入圖片描述

   爲了將通道和對端綁定,客戶端需要向server發送ChannelBind 請求,請求中需要包括未綁定的通道號及對端的地址。
一旦一個通道被綁定了,客戶端就可以向server發送一個ChannelData 消息,server進而將該消息發送給對端。類似的server會將來自對端的消息通過ChannelData消息發送給客戶端。
在這裏插入圖片描述
通道綁定的默認有效期是10分鐘,到期之前可以通過另外一個ChannelBind 請求來重新綁定。
在這裏插入圖片描述

抓包:
在這裏插入圖片描述
在這裏插入圖片描述

8、RTP 支持

  TURN包含一些特定的的對RTP的支持。
舊版本的RTP協議(RFC3550)要求一個奇數的rtp端口和一個rtcp端口(rtp端口號+1)。爲了客戶端和對端能用就版本的RTP協議交互,TURN支持客戶端向server請求一個帶有一個奇數端口及一個(奇數端口+1)的端口的中繼地址(relayed transport address),並且可以要求server在接下來的allocation請求中不使用此次(奇數端口+1)的端口(也可以不要求)。
在這裏插入圖片描述
具體怎麼請求文檔沒說。

9、英文原網站

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