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

一.實現

Linux中,隧道的實現主要基於兩個文件new_tunnel.cipip.c

同時Linux定義了一種新的協議類型--IPIPIPPROTO_IPIP),與上面所說封包類型類似。


基本思路
LinuxIP 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頭,恢復原數據包是它分內的事,但在它解出數據包(即原完整的協議數據包)後,它把這個包放入相應的協議接收隊列。這種事可不是一個上層協議乾的,這是網絡設備中斷接收程序的義務。看到了,在這點上,它好象到了數據鏈路層。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章