qemu網路虛擬化之資料流向分析一

2022-03-19 02:50:44 字數 2500 閱讀 1748

插曲:

今天下午欣喜的想寫點關於qemu網路部分的功能,但是中途出現了點小插曲,電腦被某人搞得宕機了,並且文章也沒有儲存。結果,,,就只能重新寫了!!所以這裡強烈建議開發團隊提供自動儲存的功能!

言歸正傳,前段時間自己寫過關於linux 內部網橋的實現原理以及資料報從物理網絡卡到達linux網橋進行**,再到tap裝置的流程。從qemu網路虛擬化整體框架來看,這部分只能算是前端,就像是資料到達了交換機,還沒有從交換機到達具體客戶機。這麼比喻也不是很貼切,因為linux網橋就好比乙個交換機了,但是這麼說大題上也不傷大雅。今天主要分析下資料是如何經過qemu到達客戶機的。

這部分內容準備分成兩部分,第一部分介紹主要的資料結構以及資料結構之間的關係,第二部分結合源**分析其具體實現。

下面看涉及到的主要資料結構:

1

struct

netclientstate ;

首先要說的是乙個叫做netclientinfo的結構,它並不對應於具體的實體,而在筆者看來倒像是乙個邏輯點,hub和nic,hub和tap都是通過此結構聯絡的,所以先介紹這個結構,其中的peer指標就指向對等實體的netclientstate結構,incoming_queue就是該點的接收資料的佇列,在傳送資料的時候要判斷對端的incoming_queues是否可用,可用才可以傳送資料。其他的字段這裡暫時忽略。queue_index好像和網絡卡的多佇列特性相關,暫時不太清楚。next作為乙個節點加入到全域性的net client鍊錶中。

1

struct

nethub ;

nethub結構,這裡就表示乙個hub,實體名字為集線器,其功能就是把收到的資料報從接收埠之外的所有埠**出去,qemu內部的vlan就是通過這個hub實現的,hub id就表示vlan id,num_port是埠的數量,乙個hub下的所有埠通過port連線起來,ports是煉表頭。

1 typedef struct

nethubport nethubport;

nethubport代表乙個hub中的乙個埠,netclientstate表示本埠的邏輯連線點,是乙個內嵌結構(非指標),next指向下乙個port,hub 指向所屬的hub物件。

1

struct

nicinfo ;

nicinfo代表乙個虛擬網絡卡,也就是和客戶機相關的,這裡姑且稱之為客戶端,通過nicinfo中的netdev指標,nicinfo和hub ports相連線。qemu中有乙個全域性的陣列來表示nicinfo的空間

nicinfo nd_table[max_nics];.

1 typedef struct

nicstate nicstate;

這是和虛擬網絡卡相關的乙個結構,ncs被初始化成乙個指標指向乙個netclientstate陣列,conf指向網絡卡對應的nicconf結構,該結構記錄了網絡卡的硬體資訊,其中有個重要的peers,是乙個內嵌結構,結合下面的結構展示,peers->ncs是乙個指向netclientstate陣列的指標,該結構的初始化時在最初根據命令列引數設定的,在網絡卡初始化的時候前面兩個陣列正好作為兩個邏輯點需要其中的對應項建立關聯。其實nicstate 的ncs指向的陣列項應該是1,這裡的項數是根據nicconf中的queues確定的,而queues在nicconf初始化的時候並沒有被設定,筆者猜想這裡應該預設被初始化成0了。

1 typedef struct

nicconf nicconf;

這是網絡卡的配置結構,各個欄位的意義根據名稱就顯露無疑。macaddr為網絡卡的物理mac,peers指向乙個nicpeers,該結構記錄了對等的netclientstate結構陣列,queues記錄了網絡卡的佇列個數。

1 typedef struct

nicpeers nicpeers;

1 typedef struct

tapstate tapstate;

tapstate代表乙個tap裝置,資料從linux埠出來傳送給tap裝置,而使用者程式需要從tap裝置讀寫資料(對應於實際意義上的接收和傳送),tapstate結構和nethubports結構一樣,都內嵌了netclentstate結構。tap裝置和hub就是通過這兩個netclentstate相關聯。

而關於hub和網絡卡nic的關聯,雖然有些博文也提到了,但是筆者總感覺說的有些含糊,並且經過筆者自己分析**,這部分也不是很清楚,所以這部分內容具體就留在下篇結合源**在說,對這塊內容熟悉的朋友也希望多多指點,大家一起學習!

nethub和nethubport關係圖:

tapstate和nethubport 關係圖:

網路虛擬化之FlowVisor 網路虛擬層(下)

在前面兩篇文章 網路虛擬化之flowvisor 網路虛擬層 上 和網路虛擬化之flowvisor 網路虛擬層 中 中分別介紹了flowvisor的特性和實現,三 的最後一篇介紹虛擬網路的隔離機制。虛擬化的乙個重要元素是切片之間的隔離,因為不同資源的隔離機制是不相同的,接下來將分別描述。1.頻寬隔離 ...

網路虛擬化之FlowVisor 網路虛擬層(上)

概念解釋 切片 虛擬網路的乙個例項 一.網路虛擬化 虛擬網路 人類社會的發展在很大方面得益於自然界,飛機受益於鳥,雷達受益於蝙蝠等等,所以專門有個學科為仿生學就是研究和模仿生物的特殊本質,利用生物的結構和功能原理來研製機械或各種新技術的科學技術。而人類社會已經發展了這麼多年,沉澱了很多可以和自然界相...

網路虛擬化之linux虛擬網路基礎

在linux裡面devic 裝置 與傳統網路概念裡的物理裝置 如交換機 路由器 不同,linux所說的裝置,其背後指的是乙個類似於資料結構 核心模組或裝置驅動這樣的含義。就是說device可能只是軟體系統裡的乙個驅動,乙個函式介面。tap位於二層資料鏈路層,tun位於三層網路層,兩者在linux裡的...