IPv6通訊原理(1) - 不能忽略的網(wǎng)卡啟動過程
相關(guān)文章《IPv6系列-初學(xué)者的10個常見困擾》
本文通過抓包分析,深入觀察網(wǎng)卡啟動過程的每個步驟,從而逐步掌握通訊原理。
一、為什么不能忽略網(wǎng)卡啟動過程
掌握網(wǎng)絡(luò)技術(shù),除了看RFC協(xié)議外,最直接高效的方法就是“親眼所見”。
其中抓包分析是最為關(guān)鍵的方法,能了解到:
- What:對應(yīng)哪個協(xié)議
- Why:協(xié)議用途
- When:協(xié)議之間的關(guān)聯(lián)
- How:報文地址和內(nèi)容
網(wǎng)卡啟動是網(wǎng)絡(luò)通訊的***步,只有夯實(shí)基礎(chǔ)方能展翅高飛。
二、實(shí)驗(yàn)環(huán)境
本文以CentOS 7為實(shí)驗(yàn)環(huán)境,創(chuàng)建兩個network namespace(名字分別為ns1和ns2),并通過veth網(wǎng)卡橋接到同一個linux bridge(名字為br0),來模擬最簡單的環(huán)境,即兩臺同二層服務(wù)器。
1. 先貼出mac地址:
- ns1內(nèi)的mac:52:54:00:00:00:01
- ns2內(nèi)的mac:52:54:00:00:00:02
2. 實(shí)驗(yàn)步驟:
- 在ns1里啟動網(wǎng)卡,但不抓包查看
- 在ns2里啟動網(wǎng)卡,同時在br0上進(jìn)行抓包分析
3. 觀察:
- ns2會產(chǎn)生哪些包
- ns1是否會對ns2進(jìn)行響應(yīng)
本文***會附上實(shí)驗(yàn)?zāi)_本和抓包文件的下載地址。
三、網(wǎng)卡啟動前/后的樣子
1. 網(wǎng)卡啟動前的樣子
在ns2里啟動網(wǎng)卡之前,先對ns2里的網(wǎng)絡(luò)環(huán)境進(jìn)行查看,命令如下
- # 查看網(wǎng)卡狀態(tài)
- 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的狀態(tài),接下去,對eth0進(jìn)行UP。
2. 網(wǎng)卡啟動后的樣子
- # 啟動網(wǎng)卡
- ip netns exec ns2 ip link set eth0 up
進(jìn)入ns2里查看

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

這些包都是什么意思,如何產(chǎn)生,為何產(chǎn)生,請接著往下看。
四、結(jié)論寫在前
網(wǎng)卡啟動過程一共有5步,詳見示意圖(右邊的數(shù)字,表示對應(yīng)抓包圖中的第幾個包):
接下來,將對這5步進(jìn)行逐步講解。
Step1. 生成“鏈路本地地址”
(本步驟尚未產(chǎn)生數(shù)據(jù)包)
(1) “鏈路本地地址”是什么
- 當(dāng)網(wǎng)卡啟動時會根據(jù)某種算法自動生成鏈路本地地址(Link-Local Address)。
- 具體生成的地址,與操作系統(tǒng)有關(guān),有的根據(jù)MAC地址換算而來(EUI-64),有的則是隨機(jī)生成,并不統(tǒng)一。
- “鏈路本地地址”是范圍為fe80::/10的單播地址。
- “鏈路本地”顧名思義,只在同一個二層內(nèi)傳播,不會被路由器轉(zhuǎn)發(fā)。
(2) “鏈路本地地址”有什么作用
- 地址自動配置
- 鄰居發(fā)現(xiàn)協(xié)議
- 路由轉(zhuǎn)發(fā)(可以作為下一跳地址)
Step2. 生成“被請求節(jié)點(diǎn)多播地址”

(本步驟尚未產(chǎn)生數(shù)據(jù)包)
(1) “被請求節(jié)點(diǎn)多播地址”是什么
在IPv6的世界中,每生成一個ip地址(準(zhǔn)確說是單播地址),無論什么類型,都會對應(yīng)生成一個“被請求節(jié)點(diǎn)多播地址”(Solicited-Node multicast address)。
組成方式:FF02::1:FF00:0/104 + 單播地址的***24bit。可以看到,該地址是通過單播地址推導(dǎo)而成,不是隨機(jī)的。上圖中紅框里的地址就是“鏈路本地地址”對應(yīng)的“被請求節(jié)點(diǎn)多播地址”。
(2) 為什么需要“被請求節(jié)點(diǎn)多播地址”
就4個字:“地址解析”
- IPv4中用ARP做地址解析,ARP是基于廣播的。
- IPv6沒有廣播,只有多播。既然是多播,就總得有一個多播地址才行,于是應(yīng)運(yùn)而生。
(3) “被請求節(jié)點(diǎn)多播地址”工作原理
當(dāng)他人想解析我的MAC地址時,發(fā)送一個“地址解析請求包”到這個多播地址,然后屬于該多播地址的成員(也就是“我”)就會收到該數(shù)據(jù)包,***“我”返回MAC地址給對方。這樣就完成了“地址解析”的流程。
(4) “被請求節(jié)點(diǎn)”這5個字到底是什么意思
別人請求解析我的地址,那么我就是被請求的節(jié)點(diǎn)。我生成“被請求節(jié)點(diǎn)多播地址”的目的,就是讓別人能夠請求到我。
Step3. “多播成員報告”
(對應(yīng)抓包圖中的No. 1/2/4/6)
(1) 什么是“多播成員報告”
- MLDv2協(xié)議(多播控制協(xié)議)中的一種報文類型(Membership Report)。
- 通俗理解就是對外宣稱“我要加入某某多播組”。
- 成員報告是單向的,不會收到回應(yīng)包。
(2) 為什么要進(jìn)行“多播成員報告”
- 只要生成多播地址,就要進(jìn)行成員報告,這是多播的工作機(jī)制。
- 成員報告的目的是為了減少網(wǎng)絡(luò)中的多播流量。
(3) 要報告的是哪個成員
- 要報告的成員不是單播地址,而是多播地址。
- 這里指的就是“被請求節(jié)點(diǎn)多播地址”。即“我要加入ff02::1:ff00:2多播組”

Step4. “重復(fù)地址檢測”
(對應(yīng)抓包圖中的No. 3)
(1) 什么是“重復(fù)地址檢測”
- 為了防止IP地址沖突,每生成一個單播地址,都會進(jìn)行一次“重復(fù)地址檢測”(Duplicate Address Detection,簡稱DAD)。
- 此刻,就是對Step1生成的“鏈路本地地址”進(jìn)行檢測。
(2) 何時進(jìn)行“重復(fù)地址檢測”
- 在生成單播地址并完成發(fā)送一次“MLDv2成員報告”后,就會隨機(jī)延時一小段時間進(jìn)行檢測。
- 在centos7里檢測次數(shù)可通過內(nèi)核參數(shù)net.ipv6.conf.eth0.dad_transmits進(jìn)行修改,若設(shè)置為0表示不進(jìn)行檢測。
(3) “重復(fù)地址檢測”的工作原理
- 舉個例子:我想給我家小狗取名,叫“球球”,但不想和鄰居家的小狗重名,于是我大聲喊:“球球”。如果沒有任何狗狗看過來,那就可以認(rèn)定此名字沒有沖突。
- 專業(yè)解釋:發(fā)送一個地址解析包(Neighbor Solicitation,簡稱NS),請求解析的地址就是自己的地址,并等待回應(yīng),若超時仍未得到回應(yīng)(Neighbor Advertisement,簡稱NA),即可認(rèn)為地址可用。
Step5. “無狀態(tài)地址自動配置”
(對應(yīng)抓包圖中的No. 5/7/8)
(1) 什么是“無狀態(tài)地址自動配置”
在IPv6中,有2種自動配置IP地址的方法:
- DHCPv6:也叫做“有狀態(tài)分配”
- SLAAC:“無狀態(tài)地址自動配置”(Stateless Address Autoconfiguration)
(2) SLAAC的作用是什么
- 自動配置IP地址
- 自動配置網(wǎng)關(guān)
注:這里說的IP地址,是指“全球單播地址”或者“唯一本地地址”,也就是俗稱的公網(wǎng)地址和私網(wǎng)地址。而不是“鏈路本地地址”。
(3) 工作原理
涉及到這2種報文:
- “路由器請求”(Router Solicitation,簡稱RS)
- “路由器通告”(Router Advertisement,簡稱RA)
當(dāng)收到路由器回應(yīng)的RA報文后,就會根據(jù)報文中的IP前綴信息,自動生成IP地址,并將網(wǎng)關(guān)指向該路由器的“鏈路本地地址”。
(4) 如何能夠收到RA報文呢
有2種辦法:
- 路由器定期發(fā)送RA報文
- 自己主動發(fā)送RS報文,路由器收到后就會立刻回應(yīng)RA報文
由于本次實(shí)驗(yàn)中沒有路由器,因此截圖中僅能看到主動發(fā)送的RS報文,而沒有得到回應(yīng)。
思考題
- 在生成“全球單播地址”或“唯一本地地址”之后,還會采用“鏈路本地地址”做基礎(chǔ)通訊嗎?
- 為什么“多播成員報告”可以減少網(wǎng)絡(luò)中不必要的多播流量,接入層交換機(jī)要進(jìn)行額外配置嗎?
- “地址重復(fù)”時,是否會自動更換IP?
- RA包只能包含一個IP前綴信息嗎?一個前綴只能生成一個IP地址嗎?生成的地址是什么樣的?
- 若存在多臺路由器,網(wǎng)關(guān)會指向誰?
- 如果不想自動配置IP,只想手工配置IP,可以忽視RA包嗎?如何忽視?
上述問題,將在《IPv6系列》的下一篇文章中進(jìn)行解答。























