Posted on July 3rd, 2007 at 23:26 by fr3@K
一直想找時間把最新的 draft-ietf-mmusic-ice-16 好好拜讀. 以彌補我從第 7 (還是 8?) 個 draft 就空到現在的空窗. 但總是提不起勁來實踐.
現在無論如何, 我已經決定要利用這個禮拜下班時間與接下來的週末自由的時間來把它 K 完.
一直想找時間把最新的 draft-ietf-mmusic-ice-16 好好拜讀. 以彌補我從第 7 (還是 8?) 個 draft 就空到現在的空窗. 但總是提不起勁來實踐.
現在無論如何, 我已經決定要利用這個禮拜下班時間與接下來的週末自由的時間來把它 K 完.
續自 NAT Traversal, part 2 - STUN.
像是 MSN messenger 等的傳統 IM (Instant Message) 網路, 其 server 只負責少許的任務, 絕大部分的工作都是一個 client 節點與別的 client 節點之間的事情. 即便如此, 在這種網路之中, 每一個 client 還是從頭到尾都是與 server 溝通, 從來不會直接對另一個 client 收發訊息. Server 除了一開始對 client 認證, 後續除了 relay (轉發) 訊息與 data (例如檔案傳輸) 之外, 幾乎就沒別的任務. 對 service provider 來說, 這種架構可說是非常浪費網路資源. 每一個經過 server relay 的封包, 都代表對 service provider 頻寬與計算能力的損耗.
續自 NAT Traversal, part 1 - NAT Behavior.
STUN 是個非常簡單的 protocol. 就只一種功能性的 request - Binding Request. 可以先簡單想像為 ping, 不同之處在於 server 的 response 會將 client 發出 request 的 source ip:port 放在裡面回應.
應該有不少人跟我一樣, 有好幾個在不同的地方 shell 帳號. 有自己的機器上的, 有公司的, 有花錢租的 virtual host, 有參加 FOSS 相關計畫用的. 這些帳號 (login name) 常不一樣.
當我在這些機器上 ssh 過來 ssh 過去的時候, 常得多敲好幾個鍵, 把 login name 餵給 ssh. 今天被這事情搞煩了, 認真把 ssh_config 的 man page 看了, 產出就是 ~/.ssh/config:
# Office
Host office-domain.name *.office-domain.name 192.168.* some-office-machine-name
User login-name-at-office
# Some project
Host shell.foss-project.org
User another-login-name
NAT (不包含防火牆) 處理 UDP 封包的行為中, 對 p2p 影響最大的兩類為:
External Port Mapping 指的是當使用內部同一個端口 (L:l) 對外部發封包的時候, NAT 對外面是否使用同一個端口 (N:?):
Filtering 指的是在不考慮封包掉了的情況下, 當一個位於內部的端口 (L:l) 對外部的一個端口 (X:x1) 發了封包, 外部不同端口 (X:x1, X:x2 and Y:y) 對 NAT 上 map 出來的端口 (N:n) 發封包時的過濾行為:
在所有 NAT 上, 這兩類行為都同時存在. 但組合起來時, 不是如直覺般產生九種組合 (3 X 3 的矩陣). 細想一下就會知道只能有六種組合:
根據 wikipedia 的定義, 一個 peer-to-peer (p2p) computer network 是一個主要依賴該網路上參與者 (相對於依賴服務器) 的運算能力與帶寬的網路.
P2p 網路的達成主要有兩個困難點:
達成第一點的方法, 也就是使用的 signalling protocol 有很多, 現階段的規範也比較成熟完善. 例如 SIP 與 IMS. 相對來說, p2p 的資料傳輸是更走在技術的前沿.
無論原因為何, 大多數的裝置 (通常是電腦) 不是直接連上 Internet, 而是透過 NAT 或 NAPT (以下均稱為 NAT) 連上 Internet. 在這種情況下, NAT 的穿透 (NAT traversal) 成為了 p2p 資料傳輸的前提.
這些在 NAT 後面的裝置沒有公網 IP, 如不利用服務器轉送, 傳統上幾乎沒有廣泛通用的方法 從一台這樣的裝置把資料傳輸資料到另一個這樣的裝置.
技術是一直在往前走的, 現在, IETF 的 behave , midcom 與 mmusic 等 working group 已提出在多數狀況下達到 p2p 資料傳輸的方法 (protocol). 在開始進入這些方法之前, 對 NAT 的相關行為必須要有透徹的了解.
這一系列的 NAT Traversal 將從了解 NAT 的行為開始, 到 STUN 與 TURN, 計畫會在 ICE 以及 ICE 在 SIP 的應用劃下句點.
SSH port forwarding 也稱為 SSH tunneling. 這個功能可把連到一個 ssh session 其中一端某個 port 的 TCP connection, 透過加密的 channel,forward 到 session 的另外一端的指定端口. 將開啟 port forwarding 的 ssh session 結束掉, port forwarding 也跟著結束.
firedrake$ ssh fsfoundry.org -L 8080:localhost:3128
相反地, 下面的 command 會建立一個從 firedrake 連到 fsfoundry.org 的 ssh session. 並且在 fsfoundry.org 的 localhost 的 port 3128 等待 incoming connection. 當有 connection 連進來, 該 connection 就會被 forward 到 firedrake 的 localhost port 8080:
firedrake$ ssh fsfoundry.org -R 8080:localhost:3128
建立一個連到 fsfoundry.org 的 ssh session. 這個 session 會把在其 session 內開的 X11 application forward 回到 firedrake 的 X Server.
firedrake$ ssh -X fsfoundry.org
比較舊版的 OpenSSH 用的是 -Y 而不是 -X.
Except where otherwise noted, this site is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License.