999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

Linux下虛擬多網(wǎng)卡測試平臺的實現(xiàn)

2009-04-29 00:00:00鄒芳強,陶俊才
電腦知識與技術(shù) 2009年25期

摘要:研究了Linux網(wǎng)絡(luò)協(xié)議實現(xiàn)和網(wǎng)卡驅(qū)動的工作機制,通過重構(gòu)系統(tǒng)網(wǎng)絡(luò)通信模型,在鏈路層加入多個邏輯網(wǎng)卡,成功搭建了基于Linux的虛擬多網(wǎng)卡測試平臺。

關(guān)鍵詞:Linux通信;TCP/IP協(xié)議;虛擬技術(shù);性能測試;驅(qū)動編程

中圖分類號:TP393文獻標(biāo)識碼:A文章編號:1009-3044(2009)25-7284-03

Realization of the Virtual Multi- network Card Test Platform under Linux

ZOU Fang-qiang, TAO Jun-cai

(Data Processing Center of Nanchang University, Nanchang 330031, China)

Abstract: Studied the Linux network protocol and the working mechanism of network card, build a Linux-based virtual multi- network card test platform by restructuring system network traffic model and joined many logical network cards in the link level.

Key words: Linux communication; TCP / IP protocol; virtual technology; performance Testing; driver programming

隨著虛擬和網(wǎng)絡(luò)技術(shù)的不斷發(fā)展,虛擬網(wǎng)卡技術(shù)被廣泛應(yīng)用。虛擬網(wǎng)卡能夠很好地解決報文截獲技術(shù)中存在的被繞開和軟件沖突的問題[1];虛擬機軟件中也要使用虛擬網(wǎng)卡技術(shù)實現(xiàn)虛擬機內(nèi)系統(tǒng)和互聯(lián)網(wǎng)通信;虛擬專用網(wǎng)的實現(xiàn),通常也是使用虛擬網(wǎng)卡來讓同一臺主機注冊多個子網(wǎng)的IP;軟件開發(fā)過程中,虛擬網(wǎng)卡也被用做網(wǎng)絡(luò)數(shù)據(jù)源,測試軟件網(wǎng)絡(luò)數(shù)據(jù)處理性能。目前出現(xiàn)的虛擬網(wǎng)卡軟件要么靈活性差、使用不方便,要么滿足不了數(shù)量上的要求,憑借Linux系統(tǒng)優(yōu)良的網(wǎng)絡(luò)性能和內(nèi)核的易擴展性,本文實現(xiàn)一個簡潔、易于使用和部署的虛擬多網(wǎng)卡平臺。

1 Linux協(xié)議分析

Linux提供了對于當(dāng)前的TCP/IP協(xié)議的完整支持,Linux包括了IP防火墻代碼、IP防偽、IP服務(wù)質(zhì)量控制及許多安全特性,這些特性使得Linux被廣泛應(yīng)用于網(wǎng)絡(luò)服務(wù)器。開源特性使Linux在網(wǎng)絡(luò)性能能夠始終處在前列,良好的框架和統(tǒng)一的風(fēng)格,也讓他對新的通信協(xié)議的支持變得容易。協(xié)議結(jié)構(gòu)上,Linux基本采用了TCP/IP的四層邏輯結(jié)構(gòu),但并沒有拘泥于TCP/IP協(xié)議,如為了便于體現(xiàn)程序調(diào)用邏輯,內(nèi)核將ICPM、IGMP模塊與TCP、UDP放在同一個層次對待。Linux系統(tǒng)在網(wǎng)絡(luò)方面的優(yōu)秀表現(xiàn),也是本文最終在Linux上實現(xiàn)的主要原因,為了后面能清晰地說明問題,下面簡要介紹虛擬網(wǎng)卡實現(xiàn)中涉及到的Linux內(nèi)核網(wǎng)絡(luò)相關(guān)概念。

1.1 協(xié)議實現(xiàn)中的關(guān)鍵數(shù)據(jù)結(jié)構(gòu)

在網(wǎng)絡(luò)協(xié)議的實現(xiàn)中有幾個關(guān)鍵的數(shù)據(jù)結(jié)構(gòu),它們貫穿了整個協(xié)議的實現(xiàn),其中之一是對接收和發(fā)送的報文進行統(tǒng)一管理的緩沖區(qū)數(shù)據(jù)結(jié)構(gòu)——sk_buff。一個個單獨的sk_buff被組織成雙向鏈表的形式。sk_buff的強大功能在于它提供了眾多指針,可以快速地定位協(xié)議頭位置;它也同時保留了許多報文信息(如使用的網(wǎng)絡(luò)設(shè)備等),以便協(xié)議層根據(jù)需要靈活應(yīng)用。其中:Union h是傳輸層協(xié)議頭(tcp);Union nh是網(wǎng)絡(luò)層協(xié)議頭(ip);Union mac是鏈路層協(xié)議頭。

從應(yīng)用層到鏈路層,報文的生成始終離不開sk_buff,對報文的每次封裝其實就是在對sk_buff指向的緩沖區(qū)的操作,以下簡要介紹sk_buff的生命周期,當(dāng)一個數(shù)據(jù)包被網(wǎng)卡接收到后,網(wǎng)卡驅(qū)動就會申請一個sk_buff結(jié)構(gòu),然后將數(shù)據(jù)部分拷貝到sk_buff結(jié)構(gòu)里,并且將與鏈路層相關(guān)的信息設(shè)置好,交給網(wǎng)絡(luò)層處理。網(wǎng)絡(luò)層、傳輸層根據(jù)sk_buff的信息實現(xiàn)相應(yīng)協(xié)議。一般地,當(dāng)數(shù)據(jù)包被傳輸層的協(xié)議接收到后,Socket接口將sk_buff中的數(shù)據(jù)拷貝到應(yīng)用層的數(shù)據(jù)緩存區(qū),這時候sk_buff的生命就結(jié)束了,被釋放掉。當(dāng)應(yīng)用層發(fā)送數(shù)據(jù)時,也是在網(wǎng)絡(luò)協(xié)議族提供的接口函數(shù)里,申請一個sk_buff結(jié)構(gòu),將數(shù)據(jù)拷貝到這個結(jié)構(gòu)里。當(dāng)sk_buff結(jié)構(gòu)達到網(wǎng)卡驅(qū)動程序時,里面包含足夠二層路由信息,數(shù)據(jù)部分也是一個完整的數(shù)據(jù)包。

另一個關(guān)鍵數(shù)據(jù)結(jié)構(gòu)是用來描述邏輯網(wǎng)絡(luò)設(shè)備的net_device,該結(jié)構(gòu)主要描述了以下信息:檢索信息,設(shè)備的物理信息,接口類型,接口狀態(tài),各種對接口進行操作的函數(shù)指針,報文輸出隊列,二層地址信息,比結(jié)構(gòu)層高一次的協(xié)議指針。專著[2]中第十四章詳細來描述這個結(jié)構(gòu)。通常情況下一個net_device和一個網(wǎng)卡對應(yīng),系統(tǒng)中涉及到網(wǎng)卡的操作都通過調(diào)用這個結(jié)構(gòu)中的接口進行操作的函數(shù)指針進行。

1.2 報文的發(fā)送和接收過程

[3]報文在Linux操作系統(tǒng)內(nèi)核中的接收和發(fā)送都是基于sk_buffer數(shù)據(jù)結(jié)構(gòu)進行的。報文接收過程是:首先網(wǎng)絡(luò)設(shè)備接收到報文,為報文建立sk_buffer數(shù)據(jù)結(jié)構(gòu),然后將之放入backlog隊列,等待下一步處理。操作系統(tǒng)調(diào)度進行底層處理,將sk_buffer數(shù)據(jù)從backlog隊列取出,根據(jù)sk_buffer數(shù)據(jù)結(jié)構(gòu)中協(xié)議頭(即mac,nh,h)中的協(xié)議,調(diào)用相應(yīng)的網(wǎng)絡(luò)協(xié)議層進行進一步處理。一份報文可以被多個網(wǎng)絡(luò)協(xié)議處理。網(wǎng)絡(luò)協(xié)議都有一個初始化入口,每個協(xié)議提供自己的處理程序。Linux操作系統(tǒng)維護了兩個網(wǎng)絡(luò)協(xié)議表,一個是單向鏈表,其成員類型為ptype_all,提供給用戶,用戶可以定義自己對報文進行處理的網(wǎng)絡(luò)協(xié)議;另一個是hash表,其成員類型是ptype_base,包括Linux操作系統(tǒng)中標(biāo)準的網(wǎng)絡(luò)協(xié)議,如 IP、TCP等。網(wǎng)絡(luò)各協(xié)議屋處理后,將報文提交給Socket隊列,等待應(yīng)用程序的處理。

數(shù)據(jù)報文的發(fā)送過程與之相反,首先應(yīng)用程序?qū)?shù)據(jù)放入Socket隊列,然后網(wǎng)絡(luò)協(xié)議層將數(shù)據(jù)從Socket隊列取出,為之建立相應(yīng)的sk_buffe數(shù)據(jù)結(jié)構(gòu),各網(wǎng)絡(luò)協(xié)議層分別填寫sk_buffer中各自的協(xié)議頭,最后將sk_buffer放入發(fā)送隊列,等待操作系統(tǒng)調(diào)度網(wǎng)絡(luò)設(shè)備驅(qū)動程序,發(fā)送報文。

從函數(shù)調(diào)用的角度分析,在發(fā)送數(shù)據(jù)時,socket被實現(xiàn)為一個文件系統(tǒng),這樣可以通過vfs的write來調(diào)用,也可以直接使用send來調(diào)用,它們最終都是調(diào)用sock_sendmsg。sock_sendmsg通過它的內(nèi)核版本——sock_sendmsg直接調(diào)用tcp_sendmsg來發(fā)送數(shù)據(jù)。在tcp_sendmsg中,同時完成數(shù)據(jù)復(fù)制和數(shù)據(jù)校驗。Linux使用skb結(jié)構(gòu)來管理數(shù)據(jù)緩沖。當(dāng)復(fù)制完數(shù)據(jù)后,使用tcp_push來進行發(fā)送。tcp_push通過一tcp_push_pending_frames調(diào)用tcp_write_xmit將數(shù)據(jù)填人top的發(fā)送緩沖區(qū)。這里的填充僅是指針引用而已。下一步,tcp_transmit_skb將數(shù)據(jù)放人ip的發(fā)送隊列。Ip_queue_xmit函數(shù)完成IP包頭的設(shè)置以及數(shù)據(jù)效驗,并調(diào)用ip_output進入下一步發(fā)送。如果不用分片,將使用ip_finish_output繼續(xù)發(fā)送。在這里,將檢查硬件頭部描述符(這里就是以太網(wǎng)包頭)并填充人數(shù)據(jù)緩沖區(qū),而后調(diào)用dev_queue_xmit函數(shù)來進一步處理。Dev_queue_xmit函數(shù)將數(shù)據(jù)排隊放人硬件緩沖區(qū)以等待隨后的發(fā)送。而使用具體的網(wǎng)卡驅(qū)動動程序cp_start_xmit 來完成數(shù)據(jù)的最終發(fā)送。最后的cp_start_xmit做的事情是檢查數(shù)據(jù),并將其復(fù)制進硬件緩沖。

當(dāng)接收到一個數(shù)據(jù)包的時候,網(wǎng)卡會產(chǎn)生中斷,這樣網(wǎng)卡驅(qū)動的cp_interrupt會被調(diào)用。cp_interrupt做的事情很少,只進行必要的檢查后就返回了,更多的事情通過cp_rx_poll來完成,這是因為linux驅(qū)動分為上半部和下半部,下半部的cp_rx_poll函數(shù)在軟中斷中被調(diào)用,這樣做是為了提高驅(qū)動的處理效率。cp_rx_poll做的事情主要就是申請并將數(shù)據(jù)復(fù)制進一個skb緩沖中。netif_rx函數(shù)將數(shù)據(jù)從這個隊列中轉(zhuǎn)移至網(wǎng)絡(luò)核心層隊列中,netif_receive_skb從這里接收數(shù)據(jù),并調(diào)用ip_rcv來處理。Ip_rcv和ip_rcv_finish一起檢查數(shù)據(jù)包,得到包的路由,并調(diào)用相應(yīng)的input函數(shù)來完成路由,在這里就是ip_rcv_finish一起檢查數(shù)據(jù)包,得到包的路由,并調(diào)用相應(yīng)的input函數(shù)來完成路由,在這里就是ip_local_deliver,ip_local_deliver完成IP包的重組,而后將使用ip_local_deliver_sinish來進入TCP的處理流程,tcp_v4_do_rcv先判斷是否正常的用戶數(shù)據(jù),如果是則用tcp_rcv_cstabUshde處理,否則用tcp_rcv_state_process來更新本條TCP連接的狀態(tài)機。在top ircv_cstablished中同樣實現(xiàn)有首部預(yù)測。如果一切順利,將喚醒等待在top_recvmsg中的用戶進程。后者將數(shù)據(jù)從skb緩沖中復(fù)制進用戶進程緩沖。

2 結(jié)構(gòu)設(shè)計和實現(xiàn)

首先在TCP/IP協(xié)議的鏈路層創(chuàng)建存儲在Hash表中多個net_device,然后將它們注冊到系統(tǒng),這些net_device的底層被綁定到實際存在的網(wǎng)卡上,這樣報文的最終發(fā)送還是通過被綁定的物理網(wǎng)卡,只是在報文的設(shè)置和傳輸途徑上用另外的方法來實現(xiàn)。虛擬網(wǎng)卡的通信原理如下,首先將網(wǎng)卡被設(shè)定為混雜模式,接收數(shù)據(jù)時,由于每個net_device有自己的MAC地址和IP,且系統(tǒng)上層要先通過net_device與下層交互,這樣系統(tǒng)應(yīng)用層以為系統(tǒng)中存在多塊網(wǎng)卡,而機器間是通過IP來通信的,外面的機器也會認為是在與多個不同的網(wǎng)卡通信。內(nèi)核加載了虛擬網(wǎng)卡模塊后,報文的發(fā)送和接收過程將比以前復(fù)雜,處理好虛擬網(wǎng)卡報文的發(fā)送和接收是會影響到整個系統(tǒng)的性能,也是成敗的關(guān)鍵。以下詳細說明虛擬網(wǎng)卡報文的發(fā)送和接收過程。

2.1 加載虛擬網(wǎng)卡模塊前后報文接收過程

首先將虛擬的網(wǎng)卡綁定到一塊物理網(wǎng)卡上,我們稱被綁定的網(wǎng)卡為“宿主”網(wǎng)卡,虛擬的網(wǎng)卡為從屬的網(wǎng)卡。為了使虛擬的網(wǎng)卡正常工作,首先要將宿主網(wǎng)卡設(shè)置為混雜模式,使用”ifconfig eth0 promisc”可以達到效果。宿主網(wǎng)卡設(shè)置為混雜模式后,就可以接受目的MAC為任何地址的以太報文了。

如圖1左半部分所示,宿主網(wǎng)卡接收到一個報文后,按照正常的流程調(diào)用netif_rx()函數(shù)將報文加入softnet_data[].input_pkt_queue隊列。NET類型的軟件中斷被調(diào)度時,通過net_rx_action()函數(shù)將報文分發(fā)給各個協(xié)議模塊處理。其中報文分發(fā)時有ptype_all、ptype_base兩種方式,ptype_all為處理所有類型的報文接口(如AF_PACKET),ptype_base為處理特定類型的報文接口(如ARP、IP等),虛擬網(wǎng)卡通過dev_add_pack()注冊一個ptype_all接受任何從宿主網(wǎng)卡發(fā)關(guān)過來的報文。

所以宿主網(wǎng)卡接受到的報文都會到達虛擬網(wǎng)卡,相等于在一個總線型的網(wǎng)絡(luò)環(huán)境里,每臺計算機都收到網(wǎng)絡(luò)里傳遞的每個報文。接下來做的事情就是判斷哪些報文是“屬于虛擬網(wǎng)卡的”,哪些報文不是。

當(dāng)收到一個報文時,需要斷定哪些報文屬于哪塊虛擬網(wǎng)卡,所以在驅(qū)動程序里實現(xiàn)了一個HASH算法。

算法為:Index=Hash(報文的目的MAC)

如果查到的索引為有效值,則將報文skb的dev屬性修改為這個虛擬網(wǎng)卡的地址。然后再次調(diào)用netif_rx()函數(shù)將報文加入softnet_data[]input_pkt_queue隊列。

這樣做還有一個問題,就是會引起死循環(huán),虛擬網(wǎng)卡自己發(fā)送的中斷的機制并不會死機,只會降低系統(tǒng)的速度而已。所以在接受函數(shù)里,還要判斷skb的dev屬性不能為虛擬網(wǎng)卡集的地址,如果是就丟棄。為了不影響其它真實的網(wǎng)卡,處理宿主網(wǎng)卡的報文外,其它報文也不與處理。

另外對于廣播、多播報文,無需查找虛擬網(wǎng)卡,按個復(fù)制、修改skb的dev屬性即可。

2.2 加載虛擬網(wǎng)卡模塊前后報文發(fā)送過程

按照正常的發(fā)送流程上層將報文放入output隊列,然后數(shù)據(jù)被拷貝到物理網(wǎng)卡緩存,最終由網(wǎng)卡發(fā)送到網(wǎng)絡(luò),添加虛擬網(wǎng)卡后,加載模塊判斷提出來是否來自虛擬網(wǎng)卡,是則將報文skb的dev修改成宿主dev的地址,然后再次dev_queue_xmit將會被宿主網(wǎng)卡發(fā)送出去。

3 結(jié)束語

本文實現(xiàn)的虛擬網(wǎng)卡能夠在Linux操作系統(tǒng)下穩(wěn)定運行,和物理網(wǎng)卡一樣擁有獨立的IP和MAC地址,并且能夠?qū)ΤS玫木W(wǎng)絡(luò)命令做出正確響應(yīng),最多支持1024塊虛擬網(wǎng)卡使其能夠滿足大多數(shù)網(wǎng)絡(luò)測試下的要求,只是隨著虛擬網(wǎng)卡數(shù)量的增加,為所有網(wǎng)卡分配IP和MAC地址會占用較長的時間。

參考文獻:

[1] 李之棠,何桂麗,王美珍.基于虛擬網(wǎng)卡的SSL VPN體系結(jié)構(gòu)的研究[J].計算機應(yīng)用研究,2007,24(12):327-329.

[2] 胡順增,楊偉國.Linux設(shè)備驅(qū)動程序[M].北京:中國電力出版社,2000.

[3] 楊立光,王巍,舒國強,等.基于Linux網(wǎng)絡(luò)協(xié)議的IP報文分流系統(tǒng)[J].計算機工程,2004,30(12):43-44.

主站蜘蛛池模板: 香蕉在线视频网站| 尤物亚洲最大AV无码网站| 国产无码高清视频不卡| 亚洲第一黄片大全| 在线国产综合一区二区三区 | 国产精品原创不卡在线| 亚洲色图欧美一区| 国产乱人视频免费观看| 日韩精品一区二区三区中文无码| 久久这里只有精品2| 欧美.成人.综合在线| 日韩在线第三页| 国产丝袜啪啪| 国产视频大全| 国产玖玖视频| 91九色最新地址| 综合色88| 久久这里只有精品23| 日本欧美精品| 91小视频版在线观看www| 日本一区二区三区精品视频| 少妇精品久久久一区二区三区| 亚洲精品成人7777在线观看| 欧美精品1区| 国产农村妇女精品一二区| 精品国产Av电影无码久久久| 六月婷婷综合| 91热爆在线| www.99在线观看| 日韩av电影一区二区三区四区 | 小13箩利洗澡无码视频免费网站| 波多野结衣久久高清免费| 福利在线一区| 成人午夜精品一级毛片| 99久久精彩视频| 国产精女同一区二区三区久| 青青青国产精品国产精品美女| 欧美伊人色综合久久天天| 91精品专区国产盗摄| 成AV人片一区二区三区久久| 国产噜噜在线视频观看| 国产啪在线| 日韩精品免费一线在线观看| 最新痴汉在线无码AV| 久久综合伊人 六十路| 国产精品无码一区二区桃花视频| 亚洲国产成人麻豆精品| 国产情精品嫩草影院88av| 日韩久久精品无码aV| 亚洲AV色香蕉一区二区| 免费在线观看av| 高清无码手机在线观看| 午夜国产小视频| 网友自拍视频精品区| 精品国产香蕉伊思人在线| 国产精品午夜福利麻豆| 久久国产乱子伦视频无卡顿| 亚洲精品国产成人7777| 精品久久高清| 丝袜美女被出水视频一区| 亚洲三级成人| JIZZ亚洲国产| 久久久久亚洲Av片无码观看| 亚洲最大福利视频网| 五月综合色婷婷| 国产人人干| 色综合天天视频在线观看| 中文字幕在线一区二区在线| 先锋资源久久| yjizz国产在线视频网| 谁有在线观看日韩亚洲最新视频| 欧美色综合久久| 久久精品亚洲专区| 国产手机在线观看| 亚洲免费三区| 中国国产一级毛片| 国产成人久久综合一区| 91成人精品视频| 亚洲欧美不卡| 国产在线98福利播放视频免费| 福利在线不卡一区| 国产手机在线小视频免费观看|