IPv6協議棧的相關內容
我們都知道使用IPv6協議棧的必要性。面對網絡越來越大的壓力,我們不得不提出更高標準來適應更多的用戶需要。那么在這個被稱之為下一代網絡的主宰,又有什么特色呢?現在就讓我們來仔細看看IPv6協議棧的相關內容吧。
IPv6協議棧設計與實現
在設計協議棧過程中,我們在嵌入式操作系統基礎上設計和實現一個操作系統模擬層,實現基本的時鐘,消息管理和進程同步等基本操作系統功能。協議進程方面,把所有的協議棧封裝到單獨進程中,應用程序可以駐留在其中或作為一個單獨的進程,這樣既實現了與操作系統分離,又避免了層間切換。對于內存管理采用類BSDbuf結構,把靜態緩沖區和動態緩沖區鏈接起來。
IPv6協議
IPv6協議棧模塊主要用于完成對接收到的IPv6數據報進行處理,對需要發送的IPv6數據包進行構造并遞交底層發送。當接收到一個數據包時,網絡設備驅動調用ip_input()函數來對其IP報頭進行檢查,檢查其版本號,報文長度,載荷長度,目的節點地址和下一報頭,待檢查無誤后,根據下一包頭的類型分別提交給不同的處理模塊。當要發送數據時,必須要知道發送報文的下一跳IPv6地址,以及該地址的相對應MAC地址,ip_route()函數就是為實現這樣的功能而設計的,其獲取下一跳IPv6地址與其對應MAC地址的處理流程,目的緩存用來存儲著一系列最近的報文流量與對應的下一跳IP地址的關系,前綴列表存儲著一系列子網前綴和其他地址前綴及其對應的下一跳IP地址的關系,如果兩者中都沒有找到匹配的記錄,則再從前綴列表中選擇默認路由器作為傳輸的下一跳IPv6地址。
在成功獲取了下一跳IPv6協議地址后,數據就進入傳輸階段,傳輸階段由ip_outputif()函數控制,ip_output()函數填充好報頭,選擇好發送網絡接口,然后激活發送網絡接口進行數據發送。
ICMPV6
ICMPV6負責接收,解釋和發送ICMPV6報文。收到報文后,如果為鄰居信息報文則轉交給鄰居發現模塊,如果為診斷報文則交給ICMPV6診斷模塊。ICMPV6模塊只實現了應答回復報文,目的不可達報文。當處理到達的IP報文時,如果下一報頭既不是TCP,UDP也不是ICMPV6,那么表示在嵌入式設備端的協議棧的已經到達IP層,是端口不可達,發送目的不可達報文。當收到ICMPV6的應答請求報文時,就發送應答回復報文,其格式與請求報文相似,在收到的請求報文的基礎上改變報文類型,重新計算校驗和,在IP報頭中將源,目的地址對調就可以了。
鄰居發現
鄰居發現是精簡IPv6協議棧最核心的協議,它利用鄰居請求報文和鄰居公告報文的交換,實現地址解釋,地址重復性檢測,以及地址自動配置功能。不實現路由器請求/路由器公告報文,和重定向報文。
◆鄰居請求報文
類型值為135,報文IP頭的源地址域為發送鄰居請求報文接口的地址或者未指定,目的地址域為與被請求目標地址相關聯的被請求節點組播地址,或者就是被請求目標地址本身。ICMPV6報頭域中的目標地址域為被請求目標地址。選項域可以包含源鏈路層地址選項,用來告訴對方發送請求節點的MAC地址,當源地址為指定地址時必須包含該選項。
◆鄰居公告報文
類型值為136,用來響應鄰居請求報文,或者用來告知節點其鏈路層地址的改變,報文IP頭的源地址為發送鄰居公告報文的接口地址,目的地址為發送鄰居請求的單播地址,或者是用來公告給所有鄰居節點其鏈路層地址改變的全節點多播地址。目標地址就是被解釋的IPv6地址,或者在地址唯一性驗證中將要采用的IPv6協議地址。地址解釋就是節點僅僅知道鄰居節點IP地址的情況下,通過發送鄰居請求報文和接收鄰居公告報文,來得到對應節點鏈路層地址的過程,是IPv6協議棧中鄰居發現模塊中最重要的一個功能模塊。
節點A知道節點B的鏈路IPv6協議地址
FEC0:0:0:1::B但不知道節點B的鏈路層地址00-10-5C-F7-5C-96,沿箭頭方向,A發送鄰居請求報文,IP域的目的地址是要求被解釋的目標地址FEC0:0:0:1::B。節點B收到鄰居請求報文后,查看目標地址就是屬于本機,是則發送一個單播的鄰居公告報文給A,在鄰居公告報文的目的鏈路層地址選項里包含節點B的鏈路層地址00-10-5C-F7-5C-96。這樣節點A知道了節點B的鏈路層地址,地址解釋過程完成。