【5G会话管理】UE IPv6地址的分配(SLAAC协议)
博主未授權任何人或組織機構轉載博主任何原創文章,感謝各位對原創的支持!
博主鏈接
本人就職于國際知名終端廠商,負責modem芯片研發。
在5G早期負責終端數據業務層、核心網相關的開發工作,目前牽頭6G算力網絡技術標準研究。
博客內容主要圍繞:
???????5G/6G協議講解
???????算力網絡講解(云計算,邊緣計算,端計算)
???????高級C語言講解
???????Rust語言講解
SLAAC協議
IPv6地址分類和結構
??????在開始學習SLAAC協議之前,我們先了解以下IPv6中的地址分類和地址結構,如下圖。
IPv6 單播地址
??????IPv6 單播地址分為三類:
-
IPv6公網單播地址:可在 IPv6 Internet 上路由的地址,類似IPv4公網地址;
-
IPv6本地鏈路地址:僅用于連接在同一條本地鏈路上的IPv6設備之間的通信;
-
IPv6 loopback 地址:不會分配給任何物理接口的 IPv6地址,主機會用該地址將數據包發送給自己;
表示方法IPv6 loopback 地址 最佳書寫格式 0000:0000:0000:0000:0000:0000:0000:0001 省略前導0 0:0:0:0:0:0:0:1 壓縮格式 ::1 -
IPv6 未指定地址:只能作為IPv6數據包的源IP地址,表示(發送給IPv6數據包的主機)IPv6地址暫缺或不詳;
表示方法IPv6 未指定地址 最佳書寫格式 0000:0000:0000:0000:0000:0000:0000:0000 省略前導0 0:0:0:0:0:0:0:0 壓縮格式 :: -
IPv6 本地唯一地址:類似于IPv4的私有地址,不能在IPv6 Internet 上路由;
-
嵌入IPv4地址的IPv6地址:一種在低位 “包含” 32位IPv4地址的IPv6地址,又可分為兩種格式,
-
由IPv4地址映射而成的IPv6地址;
如下表所示為IPv4地址 192.168.10.10 映射而成的 IPv6 地址的各種格式,表示方法IPv4地址映射而成的IPv6地址 最佳書寫格式 0000:0000:0000:0000:0000:fffff:192.168.10.10 省略前導0 0:0:0:0:0:ffff:192.168.10.10 壓縮格式 ::ffff:192.168.10.10 -
兼容IPv4地址的IPv6地址(已棄用 )。
-
IPv6 多播地址
注意了,IPv6 與 IPv4 不同沒有廣播的定義
??????IPv6 多播地址格式如下圖,
| 最佳書寫格式 | ff00:0000:0000:0000:0000:0000:0000:0000/8 |
| 省略前導0 | ff00:0:0:0:0:0:0:0/8 |
| 壓縮格式 | ff00::/8 |
眾所周知的 IPv6 多播地址
| ff02::1 | 所有 IPv6 設備的多播地址 |
| ff02::2 | 所有 IPv6 路由器多播地址 |
| ff02::5 | 所有 OSPFv3 路由器的多播地址 |
| ff02::a | 所有 EIGRP(IPv6)路由器的多播地址 |
IPv6 任播地址
??????IPv6 任播地址沒有特定的前綴,IPv6 任播地址范圍與IPv6公網單播地址范圍相同。IPv6 任播地址是指可被分配給多個接口的IPv6地址。換句話說,多臺設備可設有相同的 IPv6 任播地址。路由器會根據本地路由表,將目的地址為 IPv6 任播地址的數據包路由至 “最近的” 設有該地址的設備(接口)。
關鍵術語介紹
首選地址:分配給接口的地址,上層協議對該接口的使用不受限制。首選地址可以用作從(或到)接口發送的數據包的源(或目的)地址;
棄用地址:分配給接口的地址,不鼓勵使用,但不禁止使用。已棄用的地址不應再作為新通信的源地址,但從已棄用的地址或向已棄用的地址發送的數據包將按預期傳遞。當切換到首選地址導致某個特定上層活動(例如,一個現有的TCP連接)遇到故障時,廢棄的地址可以繼續作為通信中的源地址使用;
有效的地址:首選或已棄用的地址。一個有效的地址可以作為一個包的源地址或目的地址出現,并且互聯網路由器會將帶有有效地址的數據包傳遞給預期的收件人;
無效地址:沒有分配給任何接口的地址。當有效地址的有效期到期時,有效地址將失效。無效地址不應作為數據包的目的地址或源地址出現。在前一種情況下,互聯網路由系統將無法發送數據包;在后一種情況下,數據包的接收者將無法對其作出響應;
首選生存期:一個有效地址被首選的時間長度(即,直到棄用的時間)。當首選生存期到期時,該地址將變成棄用地址 ;
有效生存期:地址保持有效狀態的時間長度(即,直到失效的時間)。有效生存期必須大于或等于首選生存期。有效生存時間到期后,地址失效;
臨時地址:在分配給接口之前,正在驗證其在鏈路上的唯一性的地址。臨時地址在通常意義上不被認為分配給接口。NIC會丟棄接收到的地址為臨時地址的報文,但會接收與臨時地址相關的重復地址檢測報文;
interface identifier(接口ID):一個依賴于鏈路的標識符,每個鏈路至少是唯一的[RFC4291]。無狀態地址自動配置將接口標識符與前綴組合成地址。從地址自動配置的角度來看,接口標識符是已知長度的位串。接口標識符的確切長度和創建方式是在一個單獨的特定鏈接類型文檔中定義的,該文檔涵蓋了與通過特定鏈接類型傳輸IP相關的問題(例如,[RFC2464])。注意,地址體系結構[RFC4291]還定義了一些地址集的接口標識符的長度,但這兩組定義必須一致。在許多情況下,標識符將從接口的鏈路層地址派生;
on-link:指定鏈路上分配給接口的地址。一個節點認為一個地址是在線的,如果,
- 被一個地址前綴覆蓋的地址(例如,前綴信息選項中的on-link標志指出);
- 鄰居路由器指定該地址作為重定向消息的目標地址;
- 收到鄰居通告消息 的地址;
- 收到任何鄰居發現消息 的地址;
off-link:on-link 的反義詞;沒有分配給指定鏈路上任何接口的地址。
SLAAC協議講解
SLAAC:Stateless Address Autoconfiguration
??????網絡中存在兩種形式的自動配置,它們取決于需要生成什么類型的地址,對于只用于一條鏈路的地址(鏈路本地地址),一臺主機只需要找到一些在鏈路上未使用的合適地址。但是,對于要用于全球性連接的地址,這類地址的某些部分通常必須被管理。IPv4 和 IPv6 都有用于鏈路本地地址自動配置的機制,一臺主機基本不需要協助就可以決定自己的地址。這就是所謂的 無狀態地址自動配置(SLAAC)。
??????IPv6 SLAAC 的目標是允許節點自動(和自主)分配鏈路本地IPv6地址。【RFC4862】中描述了 IPv6 SLAAC。它包括3個主要步驟:
- 獲得一個鏈路本地地址;
- 檢測鏈路本地地址是否已在鏈路中使用;
- 使用SLAAC獲取全球地址;
- 檢測全球地址是否已在鏈路中使用。
SLAAC可用于沒有路由器的環境,在這種情況下只分配鏈路本地地址。當路由器存在的時,有一個路由器通告的前綴和本地產生的信息組合成一個全球地址。SLAAC也可結合DHCPv6使用,以允許一臺主機獲得除自己地址外的其它信息(稱為 “無狀態” DHCPv6)。當網絡采用有狀態或無狀態DHCPv6配置時,執行SLAAC的主機可用于同一網絡中。在通常情況下,有狀態DHCPv6用于需要為主機更精確分配地址時,但無狀態DHCPv6和SLAAC結合是最常見的部署選擇。
??????在IPv6中,臨時鏈路本地地址由【RFC4291】和【RFC4941】規定的過程來選擇。它們只用于具有組播能力的網絡,并在建立時分配了極大的首選和有效生命周期。為了形成數字化的地址,在熟知的鏈路本地前綴 fe80::/10之后附加了一個唯一的編號。這是通過將地址中最右邊的N位設為N位數字,最左邊的10位設為10位鏈路本地前綴 1111111010,并且其余為設為 0 來實現。生成的地址設置為臨時狀態,并檢查該地址是否重復。
IPv6 重復地址檢測(DAD)
??????IPv6 DAD 使用 ICMPv6 鄰居請求 和 鄰居通告 消息,以確定一個特定(臨時)IPv6地址是否已在鏈路中使用。【RFC4862】中定義了DAD過程,并建議在為一個接口分配IPv6地址時使用,無論手動分配還是自動配置或DHCPv6分配。如果發現地址重復,將不使用該臨時地址。如果DAD成功,臨時地址轉換為優先狀態,并可不受限制的使用。
??????DAD按以下步驟執行:一個節點首先加入臨時地址的所有節點組播地址 和 請求節點組播地址 。為了檢查使用的地址是否重復,一個節點發送一個或多個 ICMPv6 鄰居請求 消息。這些消息的源和目的IPv6地址分別時未指定地址 和 被檢查目的地址的 請求節點地址 。目的地址字段設置為被檢查的地址(臨時地址)。如果在一個時間段內接收到一個*鄰居通告 * 消息,說明DAD失敗,并放棄被檢查的地址。
??????當一個地址未成功完成DAD時,任何針對它的鄰居請求被視為一種特殊情況,說明其它主機有使用相同地址的意圖。如果接收到這些消息,丟棄它們,放棄當前的臨時地址,并且DAD失敗。
全球地址的 IPv6 SLAAC
??????在一個節點已獲得一個鏈路本地地址之后,它可能需要一個或多個全球地址。全球地址的形成過程類似于鏈路本地SLAAC,但需要使用一個由路由器提供的前綴。這個前綴就攜帶在一個路由器通告 消息的前綴選項中,并且由一個標志來表示這個前綴是否用于與SLAAC共同形成全球地址。如果是,這個前綴與接口ID組合成一個全球地址。這種地址的首選和有效生命周期也由前綴選項攜帶的信息來確定。
路由請求消息格式
通常路由器會周期性發送路由通知 消息,但是這個周期一般比較長。所以主機會主動發送路由器請求 消息,以提示路由器快速生成路由器通告 消息。格式如下,
| Type | 133 |
| code | 0 |
| CheckSum | ICMPv6的校驗和 |
| Reserved | 未使用,必須設置為0 |
路由通告消息格式
| Type | 134 |
| code | 0 |
| CheckSum | ICMPv6的校驗和 |
| Cur Hop Limit | 8bit 無符號整數。缺省值,應該放在IP報文的IP頭跳數字段中。值0意味未定義 |
| M | 1bit。為1時,表示使用DHCPv6獲取地址。如果設置M字段,則忽視O地段的設置 |
| O | 1bit。除了IP地址之外,其它參數可以通過DHCPv6獲取。例如,DNS相關的信息 |
| Reserved | 6bit 未使用字段,必須初始化為0 |
| Router Lifetime | 16bit 無符號整數。默認路由的生存期,以秒為單位。如果值為0,表示這個路由器不適合作為默認路由器,主機不應該將這個路由器放入默認路由器列表。只有當這個路由器為默認路由器時,此參數才生效 |
| Reachable Time | 32bit 無符號整數。在收到可達性確認后,節點認為鄰居是可達的時間,以毫秒為單位。用于鄰居不可達性檢測算法。值為0表示未指定(在此路由器上) |
| Retrans Timer | 32bit 無符號整數。重傳鄰居請求消息的時間,以毫秒為單位。用于地址解析和鄰居不可達性檢測算法。值為0表示未指定(在此路由器上)。避免鏈路上一瞬間有太多的鄰居請求消息引發網絡擁塞 |
我們需要的前綴信息就在 Options 字段中包含,格式如下,
| Type | 3 |
| Length | 4 |
| Prefix Length | 8bit 無符號整數。前綴中有效的前導位數。取值范圍為0 ~ 128 |
| L | 1bit on-link標志。當設置時,表示該前綴可用于 on-link 判定。如果不設置,則該通知不聲明前綴的on-link或off-link屬性。換句話說,如果沒有設置L標志,主機絕對不能斷定由前綴派生的地址是off-link的。也就是說,它絕對不能更新先前關于這個地址是 on-link 的指示信息 |
| A | 1bit SLAAC使能字段。當設置為1時,表示這個前綴信息可以用于SLAAC |
| Reserved1 | 6bit 未使用字段,必須被初始化為0 |
| Valid Lifetime | 32bit 無符號整數。前綴的有效時間,單位是秒(相對于報文發送時間)。全1位的值(0xffffffff)表示無窮大。 |
| Preferred Lifetime | 32bit 無符號整數。SLAAC使用此前綴生成的地址保持優先的時間(以秒為單位,與報文發送時間相關)。全1位的值(0xffffffff)表示無窮大。注意,這個字段的值一定不能超過Valid Lifetime字段,以避免優先選擇不再有效的地址 |
| Reserved2 | 未使用字段,必須被初始化為0 |
| Prefix | IP地址或IP地址的前綴。Prefix Length字段包含前綴中有效前導位的個數。前綴長度之后的位被保留,發送方必須初始化為零,接收方必須忽略。路由器不應該為鏈路本地前綴發送前綴選項,主機應該忽略這樣的前綴選項 |
鄰居請求消息格式
重復地址檢測過程,通過發送鄰居請求消息實現,
| Type | 135 |
| code | 0 |
| CheckSum | ICMPv6的校驗和 |
| Reserved | 未使用,必須設置為0 |
| Target Address | 請求的目標IP地址,此地址不能是多播地址。在DAD中,此字段是臨時地址 |
鄰居通告消息格式
如果有鄰居發現這個臨時地址已經被使用,則發送鄰居通告消息告知目標主機,格式如下,
| Type | 136 |
| code | 0 |
| CheckSum | ICMPv6的校驗和 |
| R | 路由字段。當設置為1時,表示發送者為路由器 |
| S | 請求字段。當設置S為1時,表示該通告是對來自目的地址的鄰居請求的響應 |
| O | 覆寫字段。如果設置O字段為1,表示通告應該覆蓋現有的緩存條目并更新緩存的鏈路層地址。如果沒有設置,則不會更新緩存的鏈路層地址,但它會更新已存在但鏈路層地址未知的鄰居緩存條目 |
| Reserved | 29bit 未使用,必須設置為0 |
| Target Address | 位于鄰居請求消息中的Target Address 字段值。對于非請求的通知消息,這個字段表示某設備的鏈路層地址發生了變化。此字段不能是多播地址 |
舉個例子
打開WireShark,監聽我們的網卡,然后重啟網卡,就會收到關于SLAAC 的 ICMPv6 消息。如下圖,
首先主機自己選擇了一個鏈路本地地址 “fe80::b951:1262:232:cda5”,并發送 NS(鄰居請求消息)進行DAD過程,如下圖,
可以看到這個消息的源地址是 未指定的地址 表示用于DAD流程,Target Address 字段設置為臨時地址 “fe80::b951:1262:232:cda5”。與此同時,發送 RS(路由器請求消息)用于獲取全球IP地址。
注意,為了提升效率,主機會同時執行本地鏈路IP地址DAD流程和全球IP地址請求過程。
主機發送RS消息,請求全球IP地址,如下圖,
主機將RS的目標地址設置為所有路由器的多播地址 ff02::2 ,隨后收到了路由器的RA(路由器通知消息)消息,分配的全球IP前綴為 “240e:404:2a21:a475::/64”,如下圖
隨后主機使用分配的IP前綴和接口ID組成了全球IPv6地址 “240e:404:2a21:a475:b951:1262:232:cda5”,并對這個臨時地址發起DAD流程,如下圖,
至此整個SLAAC流程就結束了。
總結
以上是生活随笔為你收集整理的【5G会话管理】UE IPv6地址的分配(SLAAC协议)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 医疗实施-常用的英文简称
- 下一篇: latex 符号