一.實現
在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中,隧道的實現主要基於兩個檔案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...