TAP/TUN

來源於: https://zhuanlan.zhihu.com/p/388742230

一、TAP/TUN 是什麼

在計算機網絡中,TUN 與 TAP 是操作系統內核中的虛擬網絡設備。不同於普通靠硬件網路板卡實現的設備,這些虛擬的網絡設備全部由軟件實現,並向運行於操作系統上的軟件提供與硬件的網絡設備完全相同的功能。 TAP 等同於一個以太網設備,它操作第二層數據包如以太網數據幀。TUN 模擬了網絡層設備,操作第三層數據包比如 IP 數據封包。

操作系統通過 TUN/TAP 設備向綁定該設備的用戶空間的程序發送數據,反之,用戶空間的程序也可以像操作硬件網絡設備那樣,通過 TUN/TAP 設備發送數據。在後種情況下,TUN/TAP 設備向操作系統的網絡棧投遞(或“注入”)數據包,從而模擬從外部接受數據的過程。

二、物理網卡收發數據的流程

在瞭解虛擬網卡設備之前,我們先來看一下物理網卡是怎麼工作的。​

物理網卡是這樣收發數據的: 收:外部網絡發送給主機的數據,通過物理網卡接收進來,並傳輸給內核協議棧處理 發:本地主機對外發送數據,將在內核協議棧中封裝好數據包,最終通過網卡將數據發送出去​

物理網卡,它的一端是內核空間的網絡協議棧,另一端是外界網絡,物理網卡就是連接這兩者,以01形式的比特流收發數據的硬件設備。

當用戶進程的數據要發送出去時,數據從用戶空間寫入內核的網絡協議棧,再從網絡協議棧傳輸到網卡,最後發送出去;當用戶進程等待外界響應數據時,數據從網卡流入,傳輸至內核的網絡協議棧,最後數據寫入用戶空間被用戶進程讀取。 在這些過程中,內核和用戶空間的數據傳輸,由內核佔用CPU來完成;內核和網卡之間的數據,傳輸由網卡的DMA來完成,不需要佔用過多的CPU。

三、虛擬網卡設備

物理網卡需要通過網卡驅動在內核中註冊後才能工作,它在內核網絡協議棧和外界網絡之間傳遞數據,用戶可以爲物理網卡配置網卡接口屬性,比如 IP 地址,這些屬性都配置在內核的網絡協議棧中。 內核也可以直接創建虛擬的網卡,只要爲虛擬網卡提供網卡驅動程序,使其在內核中可以註冊成爲網卡設備,它就可以工作。 相比於物理網卡負責內核網絡協議棧和外界網絡之間的數據傳輸,虛擬網卡的兩端則是內核網絡協議棧和用戶空間,它負責在內核網絡協議棧和用戶空間的程序之間傳遞數據:​

發送到虛擬網卡的數據來自於用戶空間,然後被內核讀取到網絡協議棧中;內核寫入虛擬網卡,準備通過該網卡發送的數據,目的地是用戶空間。

四、虛擬網卡和物理網卡的對比

與物理網卡對比一下,物理網卡是硬件設備,位於硬件層;虛擬網卡則可以看作是用戶空間的網卡。​

物理網卡和虛擬網卡唯一的不同點在於,物理網卡本身的硬件功能:物理網卡以比特流的方式傳輸數據。​

也就是說,內核會公平對待物理網卡和虛擬網卡,物理網卡能做的配置,虛擬網卡也能做。比如可以爲虛擬網卡接口配置IP地址、設置子網掩碼,可以將虛擬網卡接入網橋等等。​

只有在數據流經物理網卡和虛擬網卡的那一刻,纔會體現出它們的不同,即傳輸數據的方式不同:物理網卡以比特流的方式傳輸數據,虛擬網卡則直接在內存中拷貝數據(即,在內核之間和讀寫虛擬網卡的程序之間傳輸)。​

正因爲虛擬網卡不具備物理網卡以比特流方式傳輸數據的硬件功能,所以,絕不可能通過虛擬網卡向外界發送數據,外界數據也不可能直接發送到虛擬網卡上。能夠直接收發外界數據的,只能是物理設備。​

雖然虛擬網卡無法將數據傳輸到外界網絡,但卻:

•可以將數據傳輸到本機的另一個網卡(虛擬網卡或物理網卡)或其它虛擬設備(如虛擬交換機)上;•可以在用戶空間運行一個可讀寫虛擬網卡的程序,該程序可將流經虛擬網卡的數據包進行處理,比如OpenVPN 程序。

很多人會誤解這樣的用戶空間程序,認爲它們可以對數據進行封裝。比如認爲OpenVPN可以在數據包的基礎上再封裝一層隧道IP首部,但這種理解是錯的。​

一定請注意,用戶空間的程序是無法對數據包做任何封裝和解封操作的,所有的封裝和解封都只能由內核的網絡協議棧來完成。

使用OpenVPN之所以可以對數據再封裝一層隧道IP層,是因爲OpenVPN可以讀取已經封裝過一次IP首部的數據,並將包含IP首部的數據作爲普通數據通過虛擬網卡再次傳輸給內核。 因爲內核接收到的是來自虛擬網卡的數據,所以內核會將其當作普通數據(即應用層數據),從頭開始封裝(從四層封裝到二層封裝)。當數據從網絡協議棧流出時,就有了兩層IP首部的封裝。​

換句話說,每一次看似由用戶空間程序進行的額外封裝,都意味着數據要從內核空間到用戶空間,再到內核空間。以OpenVPN爲例:​

tcp/ip stack --> tun --> OpenVPN --> tcp/ip stack --> Phyical NIC

其中tun是OpenVPN創建的一個三層虛擬網卡,tun設備在用戶空間和內核空間之間傳遞數據。​

具體的 OpenVPN 數據封裝和數據流向的細節,參考更詳細的通過 OpenVPN 分析tun實現隧道的數據流程。​

五、TUN與TAP的區別

tun和tap都是虛擬網卡設備,但是:

tap比tun更接近於物理網卡,可以認爲,tap設備等價於去掉了硬件功能的物理網卡​

總結一下,虛擬網卡的兩個主要功能是:

•1.連接其它設備(虛擬網卡或物理網卡)和虛擬交換機(bridge)•2.提供用戶空間程序去收發虛擬網卡上的數據

基於這兩個功能,tap設備通常用來連接其它網絡設備(它更像網卡),tun設備通常用來結合用戶空間程序實現再次封裝。換句話說,tap設備通常接入到虛擬交換機(bridge)上作爲局域網的一個節點,tun設備通常用來實現三層的ip隧道。​

七、TUN 典型使用場景

典型使用場景爲 IP 隧道。 舉個例子,應用程序發送的數據,從 OpenVPN TUN 接口 tun0 接收,先進行加密處理,再發給物理網卡 eth0 發出去。 對端的 OpenVPN 客戶端從物理網卡 eth0 收到加密數據,通過 OpenVPN 進行解密處理之後,再經由 tun0 將數據轉發到應用程序。 也就是說,OpenVPN 就像是一個工作在虛擬接口 tun0 與物理接口 eth0 之間的代理,從而實現在物理網絡上構建一條加密隧道。

 

 

八、TAP 典型使用場景

TAP 接口的典型應用場景是在虛擬化網絡中。例如,我們通過KVM創建的多個 VM(虛擬機),以 LinuxBridge(橋接網絡)互通;實際上即是通過像 vnet0 這樣的 TAP 接口來接入 LinuxBridge 的。 在這種場景下,KVM程序 就是向 TAP 接口讀寫數據的用戶空間程序。當 VM0 向本機的 eth0 接口發送數據,KVM 會將數據發送到 TAP 接口 vnet0 ,再通過 LinuxBridge 將數據轉發到 vnet1 上。然後,KVM 將數據發送到 VM1 的 eth0 口。

 

 

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