Posted on October 1st, 2006 at 23:46 by fr3@K
續自 NAT Traversal, part 1 - NAT Behavior.
Intro
STUN 是個非常簡單的 protocol. 就只一種功能性的 request - Binding Request1. 可以先簡單想像為 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.
External Port Mapping
Client 先用同一個 port 對 server 的兩個 ip (X:x1 and Y:y) 各發送一個 Binding Request, 如果兩個 response 顯示的 source ip:port 一樣 (N:n1 == N:n3), 則該 NAT 的 External Port Mapping 行為是 endpoint independent. 若不一樣, 就再對 server 在其中一個 ip 的第二個 port (X:x2) 發送一個 Binding Request, 如果這次的 response 回應的 source ip:port 與第一個 response 一樣 (N:n1 == N:n2), 該 NAT 的 External Port Mapping 行為是 address dependent. 否則為 address port dependent.
Filtering
等一段時間之後2, 接著 client 對 server 的一個 port (X:x1) 發送兩個 request, 其中第二個 request 要求 server 以不同 ip (Y:y) 回應. 如果 server 能收到第二個 request 的 response, 那表示該 NAT 的 Filtering 行為是 endpoint independent. 若收不到, 則再發一個 request, 要求 server 以同一個 ip 的另一個 port (X:x2) 回應, 如果這次收到了response, 這個 NAT 的 Filtering 就是 address dependent, 否則為 address port dependent.
External Port Mapping 與 Filtering 都是 endpoint independent 的 NAT 對 p2p 傳輸而言最為有利. 任何端點 (X:x1) 跟你通信之後, 可以直接把你 NAT 外部端點 (N:n1) 告知第三者, 第三者就能直接發送 (Y:y) 訊息給你. 只要 External Port Mapping 是 endpoint independent, 即使 Filtering 是 address port dependent, 也很容易克服, 跟你通訊的端點除了把你的外部端點告知第三者之外, 只要把第三者用來發送訊息的端點 (Y:y) 告訴你. 讓你能向那個端點發送個封包就能把 Filtering 的限制解除.
![]() |
|
| Previous Post « 加菲貓的名句 « |
Next Post » 火氣 » |







