2007年10月23日 星期二

STUN Protocol

STUN 是個非常簡單的 protocol. 就只一種功能性的 request - Binding Request. 可以先簡單想像為 ping, 不同之處在於 server 的 response 會將 client 發出 request 的 source ip:port 放在裡面回應.

當 client 收到 response, 從中得到 server 稍早 `看到’ request 的 source ip:port 可大略分為兩種狀況:

  • 與 client 發出 request 封包的 ip:port 一樣, client 可藉由這種狀況發現自己擁有公網 ip.
  • 與 client 發出 request 封包的 ip:port 不同, client 可藉由 response 知道發出 request 的私網 ip:port 被 NAT 被 map 成外部的那個端點. 這也正是這個 request 叫做 Binding Request 的原因.

絕大多數的 protocol, server 都會用收到 request 的 ip:port 來發出 response 以回應 client. STUN 特有一個很有趣的 attribute, 叫做 CHANGE-REQUEST. 用來要求 server 回應 client 的時候, 換一個 port (ip 不變) 或是換一個 ip 發送 response.

藉由把 STUN daemon 跑在一個 ip 的兩個 port 以及第二個 ip 上, client 就可以藉此了解它所處內網對外的 NAT 對 p2p 傳輸最具影響力的兩種行為; External Port Mapping 以及 Filtering.

沒有留言: