STUN(Session Traversal Utilities for NAT/NAT環境下的會話傳輸工具),是一種處理NAT傳輸的協議,主要做爲工具來服務其餘協議。它容許位於NAT(或者多重NAT後的客戶端找出本身的公網地址,查出本身位於哪一種類型的NAT以後以及NAT爲某一個本地端口所綁定的Internet端端口。這些信息被用來在兩個同時處於NAT路由器以後的主機之間創建UDP通訊。目的就是找到外界鏈接內部地址所需的信息。服務器
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)則不能使用。cookie
STUN報文和大多數網絡類型的格式同樣,是以大端編碼(big-endian)的,即最高有效位在左邊。全部的STUN報文都是以20字節的頭部開始,後面跟着若干個屬性。下面來詳細說說。
STUN頭部包含了STUN消息類型,magic cookie,事務ID和消息長度,以下:網絡
最高的兩位必須爲0,當STUN和其餘協議複用的時候,用來區分STUN包和其餘數據包。
STUN Message Type(16位,包括前面置零的2位) 定義了STUN的消息類型:
0x0001:捆綁請求
0x0101:捆綁響應
0x0111:捆綁錯誤響應
0x0002:共享私密請求
0x0102:共享私密響應
0x0112:共享私密錯誤響應
Message Type(後14位)又能夠進一步分解爲如下結構:架構
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標識符,用於隨機請求和響應,請求其相應的全部響應具備相同的標識符。工具
MAPPED-ADDRSS同時也是class STUN的一個屬性,之因此還存在也是爲了前向兼容。其包含了NAT客戶端的反射地址。
Family位IP類型,即IPV4(0x01)或IPV6(0x02)
port位端口
address爲32位或128位的IP地址。編碼
XOR-MAPPED-ADDRESS和MAPPED-ADDRESS基本相同,不一樣點是反射地址部分通過一次異或(XOR)處理。
X-port字段:是將NAT的映射端口以小端形式與magic cookie的高16位進行異或,再將結果轉換成大段形式而獲得的,X-Address也是相似。之因此要通過這麼一次轉換,是由於在實踐中發現不少NAT會修改payload中自身公網IP的32位數據,從而致使NAT打洞失敗。spa
ERROR-CODE屬性用於error response報文中。其中包含了300-699表示的錯誤碼,以及一個UTF-8格式的文字出錯信息(Reason phrase)。debug