隨着IPv6技術的普及,DHCPv6 作爲基礎技術是每一位IT人或多或少都需要了解的。本文將依託騰訊雲CVM來詳細剖析 DHCPv6 的工作原理,希望可以讓更多小夥伴掌握 DHCPv6 協議。什麼是 DHCPv6 協議?客戶端如何首次自動獲取一個 IPV6 地址?CVM重啓又如何自動獲取到上次使用的 IPv6 地址?本文作者:騰訊雲售後架構師 李彬文。

一、DHCPv6簡介

DHCPv6 (Dynamic Host Configuration Protocol for IPv6)是一個用來分配 IPv6 地址、前綴以及DNS等配置的網絡協議。

DHCPv6 是一種運行在客戶端和服務端之間的協議,與 IPv4 中的 DHCP 一樣,所有的協議報文都是基於 UDP 的(客戶端使用UDP 端口號546,服務端使用端口號547)。但是由於在 IPv6中 沒有廣播報文,因此 DHCPv6 使用組播(默認所有DHCPv6服務器都會加入並偵聽該組播組:FF02::1:2)報文,客戶端也無需配置服務端的IPv6地址。

1. DHCPv6協議的優勢

相對其他分配IPV6地址的方式而言,DHCPv6具備以下優勢:

  • 更好控制 IPv6 地址的分配,DHCPv6 方式不僅可以記錄爲 IPv6 主機分配的地址,還可以爲特定的 IPv6 主機分配特定的地址,以便於網絡管理。
  • DHCPv6 支持爲網絡設備分配 IPv6 前綴,便於全網絡的自動配置和網絡層次性管理。
  • 除了爲 IPv6 主機分配 IPv6 地址和前綴外,還可以分配DNS服務器 IPv6 地址等網絡配置參數。

2. DHCPv6報文格式

DHCPv6 屬於 OSI 七層協議棧的應用層,所以需要先封裝網絡層 IPv6 頭部以及傳輸層UDP頭部。

3. DHCPv6字段註釋

  • msg-type:長度8比特,表示報文的類型,總共定義了13種消息類型。
  • transaction-id:長度24比特,表示 DHCPv6 客戶端隨機生成的交互ID(服務端發起的報文交互ID爲0),用來標識一次來回交互的 DHCPv6 報文。例如Solicit/Advertise報文爲一次交互,Request/Reply報文爲另外一次交互,兩者有不同的交互ID。
  • options:根據消息類型不一樣長度可變,表示 DHCPv6 的可選字段。此字段包含了 DHCPv6 服務器分配給 IPv6 主機的配置信息,如客戶端標識、服務器標識或有效生命週期等信息。

4. DHCPv6定義的幾種常見消息類型

(1)Solicit,DHCPv6 客戶端使用Solicit報文來發現 DHCPv6 服務器的位置。

(2)Advertise,DHCPv6 服務器發送Advertise報文來對Solicit報文進行回應,通告客戶端能夠提供哪些 DHCPv6 服務。

(3)Request,DHCPv6 客戶端發送Request報文來向DHCPv6服務器請求IPv6地址和其它配置信息。

(4)Confirm,DHCPv6 客戶端向任意可達的 DHCPv6 服務器發送Confirm報文檢查自己目前獲得的 IPv6 地址是否適用與它所連接的鏈路。

(5)Reply,DHCPv6服務器在以下場合發送Reply報文:

  • DHCPv6 服務器發送攜帶了地址和配置信息的Reply消息來回應從 DHCPv6 客戶端收到的Solicit、Request、Renew、Rebind報文。
  • DHCPv6 服務器發送攜帶配置信息的Reply消息來回應收到的Information-Request報文。
  • 用來回應 DHCPv6 客戶端發來的Confirm、Release、Decline報文。

(6)Decline,DHCPv6 客戶端向 DHCPv6 服務器發送 Decline 報文,聲明 DHCPv6 服務器分配的一個或多個地址在 DHCPv6 客戶端所在鏈路上已經被其他客戶端使用。

二、首次獲取IPV6地址解析

CVM首次接入騰訊雲 IPv6 網絡,通過 DHCPv6 自動獲取 IPv6 地址的交互報文如下所示:

1. 發現階段

客戶端CVM(雲服務器)發送Solicit報文來發現 DHCPv6 服務器,並請求DHCPv6 服務器(騰訊雲虛擬組件)爲其分配 IPv6 地址和網絡配置參數。

由於CVM不知道 DHCPv6 服務器的 IPv6 地址,所以CVM用組播地址:FF02::1:2向同一鏈路範圍內的所有DHCPv6服務器發送Solicit報文。

Solicit報文中攜帶了客戶端的DUID、需要請求的非臨時地址、以及其他網絡配置參數等信息。

2. 提供階段

DHCPv6 服務器接收到Solicit報文後,選擇按照 IPv6 地址從小到大的順序採用循環查找方式,選擇最新找到的可供分配的 IPv6 地址,然後通過Advertise報文以單播方式回應給CVM。

Advertise報文裏面攜帶了服務器的DUID、客戶端的DUID、分配給客戶端的IPv6地址及租期等信息。

3. 選擇階段

因爲Solicit報文是組播發送的,所以如果同一鏈路範圍內存在多個 DHCPv6 服務器,則接收到Solicit報文的服務器都會回應Advertise報文。

如果有多個 DHCPv6 服務器向DHCPv6客戶端回應Advertise報文,則 DHCPv6 客戶端選擇服務器優先級最高的Advertise報文(DHCPv6 服務器可以在Advertise消息中包含Preference選項,以便控制客戶端對服務器的選擇),然後客戶端以組播方式向同一鏈路範圍內的所有 DHCPv6 服務器發送Request報文,該報文中包含客戶端選擇的 DHCPv6 服務器(高優先級)的DUID、客戶端的DUID、客戶端IPv6地址。

4. 確認階段

當 DHCPv6 服務器收到Request報文後,對報文中攜帶的服務端DUID信息進行判斷:

  • 若報文中攜帶的服務端DUID不是本服務端的DUID,則對該Request報文不回應,同時將Request報文中請求的IPv6地址進行回收。
  • 若報文中攜帶的服務端DUID是本服務端的DUID,則以單播方式回應Reply報文,確認Request報文中請求的IPv6地址分配給客戶端使用。

5. 客戶端CVM處理階段

客戶端CVM收到Reply報文後會發送地址衝突探測報文(Neighbor Solicitation),檢查本鏈路範圍內是否有其他客戶端使用相同的IPv6地址,如果在指定時間內沒有收到回應,表示客戶端可以使用此地址。

注意事項:如果發的地址衝突探測報文(Neighbor Solicitation)收到了回應,說明有其他客戶端使用了此地址,CVM會以單播方式向服務端發送Decline(聲明地址衝突)報文,並重新發送Solicit報文請求新的可用IPv6地址。服務端收到Decline報文後,會將報文中攜帶的IPv6地址列爲衝突地址。

三、重啓後獲取IPV6地址解析

CVM非首次接入騰訊雲IPv6網絡,通過 DHCPv6 自動獲取 IPv6 地址的交互報文如下所示:

第一步,當客戶端CVM(雲服務器)非首次接入 IPv6 網絡時(比如重啓、網卡禁用後再啓用等),CVM會通過組播地址:FF02::1:2,發送Confirm報文確認該CVM之前的IPv6地址是否仍然可用。

第二步,DHCPv6 服務器(騰訊雲虛擬組件)收到Confirm報文後,確認Confirm報文中所有的地址是否適用於該CVM。

若Confirm報文中所有的IPv6地址都通過了確認,服務器回應確認成功的Reply報文(如果客戶端收到確認失敗的Reply報文,則發送Solicit報文,重新請求IPv6地址;)。

第三步,客戶端CVM收到確認成功的Reply報文後會發送地址衝突探測報文(Neighbor Solicitation),檢查本鏈路範圍內是否有其他客戶端使用相同的IPv6地址,如果在指定時間內沒有收到回應,表示該CVM可以使用此地址。

至此,客戶端通過DHCPv6協議首次和非首次自動獲取IPv6地址的原理就解釋清楚了,通過該文章也闡述了DHCPv6的6種常用類型報文的作用,希望小夥伴們多多嘗試,加深理解。

相關文章