Day 02 終於把一件以前很常背、但其實沒有真的懂的事情弄清楚:
IP + Subnet Mask
↓
算出 Network Address
↓
判斷對方是不是同網段
例如:
PC A:192.168.1.10/24
PC B:192.168.1.20/24
兩台算出來都是:
192.168.1.0/24
所以 PC A 知道:
PC B 跟我是自己人,不需要先把資料丟給 Router。
到這裡本來覺得很順。
結果下一秒就冒出一個問題:
都知道 PC B 的 IP 是
192.168.1.20了,為什麼不能直接送?
然後我就撞到今天這個主題:
MAC Address
以前看到 MAC Address,我大概只會回答:
網卡有一組 MAC 位址。
然後就沒了 XD
但如果真的從「封包怎麼走」開始追,就會發現 MAC 根本躲不掉。
我現在先用一個不是百分之百精準,但比較好理解的方式記。
IP Address
= 我要去哪裡
MAC Address
= 在目前這一段網路,這一跳實際要交給誰
例如我要從高雄寄東西去台北。
「台北某個地址」比較像 IP。
但貨物真的進到某個配送站時,配送站還是要知道:
這一站到底要交給哪一台車、哪一個出口?
MAC 比較接近這種「目前這一段怎麼送」的概念。
所以 IP 跟 MAC 並不是二選一。
不是:
有 IP
所以不需要 MAC
而是:
IP 負責 Layer 3 的目的地
MAC 負責這一段 Ethernet 的傳送
這裡也是我以前很容易全部叫做「封包」。
但其實不同 Layer 有不同名稱。
今天先看最簡單的版本:
Ethernet Frame
┌─────────────────────────────┐
│ Destination MAC │
│ Source MAC │
│ │
│ Payload │
│ └─ 裡面可以放 IP Packet │
│ │
│ FCS │
└─────────────────────────────┘
所以可以先得到一個很重要的畫面:
Ethernet Frame
└── IP Packet
有點像:
箱子
└── 裡面又裝了一個東西
IP Packet 沒有消失。
只是當它要在 Ethernet 網路上跑的時候,外面還會再包一層 Ethernet Frame。
這時 Ethernet 就需要:
Source MAC
Destination MAC
問題又來了。
假設 PC A 要找:
192.168.1.20
它已經知道這台機器跟自己同網段。
但是 PC A 現在只知道:
192.168.1.20
不知道:
192.168.1.20 的 MAC 是多少?
這時候就輪到:
ARP
出場。
ARP,全名是:
Address Resolution Protocol
名字看起來有點硬。
但我現在會先把它記成:
我知道你的 IPv4 Address,但我不知道你的 MAC,所以我要問一下。
PC A 會送出類似這樣的問題:
誰是 192.168.1.20?
如果你是 192.168.1.20,
請告訴我你的 MAC Address。
問題是:
PC A 就是因為不知道 PC B 的 MAC 才來問。
那它怎麼指定:
Destination MAC = PC B
?
不能。
所以這時候會用到:
Broadcast
也就是:
FF:FF:FF:FF:FF:FF
可以先把它理解成:
同一個 Broadcast Domain 裡,大家先聽一下。
於是:
PC A:
誰是 192.168.1.20?
大家都可能收到。
但是只有真正拿著:
192.168.1.20
的 PC B 會回答:
是我。
我的 MAC 是:
BB:BB:BB:BB:BB:BB
如果每送一次資料都要重新問:
誰是 192.168.1.20?
那也太累了。
所以 PC A 會先把結果記起來。
例如:
192.168.1.20
↓
BB:BB:BB:BB:BB:BB
這就是 ARP Cache 在做的其中一件事情。
所以我現在先記:
ARP Cache
IP
↓
MAC
它解決的是:
我知道 IP,但這一跳我要用哪一個 MAC?
好。
現在 PC A 已經知道 PC B 的 MAC。
假設:
PC A
MAC:AA:AA:AA:AA:AA:AA
PC B
MAC:BB:BB:BB:BB:BB:BB
而網路長這樣:
PC A
│
Port 1
│
Switch
│
Port 2
│
PC B
PC A 送出的 Ethernet Frame 裡會寫:
Source MAC
= AA:AA:AA:AA:AA:AA
Destination MAC
= BB:BB:BB:BB:BB:BB
Switch 收到之後,重點來了:
Switch 主要不是看 Destination IP 決定往哪送。
Layer 2 Switch 主要看的是:
Destination MAC
然後查自己的:
MAC Address Table
例如:
AA:AA:AA:AA:AA:AA → Port 1
BB:BB:BB:BB:BB:BB → Port 2
看到:
Destination MAC
= BB:BB:BB:BB:BB:BB
就知道:
往 Port 2
送。
這樣資料才真的到 PC B。
這又是一個以前很容易直接背答案的地方。
Switch 不是出廠時就知道:
PC A 在 Port 1
PC B 在 Port 2
它是慢慢學的。
例如 PC A 的 Frame 從 Port 1 進來。
Frame 裡面寫著:
Source MAC
= AA:AA:AA:AA:AA:AA
Switch 就會想:
喔,原來 AA:AA:AA:AA:AA:AA 是從 Port 1 來的。
於是學到:
AA:AA:AA:AA:AA:AA → Port 1
所以我現在會這樣記:
Source MAC
↓
Switch 學習這台設備在哪個 Port
而:
Destination MAC
↓
Switch 決定 Frame 要從哪個 Port 出去
突然就合理很多。
例如 Switch 目前只知道:
AA:AA:AA:AA:AA:AA → Port 1
但是還沒有:
BB:BB:BB:BB:BB:BB → ???
那怎麼辦?
它會做:
Flooding
也就是先把 Frame 往其他相關 Port 送出去。
等 PC B 回傳資料時,Switch 看到:
Source MAC = BB:BB:BB:BB:BB:BB
而這個 Frame 是從 Port 2 進來的。
它就學到了:
BB:BB:BB:BB:BB:BB → Port 2
後面再看到送給 BB 的 Frame,就可以直接往 Port 2 送。
不需要每次都 Flood。
這兩個我以前非常容易混。
因為裡面都有 MAC。
但它們根本是在回答不同問題。
IP → MAC
例如:
192.168.1.20
↓
BB:BB:BB:BB:BB:BB
它回答:
我知道 IP,那這一跳要用哪個 MAC?
MAC → Port
例如:
BB:BB:BB:BB:BB:BB
↓
Port 2
它回答:
我知道 MAC,那這個 MAC 在 Switch 哪個 Port?
所以把兩個串起來:
192.168.1.20
│
│ ARP
▼
BB:BB:BB:BB:BB:BB
│
│ Switch MAC Table
▼
Port 2
這張圖我覺得比背十個名詞有用。
假設:
PC A
192.168.1.10/24
PC B
192.168.1.20/24
PC A 要送資料給 PC B。
完整流程目前可以先理解成:
1.
PC A 看 Destination IP
192.168.1.20
↓
2.
用 Subnet Mask 判斷
192.168.1.10/24
192.168.1.20/24
↓
同網段
↓
3.
不用先交給 Default Gateway
↓
4.
ARP 查:
192.168.1.20 的 MAC 是什麼?
↓
5.
得到:
BB:BB:BB:BB:BB:BB
↓
6.
建立 Ethernet Frame
Destination MAC
= BB:BB:BB:BB:BB:BB
↓
7.
Switch 查 MAC Address Table
BB:BB:BB:BB:BB:BB
→ Port 2
↓
8.
Frame 送到 PC B
到這裡終於開始有「資料真的在網路上移動」的感覺。
現在把 PC B 換成:
10.0.0.20
PC A 是:
192.168.1.10/24
Day 02 已經知道它會判斷:
不同網段
所以它不會直接在自己的 LAN 裡找:
10.0.0.20 的 MAC
但 Ethernet Frame 還是一定需要 Destination MAC。
那這次 Destination MAC 要填誰?
答案是:
Default Gateway 的 MAC
這裡又出現一個很好玩的問題:
IP Packet 的 Destination IP 明明是
10.0.0.20,為什麼 Ethernet Frame 的 Destination MAC 卻可以是 Router?
這題我決定留給 Day 04。
今天如果全部忘光,我希望至少還記得:
IP
= 我要去哪裡
MAC
= 這一跳 Ethernet 要交給誰
再來:
ARP Cache
= IP → MAC
以及:
Switch MAC Address Table
= MAC → Port
最後把流程縮成:
IP
↓
ARP
↓
MAC
↓
Switch
↓
Port
Day 01 我們在看:
Internet
LAN
Switch
Router
Day 02 開始知道:
到底是不是同網段?
Day 03 才真正開始看到:
好,就算是同網段,資料也不是憑空飛到對方電腦。
它還得先知道 MAC,再經過 Switch,把 Ethernet Frame 真的送到正確的 Port。