pcap(3)


PCAP(3PCAP) 

NAME
pcap —— 數據包抓取庫

SYNOPSIS

#include <pcap/pcap.h>

DESCRIPTION
數據包抓取庫提供數據包抓取系統的高層接口。所有網絡上的數據包,即便他們目標是其他主機,也能通過此機制訪問到。它還支持將抓取的數據包保存到“savefile”,並可以從這個“savefile”讀取出來。

調用pcap_create()可以為一個活動的抓取器打開一個句柄,為其設置適當的選項並調用pcap_activate()激活它。調用pcap_open_offline()可以打開並獲取存有離線數據的“savefile”文件的句柄。pcap_create()和pcap_open_offline()都返回一個pcap_t指針,這便是用於從數據流中讀取數據包的句柄,同樣它也用於獲取數據流的信息。

抓包器的可用選項包括:

快照長度
比如說抓包時,你抓取整個數據包,這需要更多的CPU時間以將其拷貝到你的應用程序,更多的磁盤和可能的網絡帶寬以將其數據寫入文件,和更多的磁盤空間來保存該數據包。如果你不需要數據包的整個內容——例如,你只對其中的TCP報頭感興趣——你可以將該抓包器的“快照長度”設置為合適的長度。如果快照長度被設置為snaplen,而snaplen比抓到的數據包長度要短,則只有前面的snaplen個字節被捕獲並作為數據包的數據。

對於抓取整個數據包而言,65535的長度對於絕大多數的網絡都足夠了。

通過pcap_set_snaplen()以設置快照長度。

混雜模式
On broadcast LANs such as Ethernet, if the network isn't switched, or if the adapter is connected to a "mirror port" on a switch to which all packets passing through the switch are sent, a network adapter receives all packets on the LAN, including unicast or multicast packets not sent to a network address that the network adapter isn't configured to recognize.

正常情況下,該適配器會忽略這些數據包,然而,許多網絡適配器支持“混雜模式”,該模式下適配器將接受所有數據包,即便那不是發到該適配器的。這有利於捕獲其他的主機進行分析。

記住,即便應用程序不設置混雜模式,適配器也會因為某些原因處在混雜模式。

現在而言,這不能在“any”設備下工作,如果提供了“any”和NULL,混雜模式將被忽略。

通過pcap_set_promisc()可以設置混雜模式。

監視模式
在IEEE 802.11無線局域網,即便適配器工作在混雜模式,它也只在它所在的網絡中獲取傳遞到該主機的幀。它也許只提供數據幀,而非管理或控制幀,也許不提供這些幀的802.11頭部或無線信息的偽頭部。

在“監視模式”下,有時叫做“rfmon模式”(“Radio Frequency MONitor”),適配器將提供收到的所有幀,包括802.11頭部,以及可能的無線信息偽頭部。

記住,監視模式下的適配器也許會從它所在的網絡脫離開來,以致於你無法在該適配器上使用任何無線網絡。這使得無法訪問網絡服務器上的文件,或解析域名以及網絡地址,如果你在監視模式下抓包,並且沒有使用另外一個適配器連接到另外的網絡。

通過pcap_set_rfmon()設置監視模式,pcap_can_set_rfmon()可以用於確定適配器是否可以進入監視模式。

超時讀取
假設抓包時,數據包在它到達之后就立刻交付,抓包的應用程序會在每個數據包到達時被喚醒,並執行一個或多個調用以取出每個數據包。

假如又說,數據包在它們到達之后不立刻交付,而是在一小段延時之后交付(叫做“超時讀取”),在交付之前,多個數據包可以累積在一起,於是一次喚醒可以處理多個數據包,每個調用可以處理操作系統提供的多個數據包而非單個。如果數據包頻繁到達的話,這減少了每個數據包的CPU開銷,提高了每秒可以捕獲的數據包數量。

超時讀取是必要的,如此則應用程序不用在數據包交付之前等待操作系統填滿捕獲緩沖區,如果數據包很慢到達,這樣的等待可以持續任意長的時間。

不是所有平台都支持超時讀取,如果該平台不支持,則超時讀取被乎略。對於0超時值來說,在支持超時讀取的平台上,將引起無限期等待,直至足夠多的數據包到達,永不超時。

NOTE:超時讀取不能用於觸發調用,這些調用讀取數據包並在一段時間內返回,因為在一些平台上,超時讀取是不被支持的,並且,另外一些平台上,在至少一個數據包到來之前定時器不會啟動。這意味着超時讀取不應該被利用。例如,在一個交互式程序中允許抓包循環由用戶周期性輸入來驅動,但實際上無法確保讀取數據包的調用會在期望的時間返回,即便沒有數據包到達。

通過pcap_set_timeout()設置讀取超時。

緩沖大小
抓包器抓下的包被存放在緩沖區,因而它們不需要在到達時就被應用程序讀走。一些平台上,緩沖大小是可以設置的,太小的緩沖意味着,如果捕捉到太多數據包,而且快照長度沒有限制緩沖的數據量,當緩沖區在應用程序來讀走數據包前被填滿,則數據包將被丟棄;而太大的緩沖意味着將占用過多不可分頁的OS內存。

通過pcap_set_buffer_size()設置緩沖大小。

從網絡接口中讀取數據包要求具有特定的特權:

Under SunOS 3.x or 4.x with NIT or BPF:
你必須具有/dev/nit或/dev/bpf*的讀權限。

Under Solaris with DLPI:
你必須具有對網絡虛擬設備的讀寫權限,比如/dev/le。在至少一些版本的Solaris上,這還不足以保證tcpdump工作在混雜模式。這些版本的Solaris上,你必須是root,或者有效uid是root,才能啟用混雜模式。記住,對於許多(也許是所有)接口,如果你不啟用混雜模式抓包,你將看不到任何外出數據包,因此抓包時不能啟用混雜模式將十分不利。

In newer versions of Solaris, you must have been given the net_rawaccess privilege; this is both necessary and
sufficient to give you access to the network pseudo-device - there is no need to change the privileges on that
device. A user can be given that privilege by, for example, adding that privilege to the user's defaultpriv key
with the usermod (1M) command.

Under HP-UX with DLPI:
你必須是root,或者應用程序的有效uid是root。

Under IRIX with snoop:
你必須是root,或者應用程序的有效uid是root。

Under Linux:
你必須是root或者有效uid是root。(unless your distribution has a kernel that supports capability bits such as CAP_NET_RAW and code to allow those capability bits to be given to particular accounts and to cause those bits to be set on a user's initial processes when they log in, in which case you must have CAP_NET_RAW in order to capture and CAP_NET_ADMIN to enumerate network devices with, for example, the -D flag).

Under ULTRIX and Digital UNIX/Tru64 UNIX:
Any user may capture network traffic. However, no user (not even the super-user) can capture in promiscuous mode
on an interface unless the super-user has enabled promiscuous-mode operation on that interface using pfconfig(8),
and no user (not even the super-user) can capture unicast traffic received by or sent by the machine on an inter‐
face unless the super-user has enabled copy-all-mode operation on that interface using pfconfig, so useful packet
capture on an interface probably requires that either promiscuous-mode or copy-all-mode operation, or both modes
of operation, be enabled on that interface.

Under BSD (this includes Mac OS X):
You must have read access to /dev/bpf* on systems that don't have a cloning BPF device, or to /dev/bpf on systems
that do. On BSDs with a devfs (this includes Mac OS X), this might involve more than just having somebody with
super-user access setting the ownership or permissions on the BPF devices - it might involve configuring devfs to
set the ownership or permissions every time the system is booted, if the system even supports that; if it doesn't
support that, you might have to find some other way to make that happen at boot time.

讀取存好的數據包文件不需要特殊權限。

調用pcap_dump_open()打開“savefile”以寫入數據包。它返回一個pcap_dumper_t指針,它是用於向“savefile”寫數據包的句柄。

通過pcap_dispatch()或pcap_loop()以讀取數據包,它們處理一個或多個數據包,為每個數據包調用回調例程,或者用pcap_next()或pcap_next_ex(),它們返回下一個數據包。pcap_dispatch()和pcap_loop()的回調參數是一個struct pcap_pkthdr指針,它包含以下成員:

  ts    一個timeval結構,包含數據包捕獲的時間戳

  caplen  一個bpf_u_int32,給出數據包被捕獲下來的可用長度

  len    一個bpf_u_int32,給出數據包的原始長度,以字節為單位(這可能比caplen要長一些,如果數據包的長度要大於捕捉到的最大長度)

pcap_next_ex()通過一個指針參數傳遞此指針,pcap_next()傳遞一個指向struct pcap_pkthdr結構的指針,填寫該結構。

回掉還提供一個const u_char指針指向前caplen(由傳遞給回調例程的struct pcap_pkthdr指針給出)字節數據包數據。這並不一定是整個數據包。為了抓取整個數據包,你需要在調用pcap_open_live()時提供一個snaplen的值,此值足夠大到獲取數據包的所有數據(65535對於絕大多數的網絡來說足夠了)。當從“savefile”讀時,抓包時指定的快照長度會限制數據包可用數據的數量。pcap_next()返回該指針,pcap_next_ex()通過參數提供該指針。

BACKWARDS COMPATIBILITY
libpcap v1.0之前,絕大多數平台的pcap.h並不在pcap目錄中,如果你的應用必須工作在libpcap1.0之前的版本,包含<pcap.h>,它會為你包含<pcap/pcap.h>。

pcap_create()和pcap_activate()在1.0之前的版本是不可用的,如果你寫的應用必須工作在1.0之前的版本,要么用pcap_open_live()獲取句柄,或者希望用pcap_create()和pcap_activate()提供的額外功能,使用autoconf(1)腳本或一些其他的配置腳本檢查libpcap 1.0的API是否可用,並在可用時使用它們。

SEE ALSO
autoconf(1), tcpdump(8), tcpslice(1), pcap-filter(7), pfconfig(8), usermod(1M)

AUTHORS
The original authors of libpcap are:

Van Jacobson, Craig Leres and Steven McCanne, all of the Lawrence Berkeley National Laboratory, University of California,
Berkeley, CA.

The current version is available from "The Tcpdump Group"'s Web site at

http://www.tcpdump.org/

BUGS
Please send problems, bugs, questions, desirable enhancements, etc. to:

tcpdump-workers@lists.tcpdump.org

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM