﻿# 關於查詢 MAC 位址與 ARP 位址解析協定的兩三事

今天得知公司同事在上周向客戶申請開通的 MAC 位址是錯誤的，同事誤把「公司電腦」的 MAC 位址傳給客戶申請，但是入廠的時候卻是帶自己的筆電過去使用，實在是瞎爆了。接著我好奇問了全公司所有工程師知不知道什麼叫 MAC 位址，想不到也有 1/10 的人不知道這是什麼，這著實讓我非常驚訝。這篇文章我試圖用比較淺顯的文句，帶大家瞭解 MAC address 是個什麼玩意。

![image](https://stwillblogassets.blob.core.windows.net/files/images/external/user-images.githubusercontent.com/cdfb045975912c601780-179541935-7463889f-0e2f-48fe-81d3-d712e9b26dbe.png)

### 認識 IP 地址

我們在同一個「區域網路」內若要讓電腦與電腦之間的網路相連，就勢必要知道對方的「位址」在哪裡，那什麼是**位址**(Address)？我想大家不管是怎樣的小白，身為一個開發人員，就算你是純前端人員，最最最基本的，總該要知道什麼是 IP 地址吧！

我簡單分類一下，IP 大致分兩種：

1.  動態 IP 地址
    
    透過區域網路中的 DHCP 伺服器，自動取得一個可用的 IP 地址。
    
    ![image](https://stwillblogassets.blob.core.windows.net/files/images/external/user-images.githubusercontent.com/ce7f9020bbdb5c5ae302-179516678-93127458-d2a1-431e-afaf-c8e9bf12802d.png)
    
2.  靜態 IP 地址
    
    自己在電腦網卡設定中，手動設定一組 IP 地址與其他網路資訊，如子網路遮罩(Subnet mask)、預設網路匝道(Gateway)、域名伺服器(DNS)等等。
    
    ![image](https://stwillblogassets.blob.core.windows.net/files/images/external/user-images.githubusercontent.com/aca69a43925aed229556-179516603-1e444047-76ed-40c0-bd6b-220ec36cdedc.png)
    

好的，你應該知道，在同一個「區域網路」內，IP 是不允許重複的，重複的 IP 地址，會導致許多問題，最嚴重會導致電腦無法上網。基本上，現在許多 AP 或網路分享器都有內建 DHCP 伺服器，所以要取得重複的 IP 地址已經不太容易發生，除非你執意要自行管理區域網路的 IP 地址。

因為每個人的電腦中，都可能有一個到多個「網路介面」(Network Interface)。所謂「網路介面」其實就是「網路卡」的意思，如果你的筆電可以上網的方式同時包括「實體網路線」、「Wi-Fi 無線網路」與「4G 網路」上網，那麼你的電腦就至少有 3 個「網路介面」。像我的桌上型電腦，就有兩張實體的網路卡，因此光是可插實體線的網路介面就有兩張。

> 注意: **虛擬網卡**也是一種**網路介面**，一樣也有 MAC address 喔！

每個「網路介面」可以指派一個到多個 IP 地址，如果你身為一個網管人員，負責管理一群多達上百人的廠商測試區(廠測區)，而廠測區裡面什麼形形色色的人都有，只要有人隨便亂設定個 IP 地址，就會有人上不了網，你該怎麼管理？所以其實 IP 是很難管制的。

### 認識 MAC 位址

所謂 MAC 是 [Media Access Control](https://en.wikipedia.org/wiki/MAC_address) ([媒體存取控制位址](https://zh.wikipedia.org/wiki/MAC%E5%9C%B0%E5%9D%80)) 的縮寫，通常每一個「網路介面」都會有一組 MAC 位址 (MAC address)，而且「理論上」這個 MAC address 必須是全球唯一的編號，絕對不能重複。

> **MAC address** (媒體存取控制位址) 有時候也會稱為 **LAN Address** (區域網路位址)、**Ethernet Address** (乙太網路位址)、**burned-in address** (燒寫位址) 或 **Hardware address** (硬體位址)、**Physical Address** (實體位址) 等名詞，這些全部都是「同義字」喔！

實際上，每一張實體的網路卡在出廠的時候，就會內建一組「理論上」無法修改的 MAC 位址，而且 IEEE 有嚴格規定 MAC 的編碼原則，每一家網路卡製作廠商都要事先申請一組 MAC 位址的**前綴**(Prefix)，確保不同家的網卡廠商不會產生相同的 MAC 位址。

> 網路的運作原理相當複雜，我不打算講的太過深入，像是 [OSI model](https://en.wikipedia.org/wiki/OSI_model) 總共分了 7 個層次，IP 屬於 Network Layer (網路層)，而 MAC 屬於 [Data link layer](https://en.wikipedia.org/wiki/Data_link_layer) ([資料連接層](https://zh.wikipedia.org/zh-tw/%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82)) 的東西，這些網路細節知識，有興趣的朋友可以自己花點時間研究看看。

我們每台電腦為了要上網，需要有個 IP 地址，但是電腦與電腦之間的連接，通常會需要一個 Switch (交換器) 用來交換彼此的網路封包。你為了要讓一個網路封包可以順利傳送到另一台電腦，你必須確保封包可以順利抵達 Switch 之後，可以讓 Switch 幫你轉送到對方的電腦中。網路的底層運作(資料連接層)，其實是透過 MAC 位址找到對方的，因為 MAC 位址是真正「唯一」的位址資訊！

### 認識 ARP 協議

所謂 ARP 是 [Address Resolution Protocol](https://en.wikipedia.org/wiki/Address_Resolution_Protocol) ([位址解析協定](https://zh.wikipedia.org/zh-tw/%E5%9C%B0%E5%9D%80%E8%A7%A3%E6%9E%90%E5%8D%8F%E8%AE%AE)) 的縮寫，這是一個專門用在 [Data link layer](https://en.wikipedia.org/wiki/Data_link_layer) ([資料連接層](https://zh.wikipedia.org/zh-tw/%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82)) 的通訊協定，主要用途就是拿來找到「區域網路」中的另一台電腦用的。

每一台電腦都必須維護著一份 ARP Cache 資料，紀錄著你曾經連接過的 IP-to-MAC 或 IP-to-Physical 的對應表，你只要透過 `arp -a` 命令，就可以顯示出所有你曾經連接過的 ARP 紀錄，如下圖示：

```bash
# arp -a

Interface: 172.30.108.80 --- 0xcd
  Internet Address      Physical Address      Type
  172.30.96.1           00-15-5d-e5-48-9e     dynamic
  172.30.111.255        ff-ff-ff-ff-ff-ff     static
  224.0.0.22            01-00-5e-00-00-16     static
  224.0.0.251           01-00-5e-00-00-fb     static
  224.0.0.252           01-00-5e-00-00-fc     static
  239.255.255.250       01-00-5e-7f-ff-fa     static
  255.255.255.255       ff-ff-ff-ff-ff-ff     static
```

> 注意：這裡不會出現你自己電腦的 MAC 位址，這裡所呈現的都是「對方電腦」的 IP-to-MAC 紀錄。

如果你真的想查詢出自己電腦的 MAC 位址，最簡單的方法，就是先 PING 對方的 IP 地址 (`ping 172.30.96.1`)，如果連的上的話，就可以立刻透過 `arp -a` 就可以查出對方「網路介面」的 MAC 位址。

事實上，這份俗稱 `ARP Table` 的對照表，是可以隨時清除的，你只要重新連線，就會再次透過 ARP 解析出對方的 MAC 位址。以下是在 Windows 刪除 ARP Table 對應表的命令：

```batch
netsh interface ip delete arpcache
```

> 注意: Windows 下使用 `arp -d *` 命令可能有 Bug，有些電腦能執行，但我的電腦不知為何無法執行！

如果你的電腦有使用 Windows VPN 撥接 VPN 連線的話，預設 Windows 會採用 `full tunnel mode` 進行連線，所有連外的網路都會自動建立 VPN 網路介面的 ARP 資料，而這份資料透過上述指令是無法清除的，必須用以下命令才行：

```batch
ipconfig /flushdns && netsh interface ip delete arpcache
```

### 如何查詢自己的 MAC 位址

其實要自己查詢出自己正在使用中的 MAC 位址，真的沒有想像中的容易，查錯的機會其實蠻高的。

查詢 MAC 位址的邏輯是這樣的：

1.  你要先確認你用什麼方式上網 (實體網路 / Wi-Fi 無線網路 )
    
    **這個步驟的確認難度，很有可能超乎你的想像。**
    
    首先，你目前可能正在使用 Wi-Fi 上網，但是客戶端廠測區要求的網路環境必須是實體網路。
    
    你可能擁有超過一張實體網卡，但是都沒有接實體網路線，那麼你將會擁有超過一個 MAC 地址，但你不知道哪一張網路介面對應到哪一個實體網路接孔。
    
    有些筆電並沒有內建實體網卡，而是要用外接的方式才有網卡，而你從來沒有接過實體網路卡，所以電腦沒有任何網路介面的資訊，因此你查不到任何 MAC 位址，自然不知道 MAC 位址是多少。
    
    有些筆電並沒有內建實體網卡，你曾經接過，但此時你沒有攜帶外接網卡出來，但你還是有機會查到的。
    
    有些筆電並沒有內建實體網卡，但曾經接過好幾張不同的外接網卡，在你的電腦中可能有好幾張未被啟用的網路介面，所以你也可能無法判斷到底哪一張才是你未來要用的網路介面，所以你很難判斷 MAC 位址到底要用哪一個！
    
    如果你的電腦需要事先撥接 VPN 連到客戶的內網，此時連到客戶內網伺服器的 MAC 位址，並不是你正在使用的網卡，而是 VPN Server 所配發的虛擬網路介面所使用的 MAC 位址，這部分的 MAC 位址是你查不到的。所以一般來說，在用 VPN 撥接連網的情況下，通常不會特別用鎖定 MAC 位址的方法管理網路。
    
2.  透過指令快速查出 MAC 位址編號
    
    Windows
    
    ```batch
    ipconfig /all
    ```
    
    ![image](https://stwillblogassets.blob.core.windows.net/files/images/external/user-images.githubusercontent.com/8cf7d9271e91e6689be0-179533483-0f28d990-5f9e-4696-807f-6e177c6cf0e2.png)
    
    Linux
    
    ```bash
    ip a show
    ```
    
    ![image](https://stwillblogassets.blob.core.windows.net/files/images/external/user-images.githubusercontent.com/c8d4d14e8c21df7a51ee-179567362-fe6a3c81-9e06-4349-b7dc-258e1b5c55a2.png)
    
    macOS (請開啟 `Terminal` 執行)
    
    ```bash
    ifconfig
    ```
    
    ![image](https://stwillblogassets.blob.core.windows.net/files/images/external/user-images.githubusercontent.com/cd949648e797983f28ef-179534154-edc0149a-e758-49ac-a32e-c008e9075ba3.png)
    

老實說，如果你的電腦環境單純，是可以很容易查出 MAC addresss 的，但是只要網路環境稍微複雜一點點，例如你在本機裝了 Hyper-V 服務、安裝 Docker Desktop、...之類的，就有可能突然冒出一大堆「網路介面」可用，每個「網路介面」各自擁有一個 MAC address 可選，你此時就有可能陷入選擇障礙了！ 😅

### 總結

由於 MAC 位址「理論上」並不會重複，全世界所有的**實體網卡**都不應該有重複的 MAC 位址。如果我是網管人員，為了有效的管制廠測區的上網情況([Network Access Control](https://www.fortinet.com/products/network-access-control))(NAC)，避免有不知道哪裡來的小白設定了一個可能會讓大家斷線的 IP 地址，我會選擇在 Switch 設備上進行 `IP bind MAC` 設定，也就是把 IP address 與 MAC address 的對應表全部寫死在設備中，所有要上網的人全部都要來事先申請，當記錄寫入設備後，只要有人用了一個沒看過的 MAC 地址，就直接將他的網路封包全部丟棄，如此一來就不會影響到其他人上網了！

希望這篇文章足夠淺顯易懂，幫助那些不知道該如何查出 MAC 位址的開發人員！ 👍

### 相關連結

-   [查詢電腦網路卡號碼(MAC address)的方式](https://web.archive.org/web/20251119012116/https://sysadm.ntpu.edu.tw/mac.html)
-   [What is Address Resolution Protocol (ARP)?](https://www.fortinet.com/resources/cyberglossary/what-is-arp)
-   Wikipedia
    -   [Address Resolution Protocol](https://en.wikipedia.org/wiki/Address_Resolution_Protocol)
    -   [Internet Protocol](https://en.wikipedia.org/wiki/Internet_Protocol)
    -   [IP address](https://en.wikipedia.org/wiki/IP_address)
    -   [IPv4](https://en.wikipedia.org/wiki/IPv4)
    -   [MAC address](https://en.wikipedia.org/wiki/MAC_address)
    -   [OSI model](https://en.wikipedia.org/wiki/OSI_model)
-   [VPN doesn't work aka how to clear ARP cache on the computer when you connect to the VPN](https://www.lemonbits.com/vpn-doesnt-work-aka-how-to-clear-arp-cache-on-the-computer-when-you-connect-to-the-vpn/)
