天天看點

Linux tcpdump指令詳解簡介實用指令執行個體輸出資訊含義指令使用附錄:tcpdump的表達元

用簡單的話來定義tcpdump,就是:dump the traffic on a network,根據使用者的定義對網絡上的資料包進行截獲的包分析工具。 tcpdump可以将網絡中傳送的資料包的“頭”完全截獲下來提供分析。它支援針對網絡層、協定、主機、網絡或端口的過濾,并提供and、or、not等邏輯語句來幫助你去掉無用的資訊。

預設啟動

普通情況下,直接啟動tcpdump将監視第一個網絡接口上所有流過的資料包。

監視指定網絡接口的資料包

如果不指定網卡,預設tcpdump隻會監視第一個網絡接口,一般是eth0,下面的例子都沒有指定網絡接口。 

監視指定主機的資料包

列印所有進入或離開sundown的資料包.

也可以指定ip,例如截獲所有210.27.48.1 的主機收到的和發出的所有的資料包

列印helios 與 hot 或者與 ace 之間通信的資料包

截獲主機210.27.48.1 和主機210.27.48.2 或210.27.48.3的通信

列印ace與任何其他主機之間通信的IP 資料包, 但不包括與helios之間的資料包.

如果想要擷取主機210.27.48.1除了和主機210.27.48.2之外所有主機通信的ip包,使用指令:

截獲主機hostname發送的所有資料

監視所有送到主機hostname的資料包

監視指定主機和端口的資料包

如果想要擷取主機210.27.48.1接收或發出的telnet包,使用如下指令

對本機的udp 123 端口進行監視 123 為ntp的服務端口

監視指定網絡的資料包

列印本地主機與Berkeley網絡上的主機之間的所有通信資料包(nt: ucb-ether, 此處可了解為'Berkeley網絡'的網絡位址,此表達式最原始的含義可表達為: 列印網絡位址為ucb-ether的所有資料包)

列印所有通過網關snup的ftp資料包(注意, 表達式被單引号括起來了, 這可以防止shell對其中的括号進行錯誤解析)

列印所有源位址或目标位址是本地主機的IP資料包

(如果本地網絡通過網關連到了另一網絡, 則另一網絡并不能算作本地網絡.(nt: 此句翻譯曲折,需補充).localnet 實際使用時要真正替換成本地網絡的名字)

監視指定協定的資料包

列印TCP會話中的的開始和結束資料包, 并且資料包的源或目的不是本地網絡上的主機.(nt: localnet, 實際使用時要真正替換成本地網絡的名字))

列印所有源或目的端口是80, 網絡層協定為IPv4, 并且含有資料,而不是SYN,FIN以及ACK-only等不含資料的資料包.(ipv6的版本的表達式可做練習)

(nt: 可了解為, ip[2:2]表示整個ip資料包的長度, (ip[0]&0xf)<<2)表示ip資料包標頭的長度(ip[0]&0xf代表包中的IHL域, 而此域的機關為32bit, 要換算

成位元組數需要乘以4, 即左移2. (tcp[12]&0xf0)>>4 表示tcp頭的長度, 此域的機關也是32bit, 換算成比特數為 ((tcp[12]&0xf0) >> 4) << 2, 

即 ((tcp[12]&0xf0)>>2). ((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0 表示: 整個ip資料包的長度減去ip頭的長度,再減去

tcp頭的長度不為0, 這就意味着, ip資料包中确實是有資料.對于ipv6版本隻需考慮ipv6頭中的'Payload Length' 與 'tcp頭的長度'的內插補點, 并且其中表達方式'ip[]'需換成'ip6[]'.)

列印長度超過576位元組, 并且網關位址是snup的IP資料包

列印所有IP層廣播或多點傳播的資料包, 但不是實體以太網層的廣播或多點傳播資料報

列印除'echo request'或者'echo reply'類型以外的ICMP資料包( 比如,需要列印所有非ping 程式産生的資料包時可用到此表達式 .

(nt: 'echo reuqest' 與 'echo reply' 這兩種類型的ICMP資料包通常由ping程式産生))

tcpdump 與wireshark

Wireshark(以前是ethereal)是Windows下非常簡單易用的抓包工具。但在Linux下很難找到一個好用的圖形化抓包工具。

還好有Tcpdump。我們可以用Tcpdump + Wireshark 的完美組合實作:在 Linux 裡抓包,然後在Windows 裡分析包。

(1)tcp: ip icmp arp rarp 和 tcp、udp、icmp這些選項等都要放到第一個參數的位置,用來過濾資料報的類型

(2)-i eth1 : 隻抓經過接口eth1的包

(3)-t : 不顯示時間戳

(4)-s 0 : 抓取資料包時預設抓取長度為68位元組。加上-S 0 後可以抓到完整的資料包

(5)-c 100 : 隻抓取100個資料包

(6)dst port ! 22 : 不抓取目标端口是22的資料包

(7)src net 192.168.1.0/24 : 資料包的源網絡位址為192.168.1.0/24

(8)-w ./target.cap : 儲存成cap檔案,友善用ethereal(即wireshark)分析

使用tcpdump抓取HTTP包

0x4745 為"GET"前兩個字母"GE",0x4854 為"HTTP"前兩個字母"HT"。

tcpdump 對截獲的資料并沒有進行徹底解碼,資料包内的大部分内容是使用十六進制的形式直接列印輸出的。顯然這不利于分析網絡故障,通常的解決辦法是先使用帶-w參數的tcpdump 截獲資料并儲存到檔案中,然後再使用其他程式(如Wireshark)進行解碼分析。當然也應該定義過濾規則,以避免捕獲的資料包填滿整個硬碟。

首先我們注意一下,基本上tcpdump總的的輸出格式為:系統時間 來源主機.端口 > 目标主機.端口 資料包參數

tcpdump 的輸出格式與協定有關.以下簡要描述了大部分常用的格式及相關例子.

對于FDDI網絡, '-e' 使tcpdump列印出指定資料包的'frame control' 域, 源和目的位址, 以及包的長度.(frame control域

控制對包中其他域的解析). 一般的包(比如那些IP datagrams)都是帶有'async'(異步标志)的資料包,并且有取值0到7的優先級;

比如 'async4'就代表此包為異步資料包,并且優先級别為4. 通常認為,這些包們會内含一個 LLC包(邏輯鍊路控制包); 這時,如果此包

不是一個ISO datagram或所謂的SNAP包,其LLC頭部将會被列印(nt:應該是指此包内含的 LLC包的標頭).

對于Token Ring網絡(令牌環網絡), '-e' 使tcpdump列印出指定資料包的'frame control'和'access control'域, 以及源和目的位址,

外加包的長度. 與FDDI網絡類似, 此資料包通常内含LLC資料包. 不管 是否有'-e'選項.對于此網絡上的'source-routed'類型資料包(nt:

意譯為:源位址被追蹤的資料包,具體含義未知,需補充), 其包的源路由資訊總會被列印.

對于802.11網絡(WLAN,即wireless local area network), '-e' 使tcpdump列印出指定資料包的'frame control域,

標頭中包含的所有位址, 以及包的長度.與FDDI網絡類似, 此資料包通常内含LLC資料包.

(注意: 以下的描述會假設你熟悉SLIP壓縮算法 (nt:SLIP為Serial Line Internet Protocol.), 這個算法可以在

RFC-1144中找到相關的蛛絲馬迹.)

對于SLIP網絡(nt:SLIP links, 可了解為一個網絡, 即通過串行線路建立的連接配接, 而一個簡單的連接配接也可看成一個網絡),

資料包的'direction indicator'('方向訓示标志')("I"表示入, "O"表示出), 類型以及壓縮資訊将會被列印. 包類型會被首先列印.

類型分為ip, utcp以及ctcp(nt:未知, 需補充). 對于ip包,連接配接資訊将不被列印(nt:SLIP連接配接上,ip包的連接配接資訊可能無用或沒有定義.

reconfirm).對于TCP資料包, 連接配接辨別緊接着類型表示被列印. 如果此包被壓縮, 其被編碼過的頭部将被列印.

此時對于特殊的壓縮包,會如下顯示:

*S+n 或者 *SA+n, 其中n代表包的(順序号或(順序号和應答号))增加或減少的數目(nt | rt:S,SA拗口, 需再譯).

對于非特殊的壓縮包,0個或更多的'改變'将會被列印.'改變'被列印時格式如下:

'标志'+/-/=n 包資料的長度 壓縮的頭部長度.

其中'标志'可以取以下值:

U(代表緊急指針), W(指緩沖視窗), A(應答), S(序列号), I(包ID),而增量表達'=n'表示被賦予新的值, +/-表示增加或減少.

比如, 以下顯示了對一個外發壓縮TCP資料包的列印, 這個資料包隐含一個連接配接辨別(connection identifier); 應答号增加了6,

順序号增加了49, 包ID号增加了6; 包資料長度為3位元組(octect), 壓縮頭部為6位元組.(nt:如此看來這應該不是一個特殊的壓縮資料包).

ARP/RARP 資料包

tcpdump對Arp/rarp包的輸出資訊中會包含請求類型及該請求對應的參數. 顯示格式簡潔明了. 以下是從主機rtsg到主機csam的'rlogin'

(遠端登入)過程開始階段的資料包樣例:

arp who-has csam tell rtsg

arp reply csam is-at CSAM

第一行表示:rtsg發送了一個arp資料包(nt:向全網段發送,arp資料包)以詢問csam的以太網位址

Csam(nt:可從下文看出來, 是Csam)以她自己的以太網位址做了回應(在這個例子中, 以太網位址以大寫的名字辨別, 而internet

位址(即ip位址)以全部的小寫名字辨別).

如果使用tcpdump -n, 可以清晰看到以太網以及ip位址而不是名字辨別:

arp who-has 128.3.254.6 tell 128.3.254.68

arp reply 128.3.254.6 is-at 02:07:01:00:01:c4

如果我們使用tcpdump -e, 則可以清晰的看到第一個資料包是全網廣播的, 而第二個資料包是點對點的:

RTSG Broadcast 0806 64: arp who-has csam tell rtsg

CSAM RTSG 0806 64: arp reply csam is-at CSAM

第一個資料包表明:以arp包的源以太位址是RTSG, 目标位址是全以太網段, type域的值為16進制0806(表示ETHER_ARP(nt:arp包的類型辨別)),

包的總長度為64位元組.

(注意:以下将會假定你對 RFC-793所描述的TCP熟悉. 如果不熟, 以下描述以及tcpdump程式可能對你幫助不大.(nt:警告可忽略,

隻需繼續看, 不熟悉的地方可回頭再看.).

通常tcpdump對tcp資料包的顯示格式如下:

src > dst: flags data-seqno ack window urgent options

src 和 dst 是源和目的IP位址以及相應的端口. flags 标志由S(SYN), F(FIN), P(PUSH, R(RST),

W(ECN CWT(nt | rep:未知, 需補充))或者 E(ECN-Echo(nt | rep:未知, 需補充))組成,

單獨一個'.'表示沒有flags辨別. 資料段順序号(Data-seqno)描述了此包中資料所對應序列号空間中的一個位置(nt:整個資料被分段,

每段有一個順序号, 所有的順序号構成一個序列号空間)(可參考以下例子). Ack 描述的是同一個連接配接,同一個方向,下一個本端應該接收的

(對方應該發送的)資料片段的順序号. Window是本端可用的資料接收緩沖區的大小(也是對方發送資料時需根據這個大小來組織資料).

Urg(urgent) 表示資料包中有緊急的資料. options 描述了tcp的一些選項, 這些選項都用尖括号來表示(如 <mss 1024>).

src, dst 和 flags 這三個域總是會被顯示. 其他域的顯示與否依賴于tcp協定頭裡的資訊.

這是一個從trsg到csam的一個rlogin應用登入的開始階段.

rtsg.1023 > csam.login: S 768512:768512(0) win 4096 <mss 1024>

csam.login > rtsg.1023: S 947648:947648(0) ack 768513 win 4096 <mss 1024>

rtsg.1023 > csam.login: . ack 1 win 4096

rtsg.1023 > csam.login: P 1:2(1) ack 1 win 4096

csam.login > rtsg.1023: . ack 2 win 4096

rtsg.1023 > csam.login: P 2:21(19) ack 1 win 4096

csam.login > rtsg.1023: P 1:2(1) ack 21 win 4077

csam.login > rtsg.1023: P 2:3(1) ack 21 win 4077 urg 1

csam.login > rtsg.1023: P 3:4(1) ack 21 win 4077 urg 1

第一行表示有一個資料包從rtsg主機的tcp端口1023發送到了csam主機的tcp端口login上(nt:udp協定的端口和tcp協定的端

口是分别的兩個空間, 雖然取值範圍一緻). S表示設定了SYN标志. 包的順序号是768512, 并且沒有包含資料.(表示格式

為:'first:last(nbytes)', 其含義是'此包中資料的順序号從first開始直到last結束,不包括last. 并且總共包含nbytes的

使用者資料'.) 沒有捎帶應答(nt:從下文來看,第二行才是有捎帶應答的資料包), 可用的接受視窗的大小為4096bytes, 并且請求端(rtsg)

的最大可接受的資料段大小是1024位元組(nt:這個資訊作為請求發向應答端csam, 以便雙方進一步的協商).

Csam 向rtsg 回複了基本相同的SYN資料包, 其差別隻是多了一個' piggy-backed ack'(nt:捎帶回的ack應答, 針對rtsg的SYN資料包).

rtsg 同樣針對csam的SYN資料包回複了一ACK資料包作為應答. '.'的含義就是此包中沒有标志被設定. 由于此應答包中不含有資料, 是以

包中也沒有資料段序列号. 提醒! 此ACK資料包的順序号隻是一個小整數1. 有如下解釋:tcpdump對于一個tcp連接配接上的會話, 隻列印會話兩端的

初始資料包的序列号,其後相應資料包隻列印出與初始包序列号的差異.即初始序列号之後的序列号, 可被看作此會話上目前所傳資料片段在整個

要傳輸的資料中的'相對位元組'位置(nt:雙方的第一個位置都是1, 即'相對位元組'的開始編号). '-S'将覆寫這個功能, 

使資料包的原始順序号被列印出來.

第六行的含義為:rtsg 向 csam發送了19位元組的資料(位元組的編号為2到20,傳送方向為rtsg到csam). 包中設定了PUSH标志. 在第7行,

csam 喊到, 她已經從rtsg中收到了21以下的位元組, 但不包括21編号的位元組. 這些位元組存放在csam的socket的接收緩沖中, 相應地,

csam的接收緩沖視窗大小會減少19位元組(nt:可以從第5行和第7行win屬性值的變化看出來). csam在第7行這個包中也向rtsg發送了一個

位元組. 在第8行和第9行, csam 繼續向rtsg 分别發送了兩個隻包含一個位元組的資料包, 并且這個資料包帶PUSH标志.

如果所抓到的tcp包(nt:即這裡的snapshot)太小了,以至tcpdump無法完整得到其頭部資料, 這時, tcpdump會盡量解析這個不完整的頭,

并把剩下不能解析的部分顯示為'[|tcp]'. 如果頭部含有虛假的屬性資訊(比如其長度屬性其實比頭部實際長度長或短), tcpdump會為該頭部

顯示'[bad opt]'. 如果頭部的長度告訴我們某些選項(nt | rt:從下文來看, 指tcp包的頭部中針對ip包的一些選項, 回頭再翻)會在此包中,

而真正的IP(資料包的長度又不夠容納這些選項, tcpdump會顯示'[bad hdr length]'.

抓取帶有特殊标志的的TCP包(如SYN-ACK标志, URG-ACK标志等).

在TCP的頭部中, 有8比特(bit)用作控制位區域, 其取值為:

CWR | ECE | URG | ACK | PSH | RST | SYN | FIN

(nt | rt:從表達方式上可推斷:這8個位是用或的方式來組合的, 可回頭再翻)

現假設我們想要監控建立一個TCP連接配接整個過程中所産生的資料包. 可回憶如下:TCP使用3次握手協定來建立一個新的連接配接; 其與此三次握手

連接配接順序對應,并帶有相應TCP控制标志的資料包如下:

1) 連接配接發起方(nt:Caller)發送SYN标志的資料包

2) 接收方(nt:Recipient)用帶有SYN和ACK标志的資料包進行回應

3) 發起方收到接收方回應後再發送帶有ACK标志的資料包進行回應

0 15 31

-----------------------------------------------------------------

| source port | destination port |

| sequence number |

| acknowledgment number |

| HL | rsvd |C|E|U|A|P|R|S|F| window size |

| TCP checksum | urgent pointer |

一個TCP頭部,在不包含選項資料的情況下通常占用20個位元組(nt | rt:options 了解為選項資料,需回譯). 第一行包含0到3編号的位元組,

第二行包含編号4-7的位元組.

如果編号從0開始算, TCP控制标志位于13位元組(nt:第四行左半部分).

0 7| 15| 23| 31

----------------|---------------|---------------|----------------

| | 13th octet | | |

讓我們仔細看看編号13的位元組:

| |

|---------------|

|C|E|U|A|P|R|S|F|

|7 5 3 0|

這裡有我們感興趣的控制标志位. 從右往左這些位被依次編号為0到7, 進而 PSH位在3号, 而URG位在5号.

提醒一下自己, 我們隻是要得到包含SYN标志的資料包. 讓我們看看在一個包的標頭中, 如果SYN位被設定, 到底

在13号位元組發生了什麼:

|0 0 0 0 0 0 1 0|

|7 6 5 4 3 2 1 0|

在控制段的資料中, 隻有比特1(bit number 1)被置位.

假設編号為13的位元組是一個8位的無符号字元型,并且按照網絡位元組号排序(nt:對于一個位元組來說,網絡位元組序等同于主機位元組序), 其二進制值

如下所示:

00000010

并且其10進制值為:

0*2^7 + 0*2^6 + 0*2^5 + 0*2^4 + 0*2^3 + 0*2^2 + 1*2^1 + 0*2^0 = 2(nt: 1 * 2^6 表示1乘以2的6次方, 也許這樣更

清楚些, 即把原來表達中的指數7 6 ... 0挪到了下面來表達)

接近目标了, 因為我們已經知道, 如果資料標頭部中的SYN被置位, 那麼頭部中的第13個位元組的值為2(nt: 按照網絡序, 即大頭方式, 最重要的位元組

在前面(在前面,即該位元組實際記憶體位址比較小, 最重要的位元組,指數學表示中數的高位, 如356中的3) ).

表達為tcpdump能了解的關系式就是:

tcp[13] 2

進而我們可以把此關系式當作tcpdump的過濾條件, 目标就是監控隻含有SYN标志的資料包:

tcpdump -i xl0 tcp[13] 2 (nt: xl0 指網絡接口, 如eth0)

這個表達式是說"讓TCP資料包的第13個位元組擁有值2吧", 這也是我們想要的結果.

現在, 假設我們需要抓取帶SYN标志的資料包, 而忽略它是否包含其他标志.(nt:隻要帶SYN就是我們想要的). 讓我們來看看當一個含有

SYN-ACK的資料包(nt:SYN 和 ACK 标志都有), 來到時發生了什麼:

|0 0 0 1 0 0 1 0|

13号位元組的1号和4号位被置位, 其二進制的值為:

00010010

轉換成十進制就是:

0*2^7 + 0*2^6 + 0*2^5 + 1*2^4 + 0*2^3 + 0*2^2 + 1*2^1 + 0*2 = 18(nt: 1 * 2^6 表示1乘以2的6次方, 也許這樣更

現在, 卻不能隻用'tcp[13] 18'作為tcpdump的過濾表達式, 因為這将導緻隻選擇含有SYN-ACK标志的資料包, 其他的都被丢棄.

提醒一下自己, 我們的目标是: 隻要包的SYN标志被設定就行, 其他的标志我們不理會.

為了達到我們的目标, 我們需要把13号位元組的二進制值與其他的一個數做AND操作(nt:邏輯與)來得到SYN比特位的值. 目标是:隻要SYN 被設定

就行, 于是我們就把她與上13号位元組的SYN值(nt: 00000010).

00010010 SYN-ACK 00000010 SYN

AND 00000010 (we want SYN) AND 00000010 (we want SYN)

-------- --------

= 00000010 = 00000010

我們可以發現, 不管包的ACK或其他标志是否被設定, 以上的AND操作都會給我們相同的值, 其10進制表達就是2(2進制表達就是00000010).

進而我們知道, 對于帶有SYN标志的資料包, 以下的表達式的結果總是真(true):

( ( value of octet 13 ) AND ( 2 ) ) ( 2 ) (nt: value of octet 13, 即13号位元組的值)

靈感随之而來, 我們于是得到了如下的tcpdump 的過濾表達式

tcpdump -i xl0 'tcp[13] & 2 2'

注意, 單引号或反斜杆(nt: 這裡用的是單引号)不能省略, 這可以防止shell對&的解釋或替換.

UDP 資料包的顯示格式,可通過rwho這個具體應用所産生的資料包來說明:

actinide.who > broadcast.who: udp 84

其含義為:actinide主機上的端口who向broadcast主機上的端口who發送了一個udp資料包(nt: actinide和broadcast都是指Internet位址).

這個資料包承載的使用者資料為84個位元組.

一些UDP服務可從資料包的源或目的端口來識别,也可從所顯示的更高層協定資訊來識别. 比如, Domain Name service requests(DNS 請求,

在RFC-1034/1035中), 和Sun RPC calls to NFS(對NFS伺服器所發起的遠端調用(nt: 即Sun RPC),在RFC-1050中有對遠端調用的描述).

UDP 名稱服務請求

(注意:以下的描述假設你對Domain Service protoco(nt:在RFC-103中有所描述), 否則你會發現以下描述就是天書(nt:希臘文天書,

不必理會, 吓吓你的, 接着看就行))

名稱服務請求有如下的格式:

src > dst: id op? flags qtype qclass name (len)

(nt: 從下文來看, 格式應該是src > dst: id op flags qtype qclass? name (len))

比如有一個實際顯示為:

h2opolo.1538 > helios.domain: 3+ A? ucbvax.berkeley.edu. (37)

主機h2opolo 向helios 上運作的名稱伺服器查詢ucbvax.berkeley.edu 的位址記錄(nt: qtype等于A). 此查詢本身的id号為'3'. 符号

'+'意味着遞歸查詢标志被設定(nt: dns伺服器可向更高層dns伺服器查詢本伺服器不包含的位址記錄). 這個最終通過IP包發送的查詢請求

資料長度為37位元組, 其中不包括UDP和IP協定的頭資料. 因為此查詢操作為預設值(nt | rt: normal one的了解), op字段被省略.

如果op字段沒被省略, 會被顯示在'3' 和'+'之間. 同樣, qclass也是預設值, C_IN, 進而也沒被顯示, 如果沒被忽略, 她會被顯示在'A'之後.

異常檢查會在方括中顯示出附加的域: 如果一個查詢同時包含一個回應(nt: 可了解為, 對之前其他一個請求的回應), 并且此回應包含權威或附加記錄段, 

ancount, nscout, arcount(nt: 具體字段含義需補充) 将被顯示為'[na]', '[nn]', '[nau]', 其中n代表合适的計數. 如果包中以下

回應位(比如AA位, RA位, rcode位), 或者位元組2或3中任何一個'必須為0'的位被置位(nt: 設定為1), '[b2&3]=x' 将被顯示, 其中x表示

頭部位元組2與位元組3進行與操作後的值.

UDP 名稱服務應答

對名稱服務應答的資料包,tcpdump會有如下的顯示格式

src > dst: id op rcode flags a/n/au type class data (len)

比如具體顯示如下:

helios.domain > h2opolo.1538: 3 3/3/7 A 128.32.137.3 (273)

helios.domain > h2opolo.1537: 2 NXDomain* 0/1/0 (97)

第一行表示: helios 對h2opolo 所發送的3号查詢請求回應了3條回答記錄(nt | rt: answer records), 3條名稱伺服器記錄,

以及7條附加的記錄. 第一個回答記錄(nt: 3個回答記錄中的第一個)類型為A(nt: 表示位址), 其資料為internet位址128.32.137.3.

此回應UDP資料包, 包含273位元組的資料(不包含UPD和IP的頭部資料). op字段和rcode字段被忽略(nt: op的實際值為Query, rcode, 即

response code的實際值為NoError), 同樣被忽略的字段還有class 字段(nt | rt: 其值為C_IN, 這也是A類型記錄預設取值)

第二行表示: helios 對h2opolo 所發送的2号查詢請求做了回應. 回應中, rcode編碼為NXDomain(nt: 表示不存在的域)), 沒有回答記錄,

但包含一個名稱伺服器記錄, 不包含權威伺服器記錄(nt | ck: 從上文來看, 此處的authority records 就是上文中對應的additional

records). '*'表示權威伺服器回答标志被設定(nt: 進而additional records就表示的是authority records).

由于沒有回答記錄, type, class, data字段都被忽略.

flag字段還有可能出現其他一些字元, 比如'-'(nt: 表示可遞歸地查詢, 即RA 标志沒有被設定), '|'(nt: 表示被截斷的消息, 即TC 标志

被置位). 如果應答(nt | ct: 可了解為, 包含名稱服務應答的UDP資料包, tcpdump知道這類資料包該怎樣解析其資料)的'question'段一個條

目(entry)都不包含(nt: 每個條目的含義, 需補充),'[nq]' 會被列印出來.

要注意的是:名稱伺服器的請求和應答資料量比較大, 而預設的68位元組的抓取長度(nt: snaplen, 可了解為tcpdump的一個設定選項)可能不足以抓取

資料包的全部内容. 如果你真的需要仔細檢視名稱伺服器的負載, 可以通過tcpdump 的-s 選項來擴大snaplen值.

tcpdump 已可以對SMB/CIFS/NBT相關應用的資料包内容進行解碼(nt: 分别為'Server Message Block Common', 'Internet File System'

'在TCP/IP上實作的網絡協定NETBIOS的簡稱'. 這幾個服務通常使用UDP的137/138以及TCP的139端口). 原來的對IPX和NetBEUI SMB資料包的

解碼能力依然可以被使用(nt: NetBEUI為NETBIOS的增強版本).

tcpdump預設隻按照最簡約模式對相應資料包進行解碼, 如果我們想要詳盡的解碼資訊可以使用其-v 啟動選現. 要注意的是, -v 會産生非常詳細的資訊,

比如對單一的一個SMB資料包, 将産生一螢幕或更多的資訊, 是以此選項, 确有需要才使用.

關于SMB資料包格式的資訊, 以及每個域的含義可以參看www.cifs.org 或者samba.org 鏡像站點的pub/samba/specs/ 目錄. linux 上的SMB 更新檔

(nt | rt: patch)由 Andrew Tridgell ([email protected])提供.

NFS 請求和回應

tcpdump對Sun NFS(網絡檔案系統)請求和回應的UDP資料包有如下格式的列印輸出:

src.xid > dst.nfs: len op args

src.nfs > dst.xid: reply stat len op results

以下是一組具體的輸出資料

sushi.6709 > wrl.nfs: 112 readlink fh 21,24/10.73165

wrl.nfs > sushi.6709: reply ok 40 readlink "../var"

sushi.201b > wrl.nfs:

144 lookup fh 9,74/4096.6878 "xcolors"

wrl.nfs > sushi.201b:

reply ok 128 lookup fh 9,74/4134.3150

第一行輸出表明: 主機sushi向主機wrl發送了一個'交換請求'(nt: transaction), 此請求的id為6709(注意, 主機名字後是交換

請求id号, 而不是源端口号). 此請求資料為112位元組, 其中不包括UDP和IP頭部的長度. 操作類型為readlink(nt: 即此操作為讀符号連結操作),

操作參數為fh 21,24/10.73165(nt: 可按實際運作環境, 解析如下, fd 表示描述的為檔案句柄, 21,24 表示此句柄所對應設

備的主/從裝置号對, 10表示此句柄所對應的i節點編号(nt:每個檔案都會在作業系統中對應一個i節點, 限于unix類系統中),

73165是一個編号(nt: 可了解為辨別此請求的一個随機數, 具體含義需補充)).

第二行中, wrl 做了'ok'的回應, 并且在results 字段中傳回了sushi想要讀的符号連接配接的真實目錄(nt: 即sushi要求讀的符号連接配接其實是一個目錄).

第三行表明: sushi 再次請求 wrl 在'fh 9,74/4096.6878'所描述的目錄中查找'xcolors'檔案. 需要注意的是, 每行所顯示的資料含義依賴于其中op字段的

類型(nt: 不同op 所對應args 含義不相同), 其格式遵循NFS 協定, 追求簡潔明了.

如果tcpdump 的-v選項(詳細列印選項) 被設定, 附加的資訊将被顯示. 比如:

sushi.1372a > wrl.nfs:

148 read fh 21,11/12.195 8192 bytes @ 24576

wrl.nfs > sushi.1372a:

reply ok 1472 read REG 100664 ids 417/0 sz 29388

(-v 選項一般還會列印出IP頭部的TTL, ID, length, 以及fragmentation 域, 但在此例中, 都略過了(nt: 可了解為,簡潔起見, 做了删減))

在第一行, sushi 請求wrl 從檔案 21,11/12.195(nt: 格式在上面有描述)中, 自偏移24576位元組處開始, 讀取8192位元組資料.

Wrl 回應讀取成功; 由于第二行隻是回應請求的開頭片段, 是以隻包含1472位元組(其他的資料将在接着的reply片段中到來, 但這些資料包不會再有NFS

頭, 甚至UDP頭資訊也為空(nt: 源和目的應該要有), 這将導緻這些片段不能滿足過濾條件, 進而沒有被列印). -v 選項除了顯示檔案資料資訊, 還會顯示

附加顯示檔案屬性資訊: file type(檔案類型, ''REG'' 表示普通檔案), file mode(檔案存取模式, 8進制表示的), uid 和gid(nt: 檔案屬主和

組屬主), file size (檔案大小).

如果-v 标志被多次重複給出(nt: 如-vv), tcpdump會顯示更加詳細的資訊.

必須要注意的是, NFS 請求包中資料比較多, 如果tcpdump 的snaplen(nt: 抓取長度) 取太短将不能顯示其詳細資訊. 可使用

'-s 192'來增加snaplen, 這可用以監測NFS應用的網絡負載(nt: traffic).

NFS 的回應包并不嚴格的緊随之前相應的請求包(nt: RPC operation). 進而, tcpdump 會跟蹤最近收到的一系列請求包, 再通過其

交換序号(nt: transaction ID)與相應請求包相比對. 這可能産生一個問題, 如果回應包來得太遲, 超出tcpdump 對相應請求包的跟蹤範圍,

該回應包将不能被分析.

AFS(nt: Andrew 檔案系統, Transarc , 未知, 需補充)請求和回應有如下的答應

src.sport > dst.dport: rx packet-type

src.sport > dst.dport: rx packet-type service call call-name args

src.sport > dst.dport: rx packet-type service reply call-name args

elvis.7001 > pike.afsfs:

rx data fs call rename old fid 536876964/1/1 ".newsrc.new"

new fid 536876964/1/1 ".newsrc"

pike.afsfs > elvis.7001: rx data fs reply rename

在第一行, 主機elvis 向pike 發送了一個RX資料包.

這是一個對于檔案服務的請求資料包(nt: RX data packet, 發送資料包 , 可了解為發送包過去, 進而請求對方的服務), 這也是一個RPC

調用的開始(nt: RPC, remote procedure call). 此RPC 請求pike 執行rename(nt: 重命名) 操作, 并指定了相關的參數:

原目錄描述符為536876964/1/1, 原檔案名為 '.newsrc.new', 新目錄描述符為536876964/1/1, 新檔案名為 '.newsrc'.

主機pike 對此rename操作的RPC請求作了回應(回應表示rename操作成功, 因為回應的是包含資料内容的包而不是異常包).

一般來說, 所有的'AFS RPC'請求被顯示時, 會被冠以一個名字(nt: 即decode, 解碼), 這個名字往往就是RPC請求的操作名.

并且, 這些RPC請求的部分參數在顯示時, 也會被冠以一個名字(nt | rt: 即decode, 解碼, 一般來說也是取名也很直接, 比如,

一個interesting 參數, 顯示的時候就會直接是'interesting', 含義拗口, 需再翻).

這種顯示格式的設計初衷為'一看就懂', 但對于不熟悉AFS 和 RX 工作原理的人可能不是很

有用(nt: 還是不用管, 書面吓吓你的, 往下看就行).

如果 -v(詳細)标志被重複給出(nt: 如-vv), tcpdump 會列印出确認包(nt: 可了解為, 與應答包有差別的包)以及附加頭部資訊

(nt: 可了解為, 所有包, 而不僅僅是确認包的附加頭部資訊), 比如, RX call ID(請求包中'請求調用'的ID),

call number('請求調用'的編号), sequence number(nt: 包順序号),

serial number(nt | rt: 可了解為與包中資料相關的另一個順信号, 具體含義需補充), 請求包的辨別. (nt: 接下來一段為重複描述,

是以略去了), 此外确認包中的MTU協商資訊也會被列印出來(nt: 确認包為相對于請求包的确認包, Maximum Transmission Unit, 最大傳輸單元).

如果 -v 選項被重複了三次(nt: 如-vvv), 那麼AFS應用類型資料包的'安全索引'('security index')以及'服務索引'('service id')将會

被列印.

對于表示異常的資料包(nt: abort packet, 可了解為, 此包就是用來通知接受者某種異常已發生), tcpdump 會列印出錯誤号(error codes).

但對于Ubik beacon packets(nt: Ubik 燈塔訓示包, Ubik可了解為特殊的通信協定, beacon packets, 燈塔資料包, 可了解為指明通信中

關鍵資訊的一些資料包), 錯誤号不會被列印, 因為對于Ubik 協定, 異常資料包不是表示錯誤, 相反卻是表示一種肯定應答(nt: 即, yes vote).

AFS 請求資料量大, 參數也多, 是以要求tcpdump的 snaplen 比較大, 一般可通過啟動tcpdump時設定選項'-s 256' 來增大snaplen, 以

監測AFS 應用通信負載.

AFS 回應包并不顯示辨別RPC 屬于何種遠端調用. 進而, tcpdump 會跟蹤最近一段時間内的請求包, 并通過call number(調用編号), service ID

(服務索引) 來比對收到的回應包. 如果回應包不是針對最近一段時間内的請求包, tcpdump将無法解析該包.

(nt | rt: DDP in UDP可了解為, DDP, The AppleTalk Data Delivery Protocol,

相當于支援KIP AppleTalk協定棧的網絡層協定, 而DDP 本身又是通過UDP來傳輸的,

即在UDP 上實作的用于其他網絡的網絡層,KIP AppleTalk是蘋果公司開發的整套網絡協定棧).

AppleTalk DDP 資料包被封裝在UDP資料包中, 其解封裝(nt: 相當于解碼)和相應資訊的轉儲也遵循DDP 包規則.

(nt:encapsulate, 封裝, 相當于編碼, de-encapsulate, 解封裝, 相當于解碼, dump, 轉儲, 通常就是指對其資訊進行列印).

/etc/atalk.names 檔案中包含了AppleTalk 網絡和節點的數字辨別到名稱的對應關系. 其檔案格式通常如下所示:

number name

1.254 ether

16.1 icsd-net

1.254.110 ace

頭兩行表示有兩個AppleTalk 網絡. 第三行給出了特定網絡上的主機(一個主機會用3個位元組來辨別,

而一個網絡的辨別通常隻有兩個位元組, 這也是兩者辨別的主要差別)(nt: 1.254.110 可了解為ether網絡上的ace主機).

辨別與其對應的名字之間必須要用空白分開. 除了以上内容, /etc/atalk.names中還包含空行以及注釋行(以'#'開始的行).

AppleTalk 完整網絡位址将以如下格式顯示:

net.host.port

以下為一段具體顯示:

144.1.209.2 > icsd-net.112.220

office.2 > icsd-net.112.220

jssmag.149.235 > icsd-net.2

(如果/etc/atalk.names 檔案不存在, 或者沒有相應AppleTalk 主機/網絡的條目, 資料包的網絡位址将以數字形式顯示).

在第一行中, 網絡144.1上的節點209通過2端口,向網絡icsd-net上監聽在220端口的112節點發送了一個NBP應用資料包

(nt | rt: NBP, name binding protocol, 名稱綁定協定, 從資料來看, NBP伺服器會在端口2提供此服務.

'DDP port 2' 可了解為'DDP 對應傳輸層的端口2', DDP本身沒有端口的概念, 這點未确定, 需補充).

第二行與第一行類似, 隻是源的全部位址可用'office'進行辨別.

第三行表示: jssmag網絡上的149節點通過235向icsd-net網絡上的所有節點的2端口(NBP端口)發送了資料包.(需要注意的是,

在AppleTalk 網絡中如果位址中沒有節點, 則表示廣播位址, 進而節點辨別和網絡辨別最好在/etc/atalk.names有所差別.

nt: 否則一個辨別x.port 無法确定x是指一個網絡上所有主機的port口還是指定主機x的port口).

tcpdump 可解析NBP (名稱綁定協定) and ATP (AppleTalk傳輸協定)資料包, 對于其他應用層的協定, 隻會列印出相應協定名字(

如果此協定沒有注冊一個通用名字, 隻會列印其協定号)以及資料包的大小.

NBP 資料包會按照如下格式顯示:

icsd-net.112.220 > jssmag.2: nbp-lkup 190: "=:LaserWriter@*"

jssmag.209.2 > icsd-net.112.220: nbp-reply 190: "RM1140:LaserWriter@*" 250

techpit.2 > icsd-net.112.220: nbp-reply 190: "techpit:LaserWriter@*" 186

第一行表示: 網絡icsd-net 中的節點112 通過220端口向網絡jssmag 中所有節點的端口2發送了對'LaserWriter'的名稱查詢請求(nt:

此處名稱可了解為一個資源的名稱, 比如列印機). 此查詢請求的序列号為190.

第二行表示: 網絡jssmag 中的節點209 通過2端口向icsd-net.112節點的端口220進行了回應: 我有'LaserWriter'資源, 其資源名稱

為'RM1140', 并且在端口250上提供改資源的服務. 此回應的序列号為190, 對應之前查詢的序列号.

第三行也是對第一行請求的回應: 節點techpit 通過2端口向icsd-net.112節點的端口220進行了回應:我有'LaserWriter'資源, 其資源名稱

為'techpit', 并且在端口186上提供改資源的服務. 此回應的序列号為190, 對應之前查詢的序列号.

ATP 資料包的顯示格式如下:

jssmag.209.165 > helios.132: atp-req 12266<0-7> 0xae030001

helios.132 > jssmag.209.165: atp-resp 12266:0 (512) 0xae040000

helios.132 > jssmag.209.165: atp-resp 12266:1 (512) 0xae040000

helios.132 > jssmag.209.165: atp-resp 12266:2 (512) 0xae040000

helios.132 > jssmag.209.165: atp-resp 12266:3 (512) 0xae040000

helios.132 > jssmag.209.165: atp-resp 12266:5 (512) 0xae040000

helios.132 > jssmag.209.165: atp-resp 12266:6 (512) 0xae040000

helios.132 > jssmag.209.165: atp-resp*12266:7 (512) 0xae040000

jssmag.209.165 > helios.132: atp-req 12266<3,5> 0xae030001

jssmag.209.165 > helios.132: atp-rel 12266<0-7> 0xae030001

jssmag.209.133 > helios.132: atp-req* 12267<0-7> 0xae030002

第一行表示節點 Jssmag.209 向節點helios 發送了一個會話編号為12266的請求包, 請求helios

回應8個資料包(這8個資料包的順序号為0-7(nt: 順序号與會話編号不同, 後者為一次完整傳輸的編号,

前者為該傳輸中每個資料包的編号. transaction, 會話, 通常也被叫做傳輸)). 行尾的16進制數字表示

該請求包中'userdata'域的值(nt: 從下文來看, 這并沒有把所有使用者資料都列印出來 ).

Helios 回應了8個512位元組的資料包. 跟在會話編号(nt: 12266)後的數字表示該資料包在該會話中的順序号.

括号中的數字表示該資料包中資料的大小, 這不包括atp 的頭部. 在順序号為7資料包(第8行)外帶了一個'*'号,

表示該資料包的EOM 标志被設定了.(nt: EOM, End Of Media, 可了解為, 表示一次會話的資料回應完畢).

接下來的第9行表示, Jssmag.209 又向helios 提出了請求: 順序号為3以及5的資料包請重新傳送. Helios 收到這個

請求後重新發送了這個兩個資料包, jssmag.209 再次收到這兩個資料包之後, 主動結束(release)了此會話.

在最後一行, jssmag.209 向helios 發送了開始下一次會話的請求包. 請求包中的'*'表示該包的XO 标志沒有被設定.

(nt: XO, exactly once, 可了解為在該會話中, 資料包在接受方隻被精确地處理一次, 就算對方重複傳送了該資料包,

接收方也隻會處理一次, 這需要用到特别設計的資料包接收和處理機制).

(nt: 指把一個IP資料包分成多個IP資料包)

碎片IP資料包(nt: 即一個大的IP資料包破碎後生成的小IP資料包)有如下兩種顯示格式.

(frag id:size@offset+)

(frag id:size@offset)

(第一種格式表示, 此碎片之後還有後續碎片. 第二種格式表示, 此碎片為最後一個碎片.)

id 表示破碎編号(nt: 從下文來看, 會為每個要破碎的大IP包配置設定一個破碎編号, 以便區分每個小碎片是否由同一資料包破碎而來).

size 表示此碎片的大小 , 不包含碎片頭部資料. offset表示此碎片所含資料在原始整個IP包中的偏移((nt: 從下文來看,

一個IP資料包是作為一個整體被破碎的, 包括頭和資料, 而不隻是資料被分割).

每個碎片都會使tcpdump産生相應的輸出列印. 第一個碎片包含了高層協定的頭資料(nt:從下文來看, 被破碎IP資料包中相應tcp頭以及

IP頭都放在了第一個碎片中 ), 進而tcpdump會針對第一個碎片顯示這些資訊, 并接着顯示此碎片本身的資訊. 其後的一些碎片并不包含

高層協定頭資訊, 進而隻會在顯示源和目的之後顯示碎片本身的資訊. 以下有一個例子: 這是一個從arizona.edu 到lbl-rtsg.arpa

途經CSNET網絡(nt: CSNET connection 可了解為建立在CSNET 網絡上的連接配接)的ftp應用通信片段:

arizona.ftp-data > rtsg.1170: . 1024:1332(308) ack 1 win 4096 (frag 595a:328@0+)

arizona > rtsg: (frag 595a:204@328)

rtsg.1170 > arizona.ftp-data: . ack 1536 win 2560

有幾點值得注意:

第一, 第二行的列印中, 位址後面沒有端口号.

這是因為TCP協定資訊都放到了第一個碎片中, 當顯示第二個碎片時, 我們無法知道此碎片所對應TCP包的順序号.

第二, 從第一行的資訊中, 可以發現arizona需要向rtsg發送308位元組的使用者資料, 而事實是, 相應IP包經破碎後會總共産生512位元組

資料(第一個碎片包含308位元組的資料, 第二個碎片包含204個位元組的資料, 這超過了308位元組). 如果你在查找資料包的順序号空間中的

一些空洞(nt: hole,空洞, 指資料包之間的順序号沒有上下銜接上), 512這個資料就足夠使你迷茫一陣(nt: 其實隻要關注308就行,

不必關注破碎後的資料總量).

一個資料包(nt | rt: 指IP資料包)如果帶有非IP破碎标志, 則顯示時會在最後顯示'(DF)'.(nt: 意味着此IP包沒有被破碎過).

tcpdump的所有輸出列印行中都會預設包含時間戳資訊.

時間戳資訊的顯示格式如下

hh:mm:ss.frac (nt: 小時:分鐘:秒.(nt: frac未知, 需補充))

此時間戳的精度與核心時間精度一緻, 反映的是核心第一次看到對應資料包的時間(nt: saw, 即可對該資料包進行操作). 

而資料包從實體線路傳遞到核心的時間, 以及核心花費在此包上的中斷處理時間都沒有算進來.

tcpdump采用指令行方式,它的指令格式為:

<a></a>

  該表達式用于決定哪些資料包将被列印. 如果不給定條件表達式, 網絡上所有被捕獲的包都會被列印,否則, 隻有滿足條件表達式的資料包被列印.(nt: all packets, 可了解為, 所有被指定接口捕獲的資料包).

  表達式由一個或多個'表達元'組成(nt: primitive, 表達元, 可了解為組成表達式的基本元素). 一個表達元通常由一個或多個修飾符(qualifiers)後跟一個名字或數字表示的id組成(nt: 即, 'qualifiers id').有三種不同類型的修飾符:type, dir以及 proto.

  除以上所描述的表達元('primitive'), 還有其他形式的表達元, 并且與上述表達元格式不同. 比如: gateway, broadcast, less, greater以及算術表達式(nt: 其中每一個都算一種新的表達元). 下面将會對這些表達元進行說明.

  表達元之間還可以通過關鍵字and, or 以及 not 進行連接配接, 進而可組成比較複雜的條件表達式. 比如,`host foo and not port ftp and not port ftp-data'(nt: 其過濾條件可了解為, 資料包的主機為foo,并且端口不是ftp(端口21) 和ftp-data(端口20, 常用端口和名字的對應可在linux 系統中的/etc/service 檔案中找到)).

  為了表示友善, 同樣的修飾符可以被省略, 如'tcp dst port ftp or ftp-data or domain' 與以下的表達式含義相同'tcp dst port ftp or tcp dst port ftp-data or tcp dst port domain'.(nt: 其過濾條件可了解為,包的協定為tcp, 目的端口為ftp 或 ftp-data 或 domain(端口53) ).

  借助括号以及相應操作符,可把表達元組合在一起使用(由于括号是shell的特殊字元, 是以在shell腳本或終端中使用時必須對括号進行轉義, 即'(' 與')'需要分别表達成'\(' 與 '\)').

  有效的操作符有:

  否定操作符的優先級别最高. 與操作和或操作優先級别相同, 并且二者的結合順序是從左到右. 要注意的是, 表達'與操作'時,

  需要顯式寫出'and'操作符, 而不隻是把前後表達元并列放置(nt: 二者中間的'and' 操作符不可省略).

  如果一個辨別符前沒有關鍵字, 則表達式的解析過程中最近用過的關鍵字(往往也是從左往右距離辨別符最近的關鍵字)将被使用.比如,

    not host vs and ace

  是以下表達的精簡:

    not host vs and host ace

  而不是not (host vs or ace).(nt: 前兩者表示, 所需資料包不是來自或發往host vs, 而是來自或發往ace.而後者表示資料包隻要不是來自或發往vs或ac都符合要求)

  整個條件表達式可以被當作一個單獨的字元串參數也可以被當作空格分割的多個參數傳入tcpdump, 後者更友善些. 通常, 如果表達式中包含元字元(nt: 如正規表達式中的'*', '.'以及shell中的'('等字元), 最好還是使用單獨字元串的方式傳入. 這時,整個表達式需要被單引号括起來. 多參數的傳入方式中, 所有參數最終還是被空格串聯在一起, 作為一個字元串被解析.

(nt: True 在以下的描述中含義為: 相應條件表達式中隻含有以下所列的一個特定表達元, 此時表達式為真, 即條件得到滿足)

dst host host

如果IPv4/v6 資料包的目的域是host, 則與此對應的條件表達式為真.host 可以是一個ip位址, 也可以是一個主機名.

src host host

如果IPv4/v6 資料包的源域是host, 則與此對應的條件表達式為真.

host 可以是一個ip位址, 也可以是一個主機名.

host host

如果IPv4/v6資料包的源或目的位址是 host, 則與此對應的條件表達式為真.以上的幾個host 表達式之前可以添加以下關鍵字:ip, arp, rarp, 以及 ip6.比如:

ip host host

也可以表達為:

ether proto \ip and host host(nt: 這種表達方式在下面有說明, 其中ip之前需要有\來轉義,因為ip 對tcpdump 來說已經是一個關鍵字了.)

如果host 是一個擁有多個IP 的主機, 那麼任何一個位址都會用于包的比對(nt: 即發向host 的資料包的目的位址可以是這幾個IP中的任何一個, 從host 接收的資料包的源位址也可以是這幾個IP中的任何一個).

ether dst ehost

如果資料包(nt: 指tcpdump 可抓取的資料包, 包括ip 資料包, tcp資料包)的以太網目标位址是ehost,則與此對應的條件表達式為真. Ehost 可以是/etc/ethers 檔案中的名字或一個數字位址(nt: 可通過 man ethers 看到對/etc/ethers 檔案的描述, 樣例中用的是數字位址)

ether src ehost

如果資料包的以太網源位址是ehost, 則與此對應的條件表達式為真.

ether host ehost

如果資料包的以太網源位址或目标位址是ehost, 則與此對應的條件表達式為真.

gateway host

如果資料包的網關位址是host, 則與此對應的條件表達式為真. 需要注意的是, 這裡的網關位址是指以太網位址, 而不是IP 位址(nt | rt: I.e., 例如, 可了解為'注意'.the Ethernet source or destination address, 以太網源和目标位址, 可了解為, 指代上句中的'網關位址' ).host 必須是名字而不是數字, 并且必須在機器的'主機名-ip位址'以及'主機名-以太位址'兩大映射關系中 有其條目(前一映射關系可通過/etc/hosts檔案, DNS 或 NIS得到, 而後一映射關系可通過/etc/ethers 檔案得到. nt: /etc/ethers并不一定存在 , 可通過man ethers 看到其資料格式, 如何建立該檔案, 未知,需補充).也就是說host 的含義是 ether host ehost 而不是 host host, 并且ehost必須是名字而不是數字.

目前, 該選項在支援IPv6位址格式的配置環境中不起作用(nt: configuration, 配置環境, 可了解為,通信雙方的網絡配置).

dst net net

如果資料包的目标位址(IPv4或IPv6格式)的網絡号字段為 net, 則與此對應的條件表達式為真.

net 可以是從網絡資料庫檔案/etc/networks 中的名字, 也可以是一個數字形式的網絡編号.

一個數字IPv4 網絡編号将以點分四元組(比如, 192.168.1.0), 或點分三元組(比如, 192.168.1 ), 或點分二進制組(比如, 172.16), 或單一單元組(比如, 10)來表達;

對應于這四種情況的網絡掩碼分别是:四元組:255.255.255.255(這也意味着對net 的比對如同對主機位址(host)的比對:位址的四個部分都用到了),三元組:255.255.255.0, 二進制組: 255.255.0.0, 一進制組:255.0.0.0.

對于IPv6 的位址格式, 網絡編号必須全部寫出來(8個部分必須全部寫出來); 相應網絡掩碼為:

ff:ff:ff:ff:ff:ff:ff:ff, 是以IPv6 的網絡比對是真正的'host'方式的比對(nt | rt | rc:位址的8個部分都會用到,是否不屬于網絡的位元組填寫0, 需接下來補充), 但同時需要一個網絡掩碼長度參數來具體指定前面多少位元組為網絡掩碼(nt: 可通過下面的net net/len 來指定)

src net net

如果資料包的源位址(IPv4或IPv6格式)的網絡号字段為 net, 則與此對應的條件表達式為真.

net net

如果資料包的源或目的位址(IPv4或IPv6格式)的網絡号字段為 net, 則與此對應的條件表達式為真.

net net mask netmask

如果資料包的源或目的位址(IPv4或IPv6格式)的網絡掩碼與netmask 比對, 則與此對應的條件表達式為真.此選項之前還可以配合src和dst來比對源網絡位址或目标網絡位址(nt: 比如 src net net mask 255.255.255.0).該選項對于ipv6 網絡位址無效.

net net/len

如果資料包的源或目的位址(IPv4或IPv6格式)的網絡編号字段的比特數與len相同, 則與此對應的條件表達式為真.此選項之前還可以配合src和dst來比對源網絡位址或目标網絡位址(nt | rt | tt: src net net/24, 表示需要比對源位址的網絡編号有24位的資料包).

dst port port

如果資料包(包括ip/tcp, ip/udp, ip6/tcp or ip6/udp協定)的目的端口為port, 則與此對應的條件表達式為真.port 可以是一個數字也可以是一個名字(相應名字可以在/etc/services 中找到該名字, 也可以通過man tcp 和man udp來得到相關描述資訊 ). 如果使用名字, 則該名字對應的端口号和相應使用的協定都會被檢查. 如果隻是使用一個數字端口号,則隻有相應端口号被檢查(比如, dst port 513 将會使tcpdump抓取tcp協定的login 服務和udp協定的who 服務資料包, 而port domain 将會使tcpdump 抓取tcp協定的domain 服務資料包, 以及udp 協定的domain 資料包)(nt | rt: ambiguous name is used 不可了解, 需補充).

src port port

如果資料包的源端口為port, 則與此對應的條件表達式為真.

port port

如果資料包的源或目的端口為port, 則與此對應的條件表達式為真.

dst portrange port1-port2

如果資料包(包括ip/tcp, ip/udp, ip6/tcp or ip6/udp協定)的目的端口屬于port1到port2這個端口範圍(包括port1, port2), 則與此對應的條件表達式為真. tcpdump 對port1 和port2 解析與對port 的解析一緻(nt:在dst port port 選項的描述中有說明).

src portrange port1-port2

如果資料包的源端口屬于port1到port2這個端口範圍(包括 port1, port2), 則與此對應的條件表達式為真.

portrange port1-port2

如果資料包的源端口或目的端口屬于port1到port2這個端口範圍(包括 port1, port2), 則與此對應的條件表達式為真.

以上關于port 的選項都可以在其前面添加關鍵字:tcp 或者udp, 比如:

tcp src port port

這将使tcpdump 隻抓取源端口是port 的tcp資料包.

less length

如果資料包的長度比length 小或等于length, 則與此對應的條件表達式為真. 這與'len &lt;= length' 的含義一緻.

greater length

如果資料包的長度比length 大或等于length, 則與此對應的條件表達式為真. 這與'len &gt;= length' 的含義一緻.

ip proto protocol

如果資料包為ipv4資料包并且其協定類型為protocol, 則與此對應的條件表達式為真.

Protocol 可以是一個數字也可以是名字, 比如:icmp6, igmp, igrp(nt: Interior Gateway Routing Protocol,内部網關路由協定), pim(Protocol Independent Multicast, 獨立多點傳播協定, 應用于多點傳播路由器),ah, esp(nt: ah, 認證頭, esp 安全負載封裝, 這兩者會用在IP包的安全傳輸機制中 ), vrrp(Virtual Router Redundancy Protocol, 虛拟路由器備援協定), udp, or tcp. 由于tcp , udp 以及icmp是tcpdump 的關鍵字,是以在這些協定名字之前必須要用\來進行轉義(如果在C-shell 中需要用\\來進行轉義). 注意此表達元不會把資料包中協定頭鍊中所有協定頭内容全部列印出來(nt: 實際上隻會列印指定協定的一些頭部資訊, 比如可以用tcpdump -i eth0 'ip proto \tcp and host 192.168.3.144', 則隻列印主機192.168.3.144 發出或接收的資料包中tcp 協定頭所包含的資訊)

ip6 proto protocol

如果資料包為ipv6資料包并且其協定類型為protocol, 則與此對應的條件表達式為真.

注意此表達元不會把資料包中協定頭鍊中所有協定頭内容全部列印出來

ip6 protochain protocol

如果資料包為ipv6資料包并且其協定鍊中包含類型為protocol協定頭, 則與此對應的條件表達式為真. 比如,

ip6 protochain 6

将比對其協定頭鍊中擁有TCP 協定頭的IPv6資料包.此資料包的IPv6頭和TCP頭之間可能還會包含驗證頭, 路由頭, 或者逐跳尋徑選項頭.

由此所觸發的相應BPF(Berkeley Packets Filter, 可了解為, 在資料鍊路層提供資料包過濾的一種機制)代碼比較繁瑣,

并且BPF優化代碼也未能照顧到此部分, 進而此選項所觸發的包比對可能會比較慢.

ip protochain protocol

與ip6 protochain protocol 含義相同, 但這用在IPv4資料包.

ether broadcast

如果資料包是以太網廣播資料包, 則與此對應的條件表達式為真. ether 關鍵字是可選的.

ip broadcast

如果資料包是IPv4廣播資料包, 則與此對應的條件表達式為真. 這将使tcpdump 檢查廣播位址是否符合全0和全1的一些約定,并查找網絡接口的網絡掩碼(網絡接口為當時在其上抓包的網絡接口).

如果抓包所在網絡接口的網絡掩碼不合法, 或者此接口根本就沒有設定相應網絡位址和網絡, 亦或是在linux下的'any'網絡接口上抓包(此'any'接口可以收到系統中不止一個接口的資料包(nt: 實際上, 可了解為系統中所有可用的接口)),網絡掩碼的檢查不能正常進行.

ether multicast

如果資料包是一個以太網多點廣播資料包(nt: 多點廣播, 可了解為把消息同時傳遞給一組目的位址, 而不是網絡中所有位址,後者為可稱為廣播(broadcast)), 則與此對應的條件表達式為真. 關鍵字ether 可以省略. 此選項的含義與以下條件表達式含義一緻:`ether[0] &amp; 1 != 0'(nt: 可了解為, 以太網資料包中第0個位元組的最低位是1, 這意味這是一個多點廣播資料包).

ip multicast

如果資料包是ipv4多點廣播資料包, 則與此對應的條件表達式為真.

ip6 multicast

如果資料包是ipv6多點廣播資料包, 則與此對應的條件表達式為真.

ether proto protocol

如果資料包屬于以下以太協定類型, 則與此對應的條件表達式為真.

協定(protocol)字段, 可以是數字或以下所列出了名字: ip, ip6, arp, rarp, atalk(AppleTalk網絡協定),

aarp(nt: AppleTalk Address Resolution Protocol, AppleTalk網絡的位址解析協定),

decnet(nt: 一個由DEC公司所提供的網絡協定棧), sca(nt: 未知, 需補充),

lat(Local Area Transport, 區域傳輸協定, 由DEC公司開發的以太網主機互聯協定),

mopdl, moprc, iso(nt: 未知, 需補充), stp(Spanning tree protocol, 生成樹協定, 可用于防止網絡中産生連結循環),

ipx(nt: Internetwork Packet Exchange, Novell 網絡中使用的網絡層協定), 或者

netbeui(nt: NetBIOS Extended User Interface,可了解為, 網絡基本輸入輸出系統接口擴充).

protocol字段可以是一個數字或以下協定名之一:ip, ip6, arp, rarp, atalk, aarp, decnet, sca, lat,

mopdl, moprc, iso, stp, ipx, 或者netbeui.

必須要注意的是辨別符也是關鍵字, 進而必須通過'\'來進行轉義.

(SNAP:子網接入協定 (SubNetwork Access Protocol))

在光纖分布式資料網絡接口(其表達元形式可以是'fddi protocol arp'), 令牌環網(其表達元形式可以是'tr protocol arp'),

以及IEEE 802.11 無線區域網路(其表達元形式可以是'wlan protocol arp')中, protocol

辨別符來自802.2 邏輯鍊路控制層頭,

在FDDI, Token Ring 或 802.1頭中會包含此邏輯鍊路控制層頭.

當以這些網絡上的相應的協定辨別為過濾條件時, tcpdump隻是檢查LLC頭部中以0x000000為組成單元辨別符(OUI, 0x000000

辨別一個内部以太網)的一段'SNAP格式結構'中的protocol ID 域, 而不會管包中是否有一段OUI為0x000000的'SNAP格式

結構'(nt: SNAP, SubNetwork Access Protocol,子網接入協定 ). 以下例外:

iso tcpdump 會檢查LLC頭部中的DSAP域(Destination service Access Point, 目标服務接入點)和

SSAP域(源服務接入點).(nt: iso 協定未知, 需補充)

stp 以及 netbeui

tcpdump 将會檢查LLC 頭部中的目标服務接入點(Destination service Access Point);

atalk

tcpdump 将會檢查LLC 頭部中以0x080007 為OUI辨別的'SNAP格式結構', 并會檢查AppleTalk etype域.

(nt: AppleTalk etype 是否位于SNAP格式結構中, 未知, 需補充).

此外, 在以太網中, 對于ether proto protocol 選項, tcpdump 會為 protocol 所指定的協定檢查

以太網類型域(the Ethernet type field), 但以下這些協定除外:

iso, stp, and netbeui

tcpdump 将會檢查802.3 實體幀以及LLC 頭(這兩種檢查與FDDI, TR, 802.11網絡中的相應檢查一緻);

(nt: 802.3, 了解為IEEE 802.3, 其為一系列IEEE 标準的集合. 此集合定義了有線以太網絡中的實體層以及資料

鍊路層的媒體接入控制子層. stp 在上文已有描述)

tcpdump 将會檢查以太網實體幀中的AppleTalk etype 域 , 同時也會檢查資料包中LLC頭部中的'SNAP格式結構'

(這兩種檢查與FDDI, TR, 802.11網絡中的相應檢查一緻)

aarp tcpdump 将會檢查AppleTalk ARP etype 域, 此域或存在于以太網實體幀中, 或存在于LLC(由802.2 所定義)的

'SNAP格式結構'中, 當為後者時, 該'SNAP格式結構'的OUI辨別為0x000000;

(nt: 802.2, 可了解為, IEEE802.2, 其中定義了邏輯鍊路控制層(LLC), 該層對應于OSI 網絡模型中資料鍊路層的上層部分.

LLC 層為使用資料鍊路層的使用者提供了一個統一的接口(通常使用者是網絡層). LLC層以下是媒體接入控制層(nt: MAC層,

對應于資料鍊路層的下層部分).該層的實作以及工作方式會根據不同實體傳輸媒介的不同而有所差別(比如, 以太網, 令牌環網,

光纖分布資料接口(nt: 實際可了解為一種光纖網絡), 無線區域網路(802.11), 等等.)

ipx tcpdump 将會檢查實體以太幀中的IPX etype域, LLC頭中的IPX DSAP域,無LLC頭并對IPX進行了封裝的802.3幀,

以及LLC 頭部'SNAP格式結構'中的IPX etype 域(nt | rt: SNAP frame, 可了解為, LLC 頭中的'SNAP格式結構'.

該含義屬初步了解階段, 需補充).

decnet src host

如果資料包中DECNET源位址為host, 則與此對應的條件表達式為真.

(nt:decnet, 由Digital Equipment Corporation 開發, 最早用于PDP-11 機器互聯的網絡協定)

decnet dst host

如果資料包中DECNET目的位址為host, 則與此對應的條件表達式為真.

(nt: decnet 在上文已有說明)

decnet host host

如果資料包中DECNET目的位址或DECNET源位址為host, 則與此對應的條件表達式為真.

ifname interface

如果資料包已被标記為從指定的網絡接口中接收的, 則與此對應的條件表達式為真.

(此選項隻适用于被OpenBSD中pf程式做過标記的包(nt: pf, packet filter, 可了解為OpenBSD中的防火牆程式))

on interface

與 ifname interface 含義一緻.

rnr num

如果資料包已被标記為比對PF的規則, 則與此對應的條件表達式為真.

rulenum num

與 rulenum num 含義一緻.

reason code

如果資料包已被标記為包含PF的比對結果代碼, 則與此對應的條件表達式為真.有效的結果代碼有: match, bad-offset,

fragment, short, normalize, 以及memory.

rset name

如果資料包已被标記為比對指定的規則集, 則與此對應的條件表達式為真.

ruleset name

與 rset name 含義一緻.

srnr num

如果資料包已被标記為比對指定的規則集中的特定規則(nt: specified PF rule number, 特定規則編号, 即特定規則),

則與此對應的條件表達式為真.(此選項隻适用于被OpenBSD中pf程式做過标記的包(nt: pf, packet filter, 可了解為

OpenBSD中的防火牆程式))

subrulenum num

與 srnr 含義一緻.

action act

如果包被記錄時PF會執行act指定的動作, 則與此對應的條件表達式為真. 有效的動作有: pass, block.

ip, ip6, arp, rarp, atalk, aarp, decnet, iso, stp, ipx, netbeui

與以下表達元含義一緻:

ether proto p

p是以上協定中的一個.

lat, moprc, mopdl

p是以上協定中的一個. 必須要注意的是tcpdump目前還不能分析這些協定.

vlan [vlan_id]

如果資料包為IEEE802.1Q VLAN 資料包, 則與此對應的條件表達式為真.

(nt: IEEE802.1Q VLAN, 即IEEE802.1Q 虛拟網絡協定, 此協定用于不同網絡的之間的互聯).

如果[vlan_id] 被指定, 則隻有資料包含有指定的虛拟網絡id(vlan_id), 則與此對應的條件表達式為真.

要注意的是, 對于VLAN資料包, 在表達式中遇到的第一個vlan關鍵字會改變表達式中接下來關鍵字所對應資料包中資料的

開始位置(即解碼偏移). 在VLAN網絡體系中過濾資料包時, vlan [vlan_id]表達式可以被多次使用. 關鍵字vlan每出現一次都會增加

4位元組過濾偏移(nt: 過濾偏移, 可了解為上面的解碼偏移).

例如:

vlan 100 &amp;&amp; vlan 200

表示: 過濾封裝在VLAN100中的VLAN200網絡上的資料包

再例如:

vlan &amp;&amp; vlan 300 &amp;&amp; ip

表示: 過濾封裝在VLAN300 網絡中的IPv4資料包, 而VLAN300網絡又被更外層的VLAN封裝

mpls [label_num]

如果資料包為MPLS資料包, 則與此對應的條件表達式為真.

(nt: MPLS, Multi-Protocol Label Switch, 多協定标簽交換, 一種在開放的通信網上利用标簽引導資料傳輸的技術).

如果[label_num] 被指定, 則隻有資料包含有指定的标簽id(label_num), 則與此對應的條件表達式為真.

要注意的是, 對于内含MPLS資訊的IP資料包(即MPLS資料包), 在表達式中遇到的第一個MPLS關鍵字會改變表達式中接下來關鍵字所對應資料包中資料的

開始位置(即解碼偏移). 在MPLS網絡體系中過濾資料包時, mpls [label_num]表達式可以被多次使用. 關鍵字mpls每出現一次都會增加

mpls 100000 &amp;&amp; mpls 1024

表示: 過濾外層标簽為100000 而層标簽為1024的資料包

再如:

mpls &amp;&amp; mpls 1024 &amp;&amp; host 192.9.200.1

表示: 過濾發往或來自192.9.200.1的資料包, 該資料包的内層标簽為1024, 且擁有一個外層标簽.

pppoed

如果資料包為PPP-over-Ethernet的伺服器探尋資料包(nt: Discovery packet,

其ethernet type 為0x8863),則與此對應的條件表達式為真.

(nt: PPP-over-Ethernet, 點對點以太網承載協定, 其點對點的連接配接建立分為Discovery階段(位址發現) 和

PPPoE 會話建立階段 , discovery 資料包就是第一階段發出來的包. ethernet type

是以太幀裡的一個字段,用來指明應用于幀資料字段的協定)

pppoes

如果資料包為PPP-over-Ethernet會話資料包(nt: ethernet type 為0x8864, PPP-over-Ethernet在上文已有說明, 可搜尋

關鍵字'PPP-over-Ethernet'找到其描述), 則與此對應的條件表達式為真.

要注意的是, 對于PPP-over-Ethernet會話資料包, 在表達式中遇到的第一個pppoes關鍵字會改變表達式中接下來關鍵字所對應資料包中資料的

開始位置(即解碼偏移).

pppoes &amp;&amp; ip

表示: 過濾嵌入在PPPoE資料包中的ipv4資料包

tcp, udp, icmp

ip proto p or ip6 proto p

其中p 是以上協定之一(含義分别為: 如果資料包為ipv4或ipv6資料包并且其協定類型為 tcp,udp, 或icmp則與此對

應的條件表達式為真)

iso proto protocol

如果資料包的協定類型為iso-osi協定棧中protocol協定, 則與此對應的條件表達式為真.(nt: [初解]iso-osi 網絡模型中每

層的具體協定與tcp/ip相應層采用的協定不同. iso-osi各層中的具體協定另需補充 )

protocol 可以是一個數字編号, 或以下名字中之一:

clnp, esis, or isis.

(nt: clnp, Connectionless Network Protocol, 這是OSI網絡模型中網絡層協定 , esis, isis 未知, 需補充)

clnp, esis, isis

是以下表達的縮寫

iso proto p

其中p 是以上協定之一

l1, l2, iih, lsp, snp, csnp, psnp

為IS-IS PDU 類型 的縮寫.

(nt: IS-IS PDU, Intermediate system to intermediate system Protocol Data Unit, 中間系統到

中間系統的協定資料單元. OSI(Open Systems Interconnection)網絡由終端系統, 中間系統構成.

終端系統指路由器, 而終端系統指使用者裝置. 路由器形成的本地組稱之為'區域'(Area)和多個區域組成一個'域'(Domain).

IS-IS 提供域内或區域内的路由. l1, l2, iih, lsp, snp, csnp, psnp 表示PDU的類型, 具體含義另需補充)

vpi n

如果資料包為ATM資料包, 則與此對應的條件表達式為真. 對于Solaris 作業系統上的SunATM裝置 ,

如果資料包為ATM資料包, 并且其虛拟路徑辨別為n, 則與此對應的條件表達式為真.

(nt: ATM, Asychronous Transfer Mode, 實際上可了解為由ITU-T(國際電信聯盟電信标準化部門)提出的一個與

TCP/IP中IP層功能等同的一系列協定, 具體協定層次另需補充)

vci n

如果資料包為ATM資料包, 并且其虛拟通道辨別為n, 則與此對應的條件表達式為真.

(nt: ATM, 在上文已有描述)

lane

如果資料包為ATM LANE 資料包, 則與此對應的條件表達式為真. 要注意的是, 如果是模拟以太網的LANE資料包或者

LANE邏輯單元控制包, 表達式中第一個lane關鍵字會改變表達式中随後條件的測試. 如果沒有

指定lane關鍵字, 條件測試将按照資料包中内含LLC(邏輯鍊路層)的ATM包來進行.

llc

如果資料包為ATM資料包, 并且内含LLC則與此對應的條件表達式為真

oamf4s

如果資料包為ATM資料包, 則與此對應的條件表達式為真. 對于Solaris 作業系統上的SunATM裝置 , 如果資料包為ATM資料包

并且是Segment OAM F4 信元(VPI=0 并且 VCI=3), 則與此對應的條件表達式為真.

(nt: OAM, Operation Administration and Maintenance, 操作管理和維護,可了解為:ATM網絡中用于網絡

管理所産生的ATM信元的分類方式.

ATM網絡中傳輸機關為信元, 要傳輸的資料終究會被分割成固定長度(53位元組)的信元,

(初了解: 一條實體線路可被複用, 形成虛拟路徑(virtual path). 而一條虛拟路徑再次被複用, 形成虛拟信道(virtual channel)).

通信雙方的編址方式為:虛拟路徑編号(VPI)/虛拟信道編号(VCI)).

OAM F4 flow 信元又可分為segment 類和end-to-end 類, 其差別未知, 需補充.)

oamf4e

并且是 end-to-end OAM F4 信元(VPI=0 并且 VCI=4), 則與此對應的條件表達式為真.

(nt: OAM 與 end-to-end OAM F4 在上文已有描述, 可搜尋'oamf4s'來定位)

oamf4

并且是 end-to-end 或 segment OAM F4 信元(VPI=0 并且 VCI=3 或者 VCI=4), 則與此對應的條件表達式為真.

oam

(nt: 此選項與oamf4重複, 需确認)

metac

并且是來自'元信令線路'(nt: VPI=0 并且 VCI=1, '元信令線路', meta signaling circuit, 具體含義未知, 需補充),

則與此對應的條件表達式為真.

bcc

并且是來自'廣播信令線路'(nt: VPI=0 并且 VCI=2, '廣播信令線路', broadcast signaling circuit, 具體含義未知, 需補充),

sc

并且是來自'信令線路'(nt: VPI=0 并且 VCI=5, '信令線路', signaling circuit, 具體含義未知, 需補充),

ilmic

并且是來自'ILMI線路'(nt: VPI=0 并且 VCI=16, 'ILMI', Interim Local Management Interface , 可了解為

基于SNMP(簡易網絡管理協定)的用于網絡管理的接口)

connectmsg

并且是來自'信令線路'并且是Q.2931協定中規定的以下幾種消息: Setup, Calling Proceeding, Connect,

Connect Ack, Release, 或者Release Done. 則與此對應的條件表達式為真.

(nt: Q.2931 為ITU(國際電信聯盟)制定的信令協定. 其中規定了在寬帶ISDN絡的使用者接口層建立, 維護, 取消

網絡連接配接的相關步驟.)

metaconnect

并且是來自'元信令線路'并且是Q.2931協定中規定的以下幾種消息: Setup, Calling Proceeding, Connect,

expr relop expr

如果relop 兩側的操作數(expr)滿足relop 指定的關系, 則與此對應的條件表達式為真.

relop 可以是以下關系操作符之一: &gt;, &lt;, &lt;=, =, !=.

expr 是一個算術表達式. 此表達式中可使用整型常量(表示方式與标準C中一緻), 二進制操作符(+, -, *, /, &amp;, |,

&lt;&lt;, &gt;&gt;), 長度操作符, 以及對特定資料包中資料的引用操作符. 要注意的是, 所有的比較操作都預設操作數是無符号的,

例如, 0x80000000 和 0xffffffff 都是大于0的(nt: 對于有符号的比較, 按照補碼規則, 0xffffffff

會小于0). 如果要引用資料包中的資料, 可采用以下表達方式:

proto [expr : size]

proto 的取值可以是以下取值之一:ether, fddi, tr, wlan, ppp, slip, link, ip, arp, rarp,

tcp, udp, icmp, ip6 或者 radio. 這指明了該引用操作所對應的協定層.(ether, fddi, wlan,

tr, ppp, slip and link 對應于資料鍊路層, radio 對應于802.11(wlan,無線區域網路)某些資料包中的附帶的

"radio"頭(nt: 其中描述了波特率, 資料加密等資訊)).

要注意的是, tcp, udp 等上層協定目前隻能應用于網絡層采用為IPv4或IPv6協定的網絡(此限制會在tcpdump未來版本中

進行修改). 對于指定協定的所需資料, 其在包資料中的偏移位元組由expr 來指定.

以上表達中size 是可選的, 用來指明我們關注那部分資料段的長度(nt:通常這段資料

是資料包的一個域), 其長度可以是1, 2, 或4個位元組. 如果不給定size, 預設是1個位元組. 長度操作符的關鍵字為len,

這代碼整個資料包的長度.

例如, 'ether[0] &amp; 1 != 0' 将會使tcpdump 抓取所有多點廣播資料包.(nt: ether[0]位元組的最低位為1表示

資料包目的位址是多點廣播位址). 'ip[0] &amp; 0xf != 5' 對應抓取所有帶有選項的

IPv4資料包. 'ip[6:2] &amp; 0x1fff = 0'對應抓取沒被破碎的IPv4資料包或者

其片段編号為0的已破碎的IPv4資料包. 這種資料檢查方式也适用于tcp和udp資料的引用,

即, tcp[0]對應于TCP 頭中第一個位元組, 而不是對應任何一個中間的位元組.

一些偏移以及域的取值除了可以用數字也可用名字來表達. 以下為可用的一些域(協定頭中的域)的名字: icmptype (指ICMP 協定頭

中type域), icmpcode (指ICMP 協定頭code 域), 以及tcpflags(指TCP協定頭的flags 域)

以下為ICMP 協定頭中type 域的可用取值:

icmp-echoreply, icmp-unreach, icmp-sourcequench, icmp-redirect, icmp-echo, icmp-routeradvert,

icmp-routersolicit, icmp-timx-ceed, icmp-paramprob, icmp-tstamp, icmp-tstampreply,

icmp-ireq, icmp-ireqreply, icmp-maskreq, icmp-maskreply.

以下為TCP 協定頭中flags 域的可用取值:tcp-fin, tcp-syn, tcp-rst, tcp-push,

tcp-ack, tcp-urg.

繼續閱讀