IPv4/IPv6雙協(xié)議棧實(shí)現方案解析
1引言
本文引用地址:http://dyxdggzs.com/article/190394.htm隨著(zhù)嵌入式系統與網(wǎng)絡(luò )的日益結合,在嵌入式系統中引入TCP/IP協(xié)議棧,以支持嵌入式設備接入網(wǎng)絡(luò ),成為嵌入式領(lǐng)域重要的研究方向。并且隨著(zhù) Internet技術(shù)的迅猛發(fā)展和規模的不斷擴大,現行的Internet協(xié)議IPv4在地址空間、端到端的IP連接、服務(wù)質(zhì)量和網(wǎng)絡(luò )安全等方面暴露出了不足,極大地限制了IP網(wǎng)絡(luò )的進(jìn)一步發(fā)展。而IPv6所提供的巨大地址空間和網(wǎng)絡(luò )安全等因素已經(jīng)使其成為下一代因特網(wǎng)IP協(xié)議,為了能夠支持IPv6的應用,并且考慮到從IPv4到IPv6仍然需要一個(gè)過(guò)渡期,本文實(shí)現了一種基于實(shí)時(shí)操作系統的IPv4/IPv6雙協(xié)議棧結構。
2協(xié)議棧的設計要點(diǎn)
2.1平臺無(wú)關(guān)性
本文所設計的TCP/IP雙協(xié)議棧,要求不能局限于特定的硬件環(huán)境和軟件系統。因此,本協(xié)議棧的實(shí)現采用將所有的TCP/IP協(xié)議都駐留在一個(gè)進(jìn)程當中,協(xié)議棧模塊與操作系統內核分開(kāi)。通過(guò)定義一個(gè)操作系統模擬層實(shí)現平臺無(wú)關(guān)性。操作系統模擬層屏蔽硬件上的差異和獲取操作系統提供統一的接口,如時(shí)鐘、過(guò)程同步以及信息傳遞機制等。對于特定的嵌入式操作系統,直接對操作系統模擬層相應部分進(jìn)行修改,以符合具體的要求。操作系統模擬層主要包括下面兩個(gè)部分:
⑴與處理器和編譯器有關(guān)
對不同微處理器的BYTE_ORDER存儲系統定義;對不同編譯器的數據類(lèi)型長(cháng)度的定義;與CPU或編譯器相關(guān)的內容的定義。
⑵與操作系統相關(guān)
協(xié)議棧進(jìn)程與應用程序進(jìn)程之間的同步與通訊,需要對信號量sys_sem_t、消息隊列sys_mbox_t和時(shí)鐘函數進(jìn)行定義和操作。
2.2協(xié)議棧的裁減
標準的TCP/IP協(xié)議棧功能復雜,代碼量大,且需大量的存儲器資源。為了滿(mǎn)足嵌入式應用,必須對RFC定義的協(xié)議棧進(jìn)行裁減[1]。本協(xié)議棧的實(shí)現作了如下裁減:
⑴IP模塊:不支持數據分片,不支持數據包轉發(fā),不支持IPv6移動(dòng)功能,不支持部分IPv6的擴展報頭。
⑵ICMPv6模塊:支持信息報文中的請求和應答報文,支持錯誤報文中的目的不可達和超時(shí)報文。
⑶鄰居發(fā)現模塊:支持地址解析、重復性探測,省略了路由功能。
⑷TCP模塊:支持多個(gè)連接,簡(jiǎn)化滑動(dòng)窗口,實(shí)現快速重傳、慢啟動(dòng)與擁塞避免算法的TCP可靠性機制;約減掉半關(guān)閉,緊急指針,大部分TCP選項等。
協(xié)議棧的層次結構如圖1所示。采用獨立于網(wǎng)絡(luò )層的方式,IPv4協(xié)議和IPv6協(xié)議分開(kāi)實(shí)現,條理清楚,易于裁減,同時(shí)不會(huì )增加太多代碼空間。
上層應用(HTTP)
TCP
ICMPv4ICMPv6
ARPIPv4IPv6
網(wǎng)絡(luò )驅動(dòng)
3協(xié)議棧的實(shí)現
3.1內存管理
內存管理主要是針對協(xié)議棧內部緩沖區的管理。為了勝任任意大小報文的處理,并且能夠達到比較高的處理效率,在這里定義了兩種緩沖區實(shí)現機制:固定長(cháng)度緩沖區(pbuf_pool)和變長(cháng)度緩沖區(pbuf_ram)。pbuf_pool主要適合于網(wǎng)絡(luò )設備驅動(dòng),存放從網(wǎng)卡接收的數據。 pbuf_ram根據數據的大小動(dòng)態(tài)的分配緩沖區,如協(xié)議的報頭空間。
在這里對存儲空間的申請做了一定改進(jìn)。由于發(fā)送數據時(shí)很難確定各層協(xié)議頭部需要多大的內存空間,特別是IPv6報文可以包含若干個(gè)擴展頭,所以只申請基本頭部的內存空間,在使用中動(dòng)態(tài)調整的可能性就會(huì )很大,使得系統的效率降低。在這里提出了一種優(yōu)化方法,根據局部性原理,通常情況下一個(gè)連接在局部時(shí)間范圍內需要網(wǎng)絡(luò )層提供相同功能的概率非常大,所以在該連接的TCP_PCB控制塊中增加一個(gè)變量num,用于記錄上次通信時(shí)IPv6協(xié)議頭所使用的字節數,并且此變量可以被網(wǎng)絡(luò )層的函數進(jìn)行修改。當傳輸層下次申請pbuf時(shí),就參考這個(gè)值。如果所需的存儲空間比此值大,就需重新申請能滿(mǎn)足要求的存儲空間,同時(shí)修改num的值,并作為下一次申請的參考。
3.2網(wǎng)絡(luò )接口的實(shí)現
網(wǎng)絡(luò )接口層在設計上主要考慮下面幾個(gè)目標:⑴向協(xié)議層提供一個(gè)統一的網(wǎng)絡(luò )通信接口,能夠將上層協(xié)議模塊與具體的網(wǎng)絡(luò )接口硬件隔離開(kāi)來(lái),以利于向不同操作系統的移植;⑵支持一個(gè)網(wǎng)絡(luò )接口配置多個(gè)IP地址的功能,因為IPv6一個(gè)接口的IP地址包括本地鏈路、本地站點(diǎn)和全局三類(lèi)地址;⑶支持多播報文的收發(fā),提供動(dòng)態(tài)的多播IP與多播MAC地址的映射服務(wù);⑷提供較好的通信性能等。
針對上述目標,設計了如下的網(wǎng)絡(luò )接口控制結構:
struct netif {
struct netif *next; /*指向下一個(gè)netif結構的指針*/
netif_ipaddr *iplist; /*指向接口的ip地址鏈的首指針*/
char name[2]; /*接口名稱(chēng)*/
err_t (* input)(struct pbuf *p, struct netif *); /*接口輸入函數指針*/
err_t (* output)(struct netif *, struct pbuf *p,netif_addr *); /*接口輸出函數指針*/
err_t (* linkoutput)(struct netif *, struct pbuf *p); /*鏈路層輸出函數指針*/
void *state; /*指向接口的狀態(tài)信息*/
mac_addr netifmacaddr; /*接口的MAC地址*/
netif_multi *multilist; /*本接口的MAC多播地址鏈首指針*/
┊ /*省略了部分信息 */
};
網(wǎng)絡(luò )接口層是協(xié)議棧與下層網(wǎng)絡(luò )設備驅動(dòng)程序之間的接口,同時(shí)支持IPv4報文和IPv6報文,通過(guò)判斷幀的類(lèi)型字段,把接收到的不同類(lèi)型的報文交給不同的協(xié)議模塊進(jìn)行處理。
評論