====================
A <----------> HUB <----------> B
A 電腦
網路界面:eth0
220.228.161.117/255.255.255.128
subnet id ==>220.228.161.0
B 電腦
網路界面:eth0
220.228.161.124/255.255.255.192
subnet id ==>220.228.161.64
====================
當 A 要傳封包給 B 的時候,例如我們要從 A 電腦 PING B 電腦時,系統會把 B 電腦的 IP用 A 電腦本身的 netmask 進行 AND 運算,也就是 220.228.161.124
AND 255.255.255.128。此時可以發現計算出來的 subnet id 為 220.168.161.0,正好就是 A 電腦的 eth0 界面,kernel 就直接把封包往 eth0 丟出去。
丟出去的 IP Header 裡面並沒有 netmask 這種東西(ip packet 中並不帶有 netmask 訊息),所以 B 電腦看到的就是一個 destination address 為 220.228.161.124 的封包,B 電腦就會把它收起來。
然後當 B 電腦要回傳封包給 A 時,會把 A 電腦的 IP 拿來和 B 電腦本身的 netmask 做運算,也就是 220.228.161.117
AND 255.255.255.192,算出來的 subnet id 為 220.168.161.64,正好就是 B 電腦的 eth0 界面,所以封包就往 B 電腦的 eth0 界面送出去。
當 A 電腦收到封包時,會看到的就是一個 destination address 為 220.228.161.117 的封包,A 電腦就會把它收起來,然後 A 與 B 的通訊就完成了。
附上一張 IP Header 的圖供參考:
