日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

Linux中IP隧道的分析與建議( 二 )



/;;;;子網(wǎng)A;;;;;;;/;;;子網(wǎng)C;

//;;;

|;;|;;;;;;|;;;;;;;|

|;;;;;&;;;;|;;;;;;|;;;;;;;|

|;;;;; ;;;;;;;|;;;;;;|;;;;;;*****;;;;|

|;;;;;;;; ;;;;|;;;;;;|;;;;;;*;;;*;;;;|

|;;;;; ;;;;|;;;;;;|;;*****;;;*;;;;|

;;;/;;-----------;;;*;;;;;;;*;;;;/;;----------

>;#;*;**>(#);*;;;;;;;***>;#;;;;;

--------------;;/;**;;;;------------;;/;;;

|;;**;;;|;;;;;;|;;;; ;|

|;;**;;;|;;;;;;|;;;; ;|

|;;*****;;;;*;;;|;;;;;;|;;;;;;;|

|;;;;;;*****;;;;|;;;;;;|;;V;;;|

|;;;;;;;|;;;;;;|;;&;;;|

/;;;;;/

子網(wǎng)B;;;/;;;;子網(wǎng)D;;;;/

-----------;;;;----------



;;;;;;;原數(shù)據(jù)報

******;;;;;;;封裝后的數(shù)據(jù)包(封包)

#;;;;封裝/解封

&;;;;用戶主機



圖一.;;封包協(xié)議實現(xiàn)模型





看圖中的設(shè)備;# , 分別處于隧道的兩端 , 分別起打包(封裝)和解包(解封)

的作用 , 在整個數(shù)據(jù)包的傳送路徑中 , 除了隧道兩端的;#;設(shè)備 , 其他網(wǎng)關(guān)把

數(shù)據(jù)包看成一個普通的IP包進(jìn)行轉(zhuǎn)發(fā) 。

設(shè)備;#;就是一個封包基于的兩個實現(xiàn)部件--封裝部件和解封部件 。封裝和解封

部件(設(shè)備)都應(yīng)當(dāng)同時屬于兩個子網(wǎng) 。封裝部件對接收到的數(shù)據(jù)報加上封包頭

, 然后以解封部件地址作為目的地址轉(zhuǎn)發(fā)出去;而解封部件則在收到封包后 , 還

原原數(shù)據(jù)報 , 轉(zhuǎn)發(fā)到目的子網(wǎng) 。



隧道的源端(封裝部件)對進(jìn)入隧道的數(shù)據(jù)包進(jìn)行封裝 , 形成封包 。一個完整

的封包如圖二所示 。



/;; -----------------

|;;|;;;;封包IP頭;;;;;|;

封包頭;;;|;; -----------------

|;;|;;;封包協(xié)議頭;;;;|

-----------------

/;;|;;;;原協(xié)議頭;;;;;|;

|;; -----------------

|;;|;|

原數(shù)據(jù)報;;|;;|;;;原協(xié)議數(shù)據(jù);;;;|;

|;;.;.

|;;.;.

|;;|;|

-----------------



圖二.;;;;;;封包結(jié)構(gòu)







二、

Linux中的實現(xiàn)



本人分析的版本是Linux2.0.34(RedHat5.2采用) 。



在Linux中 , 隧道的實現(xiàn)主要基于兩個文件new_tunnel.c和ipip.c



同時Linux定義了一種新的協(xié)議類型--IPIP(IPPROTO_IPIP) , 與上面所說封包

類型類似 。



基本思路

在Linux中IP;Tunnel的實現(xiàn)也分為兩個部件:封裝部件和解封部件 , 分別司職發(fā)送和接

收 。但這兩個部分是在不同的層次以不同的方式實現(xiàn)的 。

封裝部件是在數(shù)據(jù)鏈路層以虛設(shè)備的方式實現(xiàn) 。所有源代碼見

/usr/src/linux/drivers/net/new_tunnel.c

為實現(xiàn)封裝 , Linux實現(xiàn)一個稱為tunl的網(wǎng)絡(luò)設(shè)備(類似loopback設(shè)備) , 此設(shè)備

具有其他網(wǎng)絡(luò)設(shè)備共有的特征 , 對于使用此設(shè)備的上層應(yīng)用來說 , 對這些網(wǎng)絡(luò)設(shè)備

不加區(qū)分 , 調(diào)用及處理方法當(dāng)然也完全一樣 。

tunnel_init()和tunnel_xmit()是new_tunnel.c中的兩個主要過程 。

tunnel_init()初始化與設(shè)備tunl相關(guān)的device結(jié)構(gòu) 。

而tunnel_xmit()在從tunl設(shè)備發(fā)送數(shù)據(jù)時被調(diào)用 , tunl設(shè)備作為實現(xiàn)IP隧道

技術(shù)的封裝部分 , 在此過程中完成對相應(yīng)的數(shù)據(jù)報進(jìn)行封裝所需的全部操作 ,

形成IPIP類型的IP包 , 并重新轉(zhuǎn)發(fā)此數(shù)據(jù)包(ip_forward()) 。

解封部件在IP的上層實現(xiàn) , 系統(tǒng)把它作為一個虛的傳輸層(實際上與傳輸層毫無

關(guān)系) , 具體處理見文件

/usr/src/linux/net/ipv4/ipip.c 。

我們知道 , 每一個IP數(shù)據(jù)包均交由ip_rcv函數(shù)處理 , 在進(jìn)行一些必要的判斷后 , ip_rcv

對于發(fā)送給本機的數(shù)據(jù)包將交給上層處理程序 。對于IPIP包來說 , 其處理函數(shù)是

ipip_rcv(就如TCP包的處理函數(shù)是tcp_rcv一樣 , IP層不加區(qū)分) 。也就是說 , 當(dāng)

推薦閱讀