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