一.實現 在
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...