所有的STUN消息都包含20個字節的消息頭,包括16位的消息類型,16位的消息長度和128位的事務ID。
消息類型 16位
消息長度 16位
事務ID 128位
消息類型許可的值如下:
0x0001:捆綁請求
0x0101:捆綁響應
0x0111:捆綁錯誤響應
0x0002:共享私密請求
0x0102:共享私密響應
0x0112:共享私密錯誤響應
消息長度,是消息大小的字節數,但不包括20字節的頭部。
事務ID,128位的標識符,用于隨機請求和響應,請求與其相應的所有響應具有相同的標識符。
消息頭之后是0或多個屬性,每個屬性進行TLV編碼,包括16位的屬性類型、16位的屬性長度和變長屬性值。
屬性類型 16位
屬性長度 16位
屬性值
……
屬性類型定義如下:
MAPPED-ADDRESS
MAPPED-ADDRESS屬性表示映射過的IP地址和端口。它包括8位的地址族,16位的端口號及長度固定的IP地址。
RESPONSE-ADDRESS
RESPONSE-ADDRESS屬性表示響應的目的地址
CHASNGE-REQUEST
客戶使用32位的CHANGE-REQUEST屬性來請求服務器使用不同的地址或端口號來發送響應。
SOURCE-ADDRESS
SOURCE-ADDRESS屬性出現在捆綁響應中,它表示服務器發送響應的源IP地址和端口。
CHANGED-ADDRESS
如果捆綁請求的CHANGE-REQUEST屬性中的“改變IP”和“改變端口”標志設置了,則CHANGED-ADDRESS屬性表示響應發出的IP地址和端口號。
USERNAME
USERNAME屬性用于消息的完整性檢查,用于消息完整性檢查中標識共享私密。USERNAME通常出現在共享私密響應中,與PASSWORD一起。當使用消息完整性檢查時,可有選擇地出現在捆綁請求中。
PASSWORD
PASSWORD屬性用在共享私密響應中,與USERNAME一起。PASSWORD的值是變長的,用作共享私密,它的長度必須是4字節的倍數,以保證屬性與邊界對齊。
MESSAGE-INTEGRITY
MESSAGE-INTEGRITY屬性包含STUN消息的HMAC-SHA1,它可以出現在捆綁請求或捆綁響應中;MESSAGE-INTEGRITY屬性必須是任何STUN消息的最后一個屬性。它的內容決定了HMAC輸入的Key值。
ERROR-CODE
ERROR-CODE屬性出現在捆綁錯誤響應或共享私密錯誤響應中。它的響應號數值范圍從100到699。
下面的響應號,與它們缺省的原因語句一起,目前定義如下:
400(錯誤請求):請求變形了。客戶在修改先前的嘗試前不應該重試該請求。
401(未授權):捆綁請求沒有包含MESSAGE-INTERITY屬性。
420(未知屬性):服務器不認識請求中的強制屬性。
430(過期資格):捆綁請求沒有包含MESSAGE-INTEGRITY屬性,但它使用過期
的共享私密。客戶應該獲得新的共享私密并再次重試。
431(完整性檢查失敗):捆綁請求包含MESSAGE-INTEGRITY屬性,但HMAC驗
證失敗。這可能是潛在攻擊的表現,或者客戶端實現錯誤
432(丟失用戶名):捆綁請求包含MESSAGE-INTEGRITY屬性,但沒有
USERNAME屬性。完整性檢查中兩項都必須存在。
433(使用TLS):共享私密請求已經通過TLS(Transport Layer Security,即安全
傳輸層協議)發送,但沒有在TLS上收到。
500(服務器錯誤):服務器遇到臨時錯誤,客戶應該再次嘗試。
600(全局失敗):服務器拒絕完成請求,客戶不應該重試。
UNKNOWN-ATTRIBUTES
UNKNOWN-ATTRIBUTES屬性只存在于其ERROR-CODE屬性中的響應號為420的捆綁錯誤響應或共享私密錯誤響應中。
REFLECTED-FROM
REFLECTED-FROM屬性只存在于其對應的捆綁請求包含RESPONSE-ADDRESS屬性的捆綁響應中。屬性包含請求發出的源IP地址,它的目的是提供跟蹤能力,這樣STUN就不能被用作DOS攻擊的反射器。
屬性空間分為可選部分與強制部分,值超過0x7fff的屬性是可選的,即客戶或服務器即使不認識該屬性也能夠處理該消息;值小于或等于0x7fff的屬性是強制理解的,即除非理解該屬性,否則客戶或服務器就不能處理該消息。