摘 要:介紹了基于Libpcap和BPF包過濾器進行軟件抓包的原理;針對局域網環境,在不使用專門的硬件設備前提下,設計并實現了基于Libpcap進行數據采集的流量測量系統。系統中區分了國際國內的流量,方便網絡管理員進行流量控制和計費。最后,考慮了不同局域網環境下的部署問題。
關鍵詞:網絡測量;流量測量;Libpcap;BPF
中圖法分類號:TP393.06 文獻標識碼:A 文章編號:1001-3695(2006)10-0219-04
Design and Implementation of Traffic Flow Measurement Infrastructure Based on Libpcap
LI Ruolin,WANG Jinyi,TAO Zhiyong,CHEN Qi,NAN Kai,YAN Baoping
(Center of Computer Network Information, Chinese Academy of Sciences, Beijing 100080, China)
Abstract:In this paper, the principles of packet capture based on Libpcap and BPF are introduced at the beginning. Then, the design and implementation of a traffic flow measurement system without additional hardware devices are described. In this system, the international traffic flow and national traffic flow are differentiated making the traffic and fee control easier. The deployment of the system in different LAN environments is explained in the end.
Key words:Network Measurement;Traffic Flow Measurement;Libpcap;BPF
經過幾十年的發展,計算機網絡廣泛應用于科研、教育、國防、工業、商業等領域。電子商務、電子政務、網上銀行、視頻傳輸、VoIP(Voice over IP)、基于網絡的大規模計算和數據存儲等應用,在安全、性能、QoS(Quality of Service)等方面對網絡提出了不同的需求。要滿足這些需求,首先就要了解網絡的行為,進而才能對它進行控制和優化。網絡測量就是這樣一個研究領域,它通過采集、分析網絡上節點和鏈路的相關數據,了解網絡的行為特征,是對網絡進行規劃建設和優化改造的基礎。網絡測量的研究方向包括流量特征、網絡拓撲、性能評價、路由選擇、故障診斷、協議排錯等[1]。
網絡測量不但有廣闊的工程應用前景,也有很高的學術價值,因此,國內外許多科研機構和學術組織均在進行網絡測量方面的研究。
IETF[2](Internet Engineering Task Force,互聯網工程任務組)專門成立了ITRACE(ICMP Traceback,ICMP追蹤),IPPM(IP Performance Metrics,IP性能測量),TEWG(Internet Traffic Engineering Working Group,互聯網流量工程工作組)等工作組,進行相關理論的研究。
依托于加州大學圣迭戈分校超級計算中心的研究組織CAIDA[3](Cooperative Association for Internet Data Analysis,互聯網數據分析協會)主要進行維護互聯網健壯性、可擴展性方面的研究。其開發了CoralReef,GTrace,Walrus,Skitter等性能、拓撲測量以及數據可視化的工具。其中,Skitter收集了超過一百萬個IP地址、兩百多萬條鏈路的相關數據,以圖形方式顯示了全球互聯網自治系統間連接的拓撲結構,在同類研究中處于領先地位。
NSF(National Science Foundation,美國科學基金會)資助的NLANR[4](National Laboratory for Applied Network Research,應用網絡研究國家實驗室)主要進行高性能的網絡性能分析,發現并定位由網絡故障、瓶頸、不兼容引起的問題等。NLANR建設了全球最大的測量系統NAI(Network Analysis Infrastructure)。其中的PMA(Passive Measurement and Analysis,被動測量分析)項目目前可以測量速率OC3~OC48線路的流量情況,下一步的目標是能測量更高速率的OC192線路;NAI的另一個項目AMP(Active Measurement Project,主動測量項目)在美國建立了150多個測量點,通過主動發包來得到測量點之間線路的RTT、丟包率、拓撲結構、吞吐量等。
另外,ATT,UC Berkeley,DARPA;國內的國防科技大學、哈爾濱工業大學等也在進行相關領域的研究。
目前國內外在網絡測量方面的研究取得了很多成果,為網絡設備生產商、ISP、網絡管理員在網絡的建設運營維護等方面提供了很多幫助。但這些研究項目大多是面向廣域骨干網的拓撲測量和性能測量。為了滿足局域網內普通用戶了解自己的流量使用情況的需求,我們設計開發了針對局域網的流量測量系統,該系統也為網絡管理員進行流量管理和計費提供了方便。
1 相關概念和技術介紹
1.1 主動測量和被動測量
根據測量方法的不同,網絡測量[5]可以分為主動測量和被動測量。主動測量是通過向被測網絡中發送數據包,觀察其所發送的數據包的行為特征,如RTT(RoundTrip Time)和丟包率等,來了解網絡的特征。前面提到的NLANR的AMP就是一個典型的主動測量系統;CAIDA的Skitter也屬于用主動測量的方法來測量網絡拓撲;由Berkeley和IBM共同開發的SPAND(Shared Passive Network Discovery)通過發送UDP和TCP分組讓客戶機向服務器報告鏈路性能,因此也屬于主動測量。被動測量是在網絡中部署測量點,通過收集流經測量點的數據包信息,來了解網絡的行為特征。前面提到的NLANR的PMA項目就是用被動測量的方法來檢測鏈路流量;許多的Sniffer工具也屬于用被動的方法來獲得網絡信息。主動測量和被動測量各有優缺點。主動測量的優點是可以測量的范圍比較大,而且易于了解端到端的行為;缺點是向網絡中注入的數據包會增大網絡的通信量,影響網絡的行為,使測量結果與實際情況有偏差。被動測量的優點是不會增加被測網絡的流量,測量結果真實;不足的是只能得到測量點所在位置的信息,無法了解被測網絡的整體和端到端的行為特征,而且由于被動測量需要部署測量點,所以要求對網絡有完全的控制權,能夠測量的范圍比較小。針對局域網的特點和流量測量的需求,我們的系統采用被動的測量方法。
1.2 基于Libpcap和BPF的軟件抓包
在不使用專門硬件設備的情況下,抓取數據包的任務就要由普通主機來完成。通常情況下,網絡的數據包被主機的網卡得到后,就直接交給了操作系統的協議棧。協議棧按照數據鏈路層、網絡層、傳輸層、應用層的順序一層層地識別、丟棄包頭并進行分析,最后將得到的數據包內容交給目的應用程序。但是,這些經過協議棧處理的數據包內容對我們進行流量分析來說是沒有意義的,因為包含流量信息的包頭在協議棧的分析處理過程中就被丟棄了。流量分析需要得到的是原始的網絡數據包。Libpcap和BPF包過濾器可以幫助我們完成這個任務。
Libpcap[6](Packet Capture Library,數據包捕獲函數庫)是由美國勞倫斯伯克利國家實驗室(Lawrence Berkeley National Laboratory)開發的。該庫提供的C函數接口主要實現和封裝了與數據包截獲有關的過程,用于需要捕獲經過網絡接口數據包的系統開發上。著名的Tcpdump,Ethereal等軟件就是在Libpcap的基礎上開發而成的。Libpcap庫為不同的平臺提供了一致的編程接口,在安裝了Libpcap的平臺上,以Libpcap為接口編寫的程序,能夠自由地跨平臺使用。
Libpcap的抓包是基于BPF[7]過濾器的,BPF(Berkeley Packet Filter)于1992年被設計出來,其設計目的是為了使用戶級程序能夠訪問原始的未經處理的網絡數據包,并且解決當時已存在的過濾機制效率低下的問題。用戶可以根據想要得到的數據包的特征,如長度、源地址、目的地址、協議等,定義BPF的過濾規則,由Libpcap將用戶書寫的過濾規則編譯為BPF代碼,啟動BPF過濾器。在有BPF過濾器監聽網卡的情況下,網卡得到一個數據包后,會首先復制一份數據給BPF過濾器,過濾器根據用戶定義的規則決定是否接收此數據包以及需要拷貝該數據包的哪些內容;然后將過濾后的數據提交給Libpcap進行處理;最后鏈路層驅動將重新獲得控制權,判斷該數據包是否是發給本機的。如果是,則驅動程序會再將它提交給系統的協議棧;否則網卡驅動程序從中斷返回,繼續接收數據。Libpcap和BPF抓取數據包的邏輯結構圖如圖1所示。
2 局域網流量測量系統
本系統是通過基于Libpcap和BPF被動抓包[8]得到局域網內的所有數據包,然后根據IP地址統計局域網內各主機以天為單位的流量情況。根據需要,我們在系統中對國際國內流量進行了區分,方便網絡管理員進行流量控制和計費。網絡管理員和普通用戶均可以通過Web方式查詢流量統計的結果。系統中還設計了郵件告警功能,提醒流量超過限制值的用戶注意流量的使用。
2.1系統結構圖
系統分為數據采集、數據分析、流量統計查詢、郵件告警和配置管理五個模塊。系統的結構如圖2所示。
2.2 模塊功能詳細說明
2.2.1 數據采集模塊
數據采集模塊的功能是從網絡上抓取數據包,抽取其中與流量相關的信息,存儲到數據庫表RawData中,提供給數據分析模塊處理。
對數據采集模塊來說,我們最關心的是它的性能。為了提高抓包的性能,在實現時先對抓到的數據進行緩沖,減少了因處理不及時引起的丟包;并且對數據包進行了流量聚合(源IP地址、目的IP地址相同的數據包流量相加,作為一條記錄),聚合后再寫入數據庫,減少了與數據庫建立連接和向數據庫寫入數據的次數,從而提高了性能。
數據采集由數據抽取進程、流量聚合進程和數據存儲進程共同完成,三個進程并發執行。其中,數據抽取進程和流量聚合進程是生產者和消費者的關系,同步并且互斥地訪問aggregateChain鏈表;流量聚合進程和數據存儲進程也是生產者和消費者的關系,同步并且互斥地訪問鏈表storeChain。
首先,數據抽取進程調用Libpcap庫函數,得到經過BPF過濾的數據包,從中讀出時間戳、源IP地址、目的IP地址和包長度,用一個如下所示的結構體進行存儲:
struct dataStruct {
time_t timestamp;
unsigned char srcip[4];
unsigned char dstip[4];
int bytes;
};
然后將該結構體作為一個節點加入到緩沖鏈表dataChain中進行緩沖。當緩沖鏈表dataChain的長度到達了配置文件中設定的最大值,就把它添加到鏈表aggregateChain的末尾,然后清空dataChain。由于鏈表aggregateChain要被兩個進程訪問,所以向aggregateChain末尾插入數據前,需要調用pthread_mutex_lock(_aggregateMutex_)函數獲得互斥鎖,保證對aggregateChain的互斥訪問。作為生產者,數據采集模塊在鏈表aggregateChain末尾插入數據后,要調用pthread_cond_signal(_aggregateCond_)函數通知消費者流量聚合進程,保證它能同步地訪問aggregateChain鏈表。最后,調用pthread_mutex_unlock(_aggregateMutex_)函數釋放互斥鎖。
流量聚合進程訪問鏈表aggregateChain前,也要調用下面的函數獲得互斥鎖:pthread_mutex_lock(_aggregateMutex_)以保證對鏈表aggregateChain的互斥訪問。作為消費者,流量聚合進程獲得互斥鎖后,還需要判斷aggregateChain是否為空,如果不是空,可以正常訪問;如果aggregateChain鏈表為空,則流量聚合進程需要調用pthread_cond_wait(_aggregateCond_, _aggregateMutex_)函數等待生產者數據抽取進程向aggregateChain鏈表中添加數據,以保證同步訪問鏈表aggregateChain。獲得訪問權限后,流量聚合進程利用一個哈希表aggregatedHashTable完成流量聚合。最初,哈希表為空,流量聚合進程依次讀取并刪除鏈表aggregateChain中的節點,然后查找哈希表中是否有源IP地址和目的IP地址均相同的記錄,如果有,則將當前節點的流量累加到哈希表中已有記錄的流量上;否則新建一條記錄插入哈希表。與此同時,作為storeChain鏈表的生產者,流量聚合進程每隔一段時間(這個時間間隔在配置文件中設置)會將哈希表作為一個節點添加到鏈表storeChain的末尾,然后清空哈希表。
數據存儲進程作為storeChain鏈表的消費者,從storeChain鏈表中得到節點,每個節點是一個哈希表,然后將哈希表的內容存入RawData數據庫表。
數據采集模塊啟動時,需要從配置文件中讀取運行所需要的參數。這些參數包括用來采集數據包的網卡名字、要進行流量分析的局域網IP地址區間、存儲RawData表所在的數據庫名、對采集到的數據進行緩沖的鏈表長度以及流量聚合進程提交哈希表的時間間隔。
2.2.2 數據分析模塊
數據分析模塊的功能是讀取數據庫表RawData,統計每個IP地址每天的國際流量、國內流量和內部流量存儲到數據庫表FormattedData中。數據庫表RawData和FormattedData結構如表1、表2所示。
數據分析模塊首先解析一個國際國內IP地址分配表的數據庫文件Ip.mdb,以便在后面確定每個數據包屬于國際流量、國內流量還是內部流量。解析過程中,利用Java中的數據結構TreeSet實現這些地址段的排序,排序后得到一個有序的國際IP地址段的TreeSet和一個有序的國內IP地址段的TreeSet。為了提高查找效率,系統將兩個TreeSet中的元素存儲到數組中,查找時利用二分查找,降低了時間復雜度。
之后,數據分析模塊進入周期運行的部分(周期可以在配置文件中設置),讀取并刪除一個運行周期內數據庫表RawData中的所有記錄。對每一條記錄,利用前面解析Ip.mdb得到的兩個數組,通過二分查找確定它屬于國際流量、國內流量還是內部流量,然后將數據包的長度累加到對應的流量。結果存入數據庫表FormattedData。
2.2.3 流量統計查詢模塊
流量統計查詢模塊的功能是讀取數據庫表FormattedData,以Web方式提供查詢和排序功能,使用JSP和Servlet實現。
2.2.4 郵件告警模塊
郵件告警模塊的功能是周期性(運行周期可以配置)地查看數據庫表FormattedData,統計每一個內部IP地址當月的國際流量和國內流量。如果某個IP地址的流量超過了配置文件中設定的流量限制值,就向對應的用戶發送告警郵件,并抄送給網絡管理員。
告警模塊實現為一個Servlet,作為一個后臺服務來運行,在Web服務器啟動時就開始運行。告警郵件的發送使用J2EE架構中JavaMail提供的郵件發送機制來完成。
2.2.5 配置管理模塊
配置管理模塊的功能是根據用戶的輸入,修改系統的部分配置,如發送郵件告警的服務器地址和用戶名、密碼,用戶的國際、國內流量限值。其實現為Web頁面,頁面中還顯示了系統各個模塊的運行狀態,以方便管理員查看,發現系統運行的故障。
2.3 系統的部署
本系統的部署需要局域網內的兩臺服務器(為了減輕數據采集分析服務器的負擔,提高數據采集的性能,減少丟包)或者PC。其中一臺安裝Linux/UNIX操作系統以及Libpcap庫,運行數據采集模塊、數據分析模塊和系統需要的數據庫;另一臺運行Web應用服務器(Tomcat,Resin等都可以)來運行流量統計查詢模塊、郵件告警模塊和配置管理模塊。另外用到一個郵件服務器來發送郵件,該郵件服務器可以是任意的郵件服務器,不一定在局域網內。
在部署數據采集分析服務器時應注意兩點:①要部署在能夠接收到局域網內所有數據包的位置。對典型的以太網,因為是共享總線的結構,所有的數據包均會在局域網內被廣播。所以,數據采集分析服務器可以部署在局域網內的任意位置。②將采集數據的網卡設置為混雜模式。這樣網卡才會接收所有到達它的數據包;普通模式下,網卡只接收目的地址是自己的那些數據包。
以上兩點就保證了系統可以采集到局域網內的所有數據包。典型的以太網環境下,部署的結構圖如圖3所示。
目前,許多局域網均采用了局域網交換機為中心的星型結構連接主機來提高局域網的速度。交換機對輸入的數據進行交換而不是廣播,也就是只向連接目的主機的端口輸出,而不是向所有端口輸出。所以傳輸的數據包只有目的主機可以收到,其他主機是收不到的。多數局域網交換機都有一個流量映射端口,將經過交換機的所有流量從這個端口輸出。這時,數據采集分析服務器需要兩塊網卡,一塊網卡接在局域網交換機的流量映射端口,并設置成混雜模式,完成抓包;另一塊接在局域網交換機的普通端口,用來與Web服務器通信。此時,部署結構如圖4所示。
3 總結
本系統利用Libpcap和BPF進行數據采集,針對局域網的流量進行分析,區分了國際、國內流量,滿足了普通用戶了解自己流量使用情況的需求,也方便了管理員進行流量控制和計費。系統的運行不需要專門的硬件設備,成本低,易部署,并且能夠適用于不同結構的局域網環境,有廣泛的適用性。目前,本系統已經部署在中國科學院計算機網絡信息中心網絡技術與應用研究室,其運行表現良好,有很強的實用性。
參考文獻:
[1]C Williamson.Internet Traffic Measurement[J].IEEE Internet Computing, 2001,(11):70-74.
[2]The Internet Engineering Task Force[EB/OL].http://www.ietf.org/html.charters/wgdir.html,2005.
[3]Cooperative Association for Internet Data Analysis[EB/OL].http://www.caida.org,2005.
[4]The National Laboratory for Applied Network Research[EB/OL].http://www.nlanr.net,2005.
[5]Prasad Calyam, Dima Krymskiy, Mukudan Sridharan, et al.Active and Passive Measurements on Campus, Regional and National Network Backbone Paths[EB/OL].http://www.ece.osu.edu/~calyama/,2005.
[6]Lawrence Berkeley National Labs, Libpcap,Network Research Group[EB/OL].http://www.tcpdump.org/,2005.
[7]Steven McCanne, Van Jacobson.The BSD Packet Filter:A New Architecture for Userlevel Packet Capture[C].San Diego:Proc.of USENIX’93, 1993.21-24.
[8]N Brownlee,C Mills, G Ruth.Traffic Flow Measurement:Architecture[S].IETF RFC2722,1997.
作者簡介:
李若霖(1980-),男,碩士研究生,主要研究方向為網絡測量、下一代互聯網技術;王金一,男,碩士,主要研究方向為多媒體通信、網絡測量與QoS控制;陶智勇,男,碩士研究生,主要研究方向為網絡測量、下一代互聯網技術;陳琦,男,碩士研究生,主要研究方向為網絡測量、下一代互聯網技術;南凱,男,副研究員,碩士生導師,主要研究方向為大規模科學數據共享、科學數據網格;閻保平,女,研究員,博導,主要研究方向為大規模數據共享、多媒體數據庫、數據網格技術、下一代互聯網技術。
注:本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文