IPv6通訊原理 - 不能忽略的網卡啟動過程
目錄
- 一. 為什么不能忽略網卡啟動過程
- 二. 實驗環境
- 三. 網卡啟動前/后的樣子
- 四. 結論寫在前
- Step1. 生成“鏈路本地地址”
- Step2. 生成“被請求節點多播地址”
- Step3. “多播成員報告”
- Step4. “重復地址檢測”
- Step5. “無狀態地址自動配置”
- 思考題
- 附. 實驗腳本與抓包文件
一. 為什么不能忽略網卡啟動過程
掌握網絡技術,除了看RFC協議外,最直接高效的方法就是“親眼所見”。
其中抓包分析是最為關鍵的方法,能了解到:
- What:對應哪個協議
- Why:協議用途
- When:協議之間的關聯
- How:報文地址和內容
網卡啟動是網絡通訊的第一步,只有夯實基礎方能展翅高飛。
二. 實驗環境
本文以CentOS 7為實驗環境,創建兩個network namespace(名字分別為ns1和ns2),并通過veth網卡橋接到同一個linux bridge(名字為br0),來模擬最簡單的環境,即兩臺同二層服務器。
先貼出mac地址:
- ns1內的mac:52:54:00:00:00:01
- ns2內的mac:52:54:00:00:00:02
實驗步驟:
- 1⃣ 在ns1里啟動網卡,但不抓包查看
- 2⃣ 在ns2里啟動網卡,同時在br0上進行抓包分析
觀察:
- ns2會產生哪些包
- ns1是否會對ns2進行響應
本文最后會附上實驗腳本和抓包文件的下載地址。
三. 網卡啟動前/后的樣子
網卡啟動前的樣子
在ns2里啟動網卡之前,先對ns2里的網絡環境進行查看,命令如下:
- # 查看網卡狀態
- ip netns exec ns2 ip link
- # 查看ipv6地址
- ip netns exec ns2 ip -6 addr
- # 查看ipv6路由
- ip netns exec ns2 ip -6 route
- # 查看ipv6多播地址
- ip netns exec ns2 ip -6 maddr

可以看到此時eth0處于DOWN的狀態,接下去,對eth0進行UP。
網卡啟動后的樣子
- # 啟動網卡
- ip netns exec ns2 ip link set eth0 up
進入ns2里查看:

可以看到,此時網卡已啟動,并獲得了一個鏈路本地地址(圖中fe80開頭的)。
抓到了哪些包呢

這些包都是什么意思,如何產生,為何產生,請接著往下看。
四. 結論寫在前
網卡啟動過程一共有5步,詳見示意圖(右邊的數字,表示對應抓包圖中的第幾個包):

接下來,將對這5步進行逐步講解。
Step1. 生成“鏈路本地地址”

(本步驟尚未產生數據包)
“鏈路本地地址”是什么
- 當網卡啟動時會根據某種算法自動生成鏈路本地地址(Link-Local Address)。
- 具體生成的地址,與操作系統有關,有的根據MAC地址換算而來(EUI-64),有的則是隨機生成,并不統一。
- “鏈路本地地址”是范圍為fe80::/10的單播地址。
- “鏈路本地”顧名思義,只在同一個二層內傳播,不會被路由器轉發。
“鏈路本地地址”有什么作用
- 地址自動配置
- 鄰居發現協議
- 路由轉發(可以作為下一跳地址)
Step2. 生成“被請求節點多播地址”

(本步驟尚未產生數據包)
“被請求節點多播地址”是什么
在IPv6的世界中,每生成一個ip地址(準確說是單播地址),無論什么類型,都會對應生成一個“被請求節點多播地址”(Solicited-Node multicast address)。
組成方式:FF02::1:FF00:0/104 + 單播地址的最后24bit。可以看到,該地址是通過單播地址推導而成,不是隨機的。上圖中紅框里的地址就是“鏈路本地地址”對應的“被請求節點多播地址”。
為什么需要“被請求節點多播地址”
就4個字:“地址解析”
- IPv4中用ARP做地址解析,ARP是基于廣播的。
- IPv6沒有廣播,只有多播。既然是多播,就總得有一個多播地址才行,于是應運而生。
“被請求節點多播地址”工作原理
當他人想解析我的MAC地址時,發送一個“地址解析請求包”到這個多播地址,然后屬于該多播地址的成員(也就是“我”)就會收到該數據包,最后“我”返回MAC地址給對方。這樣就完成了“地址解析”的流程。
“被請求節點”這5個字到底是什么意思
別人請求解析我的地址,那么我就是被請求的節點。我生成“被請求節點多播地址”的目的,就是讓別人能夠請求到我。
Step3. “多播成員報告”

(對應抓包圖中的No. 1/2/4/6)
什么是“多播成員報告”
- MLDv2協議(多播控制協議)中的一種報文類型(Membership Report)。
- 通俗理解就是對外宣稱“我要加入某某多播組”。
- 成員報告是單向的,不會收到回應包。
為什么要進行“多播成員報告”
- 只要生成多播地址,就要進行成員報告,這是多播的工作機制。
- 成員報告的目的是為了減少網絡中的多播流量。
要報告的是哪個成員
- 要報告的成員不是單播地址,而是多播地址。
- 這里指的就是“被請求節點多播地址”。即“我要加入ff02::1:ff00:2多播組”

Step4. “重復地址檢測”

(對應抓包圖中的No. 3)
什么是“重復地址檢測”
- 為了防止IP地址沖突,每生成一個單播地址,都會進行一次“重復地址檢測”(Duplicate Address Detection,簡稱DAD)。
- 此刻,就是對Step1生成的“鏈路本地地址”進行檢測。
何時進行“重復地址檢測”
- 在生成單播地址并完成發送一次“MLDv2成員報告”后,就會隨機延時一小段時間進行檢測。
- 在centos7里檢測次數可通過內核參數net.ipv6.conf.eth0.dad_transmits進行修改,若設置為0表示不進行檢測。
“重復地址檢測”的工作原理
- 舉個例子:我想給我家小狗取名,叫“球球”,但不想和鄰居家的小狗重名,于是我大聲喊:“球球”。如果沒有任何狗狗看過來,那就可以認定此名字沒有沖突。
- 專業解釋:發送一個地址解析包(Neighbor Solicitation,簡稱NS),請求解析的地址就是自己的地址,并等待回應,若超時仍未得到回應(Neighbor Advertisement,簡稱NA),即可認為地址可用。
Step5. “無狀態地址自動配置”

(對應抓包圖中的No. 5/7/8)
什么是“無狀態地址自動配置”
在IPv6中,有2種自動配置IP地址的方法:
- DHCPv6:也叫做“有狀態分配”
- SLAAC:“無狀態地址自動配置”(Stateless Address Autoconfiguration)
SLAAC的作用是什么
- 自動配置IP地址
- 自動配置網關
注:這里說的IP地址,是指“全球單播地址”或者“唯一本地地址”,也就是俗稱的公網地址和私網地址。而不是“鏈路本地地址”。
工作原理
涉及到這2種報文:
- “路由器請求”(Router Solicitation,簡稱RS)
- “路由器通告”(Router Advertisement,簡稱RA)
當收到路由器回應的RA報文后,就會根據報文中的IP前綴信息,自動生成IP地址,并將網關指向該路由器的“鏈路本地地址”。
如何能夠收到RA報文呢
有2種辦法:
- 路由器定期發送RA報文
- 自己主動發送RS報文,路由器收到后就會立刻回應RA報文
由于本次實驗中沒有路由器,因此截圖中僅能看到主動發送的RS報文,而沒有得到回應。
思考題
- 在生成“全球單播地址”或“唯一本地地址”之后,還會采用“鏈路本地地址”做基礎通訊嗎?
- 為什么“多播成員報告”可以減少網絡中不必要的多播流量,接入層交換機要進行額外配置嗎?
- “地址重復”時,是否會自動更換IP?
- RA包只能包含一個IP前綴信息嗎?一個前綴只能生成一個IP地址嗎?生成的地址是什么樣的?
- 若存在多臺路由器,網關會指向誰?
- 如果不想自動配置IP,只想手工配置IP,可以忽視RA包嗎?如何忽視?
上述問題,將在《IPv6系列》的下一篇文章中進行解答。
附. 實驗腳本與抓包文件
- # 實驗腳本
- https://fzxiaomange.com/attachment/ipv6-init.sh
- # 抓包文件
- https://fzxiaomange.com/attachment/ipv6-init.pcap



















