WEBRTC穿透技術探討之STUN協議詳解

1. STUN協議概述

  STUN(Session Traversal Utilities for NAT/NAT環境下的會話傳輸工具),是一種處理NAT傳輸的協議,主要作爲工具來服務其他協議。它允許位於NAT(或者多重NAT後的客戶端找出自己的公網地址,查出自己位於哪種類型的NAT之後以及NAT爲某一個本地端口所綁定的Internet端端口。這些信息被用來在兩個同時處於NAT路由器之後的主機之間建立UDP通信。目的就是找到外界連接內部地址所需的信息。

2. STUN協議的架構

  STUN協議是一個C/S架構的協議,支持兩種傳輸類型:
1.請求/響應(request/response)類型,由客戶端給服務器發送請求,並等待服務端返回響應,用於確定一個NAT給客戶端分配的具體綁定。客戶端通過事務ID將請求響應連接起來。
2.指示類型(indication transaction),由服務器或者客戶端發送指示,另一方不產生響應,用於保持綁定的激活狀態。事務ID通常作爲debugging aid使用。
  所有的STUN報文信息都包含有一個固定頭部,包含了方法,類和事務ID。方法表示是具體哪一種傳輸類型。STUN中只定義了一種方法,即binging(綁定),其他方法可以由使用者自行擴展;Binding方法可以用於請求/響應類型和指示類型。
  STUN基於客戶機-服務器協議。如一個VoIP電話或者軟件可能會包含一個STUN客戶端。這個客戶端向STUN服務器發送請求,之後,服務器就會向STUN客戶端報告NAT路由器的公網IP地址以及NAT爲允許傳入流量傳回內網而開通的端口。同時還使得STUN客戶端能夠確定正在使用的NAT類型——因爲不同的NAT類型處理傳入的UDP分組的方式不同。四種主要網絡類型中有三種是可以使用的:完全圓錐型NAT、受限圓錐型NAT和端口受限圓錐型NAT。但大型公司網絡中經常採用的對稱型NAT(又稱爲雙向NAT)則不能使用。

3. STUN報文格式

3.1 STUN報頭格式

  STUN報文和大多數網絡類型的格式一樣,是以大端編碼(big-endian)的,即最高有效位在左邊。所有的STUN報文都是以20字節的頭部開始,後面跟着若干個屬性。下面來詳細說說。
  STUN頭部包含了STUN消息類型,magic cookie,事務ID和消息長度,如下:

clipboard.png
  最高的兩位必須爲0,當STUN和其他協議複用的時候,用來區分STUN包和其他數據包。
  STUN Message Type(16位,包括前面置零的2位) 定義了STUN的消息類型:
0x0001:捆綁請求
0x0101:捆綁響應
0x0111:捆綁錯誤響應
0x0002:共享私密請求
0x0102:共享私密響應
0x0112:共享私密錯誤響應
  Message Type(後14位)又可以進一步分解爲以下結構:

clipboard.png

  1.其中M11到M0表示方法的12位編碼。STUN目前只定義了一個方法,即bindingO(綁定),其他的方法可以由使用者自行拓展;Binding方法可以用於請求/響應類型和指示類型。
  2.C1-C0表示類編碼,分別標識報文的reqest(0b00),indicatioon(0b01),success response(0b10),error response(0b11),每一個不同的方法都有可能對應不同的類別。
  Message Length 16位消息大小的字節數,但不包括20字節的頭部。所有的STUN屬性都是四字節對齊的
  Magic Cookie:32位字段包含固定值0x2112A442
  Stransaction ID,96位的事務ID標識符,用於隨機請求和響應,請求其相應的所有響應具有相同的標識符。

3.2 STUN報文常見屬性

3.2.1 MAPPED-ADDRESS/映射地址

  MAPPED-ADDRSS同時也是class STUN的一個屬性,之所以還存在也是爲了前向兼容。其包含了NAT客戶端的反射地址。
  Family位IP類型,即IPV4(0x01)或IPV6(0x02)
  port位端口
  address爲32位或128位的IP地址。

clipboard.png

3.2.2 XOR-MAPPED-ADDRESS/異或映射地址

  XOR-MAPPED-ADDRESS和MAPPED-ADDRESS基本相同,不同點是反射地址部分經過一次異或(XOR)處理。
  X-port字段:是將NAT的映射端口以小端形式與magic cookie的高16位進行異或,再將結果轉換成大段形式而得到的,X-Address也是類似。之所以要經過這麼一次轉換,是因爲在實踐中發現很多NAT會修改payload中自身公網IP的32位數據,從而導致NAT打洞失敗。

clipboard.png

3.2.3 ERROR-CODE/錯誤碼

  ERROR-CODE屬性用於error response報文中。其中包含了300-699表示的錯誤碼,以及一個UTF-8格式的文字出錯信息(Reason phrase)。

clipboard.png

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