linux中ip tunnel的實現及協議簡介

2021-07-03 08:28:41 字數 1877 閱讀 4419

一.實現 在

linux

中,隧道的實現主要基於兩個檔案

new_tunnel.c

和ipip.c

同時

linux

定義了一種新的協議型別

--ipip

(ipproto_ipip

),與上面所說封包型別類似。

基本思路在

linux

中ip tunnel

的實現也分為兩個部件:封裝部件和解封部件,分別司職傳送和接收。但這兩個部分是在不同的層次以不同的方式實現的。封裝部件是在資料鏈路層以虛裝置的方式實現。所有源**見

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

為實現封裝,

linux

實現乙個稱為

tunl

的網路裝置(類似

loopback

裝置),此裝置具有其他網路裝置共有的特徵,對於使用此裝置的上層應用來說,對這些網路裝置不加區分,呼叫及處理方法當然也完全一樣。

tunnel_init()

和tunnel_xmit()

是new_tunnel.c

中的兩個主要過程。

tunnel_init()

初始化與裝置

tunl

相關的device

結構。

而tunnel_xmit()

在從tunl

裝置傳送資料時被呼叫,

tunl

裝置作為實現

ip隧道技術的封裝部分,在此過程中完成對相應的資料報進行封裝所需的全部操作,形成

ipip

型別的ip

包,並重新**此資料報(

ip_forward()

)。

解碼器在

ip的上層實現,系統把它作為乙個虛的傳輸層(實際上與傳輸層毫無關係),具體處理見檔案

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

我們知道,每乙個

ip資料報均交由

ip_rcv

函式處理,在進行一些必要的判斷後,

ip_rcv

對於傳送給本機的資料報將交給上層處理程式。對於

ipip

包來說,其處理函式是

ipip_rcv

(就如tcp

包的處理函式是

tcp_rcv

一樣,ip

層不加區分)。也就是說,當乙個目的位址為本機的封包到達後,

ip_rcv

函式進行一些基本檢查並除去

ip頭,然後交由

ipip_rcv

解封。ipip_rcv

所做的工作就是去掉封包頭,還原資料報,然後把還原後的資料報放入相應的接收佇列(

netif_rx()

)。

從以上ip tunnel

實現的思想來看,思路十分清晰,但由於

ip tunnel

的特殊性,其實現的層次並不單純。實際上,它的封裝和解封部件不能簡單地象上面所說的那樣分層。

tunl

裝置雖應算進鏈路層,但其傳送程式中做了更多的工作,如製作

ipip

頭及新的

ip頭(這些一般認為是傳輸層或網路層的工作),呼叫

ip_forward

**新包也不是乙個網路裝置應當做的事。可以說,

tunl

借網路裝置之名,一把抓幹了不少工作,真是『高效

』。而解封部件巨集觀上看在網路層之上,解出

ipip

頭,恢復原資料報是它分內的事,但在它解出資料報(即原完整的協議資料報)後,它把這個包放入相應的協議接收佇列。這種事可不是乙個上層協議幹的,這是網路裝置中斷接收程式的義務。看到了,在這點上,它好象到了資料鏈路層。

linux中ip tunnel的實現及協議簡介

一.實現 在linux中,隧道的實現主要基於兩個檔案new tunnel.c和ipip.c 同時linux定義了一種新的協議型別 ipip ipproto ipip 與上面所說封包型別類似。基本思路 在linux中ip tunnel的實現也分為兩個部件 封裝部件和解封部件,分別司職傳送和接收。但這兩...

Linux中的時鐘概念Linux中的時鐘概念

linux的時鐘中斷中涉及至二個全域性變數乙個是xtime,另乙個則是jiffies。有乙個與時間有關的時鐘 實時時鐘 rtc 這是乙個硬體時鐘,用來持久存放系統時間,系統關閉後靠主機板上的微型電池保持計時。系統啟動時,核心 通過讀取rtc來初始化wall time,並存放在xtime變數中,即xt...

Linux 中 的程序

1.fork 與vfork 的區別 vfork 使用中父子程序共享虛擬記憶體空間,fork 則不是 vfork保證子程序先執行 而fork的父子程序執行順序是不定的,它取決於核心的排程演算法 example 1 include include include int main else printf...