# 網絡基本功(十七):細說tcpdump的妙用(上)
**轉載請在文首保留原文出處:EMC中文支持論壇**[https://community.emc.com/go/chinese](https://community.emc.com/go/chinese)
## 介紹
tcpdump命令最初設計用于觀察TCP/IP性能問題,它是一個用于截取網絡分組,并輸出分組內容的工具。tcpdump可以將網絡中傳送的數據包的報文頭完全截獲下來提供分析,它支持針對網絡層、協議、主機、網絡或端口的過濾,并提供and, or, not等邏輯語句來幫助用戶去掉無用的信息。
## 更多信息
**使用tcpdump:**
Unix命令tee通常用來允許用戶查看并記錄Unix會話的輸出。使用tcpdump結合tee加上-l選項來實現,命令格式如下:
```
bsd1# tcpdump -l? | tee outfile
```
另一種方式是通過-w選項直接將抓取數據寫入文件中。之后通過tcpdump -r選項來讀取。抓取數據可以輸入:
```
bsd1# tcpdump -w rawfile
```
然后將raw文件轉化成text文件:
```
bsd1# tcpdump -r rawfile?? > textfile
```
**tcpdump選項:**
tcpdump選項可劃分為四大類型:控制tcpdump程序行為,控制數據怎樣顯示,控制顯示什么數據,以及過濾命令。
**控制程序行為**
這一類命令行選項影響程序行為,包括數據收集的方式。之前已介紹了兩個例子:-r和-w。-w選項允許用戶將輸出重定向到一個文件,之后可通過-r選項將捕獲數據顯示出來。
如果用戶知道需要捕獲的報文數量或對于數量有一個上限,可使用-c選項。則當達到該數量時程序自動終止,而無需使用kill命令或Ctrl-C。下例中,收集到100個報文之后tcpdump終止:
```
bsd1# tcpdump -c100
```
如果用戶在多余一個網絡接口上運行tcpdump,用戶可以通過-i選項指定接口。在不確定的情況下,可使用ifconfig –a來檢查哪一個接口可用及對應哪一個網絡。例如,一臺機器有兩個C級接口,xl0接口IP地址 205.153.63.238,xl1接口IP地址205.153.61.178。要捕捉205.153.61.0網絡的數據流,使用以下命令:
```
bsd1# tcpdump -i xl1
```
沒有指定接口時,tcpdump默認為最低編號接口。
-p選項將網卡接口設置為非混雜模式。這一選項理論上將限制為捕獲接口上的正常數據流——來自或發往主機,多播數據,以及廣播數據。
-s選項控制數據的截取長度。通常,tcpdump默認為一最大字節數量并只會從單一報文中截取到該數量長度。實際字節數取決于操作系統的設備驅動。通過默認值來截取合適的報文頭,而舍棄不必要的報文數據。
如果用戶需截取更多數據,通過-s選項來指定字節數。也可以用-s來減少截取字節數。對于少于或等于200字節的報文,以下命令會截取完整報文:
bsd1# tcpdump -s200
更長的報文會被縮短為200字節。
**控制信息如何顯示**
-a,-n,-N和-f選項決定了地址信息是如何顯示的。-a選項強制將網絡地址顯示為名稱,-n阻止將地址顯示為名字,-N阻止將域名轉換。-f選項阻止遠端名稱解析。下例中,從sloan.lander.edu (205.153.63.30) ing遠程站點,分別不加選項,-a,-n,-N,-f。(選項-c1限制抓取1個報文)
```
bsd1# tcpdump -c1 host 192.31.7.130
tcpdump: listening on xl0
14:16:35.897342 sloan.lander.edu > cio-sys.cisco.com: icmp: echo request
bsd1# tcpdump -c1 -a host 192.31.7.130
tcpdump: listening on xl0
14:16:14.567917 sloan.lander.edu > cio-sys.cisco.com: icmp: echo request
bsd1# tcpdump -c1 -n host 192.31.7.130
tcpdump: listening on xl0
14:17:09.737597 205.153.63.30 > 192.31.7.130: icmp: echo request
bsd1# tcpdump -c1 -N host 192.31.7.130
tcpdump: listening on xl0
14:17:28.891045 sloan > cio-sys: icmp: echo request
bsd1# tcpdump -c1 -f host 192.31.7.130
tcpdump: listening on xl0
14:17:49.274907 sloan.lander.edu > 192.31.7.130: icmp: echo request
```
默認為-a選項。
-t和-tt選項控制時間戳的打印。-t選項不顯示時間戳而-tt選項顯示無格式的時間戳。以下命令顯示了tcpdump命令無選項,-t選項,-tt選項的同一報文:
```
12:36:54.772066 sloan.lander.edu.1174 > 205.153.63.238.telnet: . ack 3259091394 win 8647 (DF)
sloan.lander.edu.1174 > 205.153.63.238.telnet: . ack 3259091394 win 8647 (DF)
934303014.772066 sloan.lander.edu.1174 > 205.153.63.238.telnet: . ack 3259091394 win 8647 (DF)
```
**控制顯示什么數據**
可以通過-v和-vv選項來打印更多詳細信息。例如,-v選項將會打印TTL字段。要顯示較少信息,使用-q,或quiet選項。一下為同一報文分別使用-q選項,無選項,-v選項,和-vv選項的輸出。
```
12:36:54.772066 sloan.lander.edu.1174 > 205.153.63.238.telnet: tcp 0 (DF)
12:36:54.772066 sloan.lander.edu.1174 > 205.153.63.238.telnet: . ack 3259091394 win 8647 (DF)
12:36:54.772066 sloan.lander.edu.1174 > 205.153.63.238.telnet: . ack 3259091394 win 8647 (DF) (ttl 128, id 45836)
12:36:54.772066 sloan.lander.edu.1174 > 205.153.63.238.telnet: . ack 3259091394 win 8647 (DF) (ttl 128, id 45836)
```
-e選項用于顯示鏈路層頭信息。上例中-e選項的輸出為:
```
12:36:54.772066 0:10:5a:a1:e9:8 0:10:5a:e3:37:c ip 60:
sloan.lander.edu.1174 > 205.153.63.238.telnet: . ack 3259091394 win 8647 (DF)
```
0:10:5a:a1:e9:8是sloan.lander.edu中3Com卡的以太網地址,0:10:5a:e3:37:c是205.153.63.238中3Com卡的以太網地址。
-x選項將報文以十六進制形式dump出來,排除了鏈路層報文頭。-x和-vv選項報文顯示如下:
```
13:57:12.719718 bsd1.lander.edu.1657 > 205.153.60.5.domain: 11587+ A? www.microsoft.com. (35) (ttl 64, id 41353)
???????????????????????? 4500 003f a189 0000 4011 c43a cd99 3db2
???????????????????????? cd99 3c05 0679 0035 002b 06d9 2d43 0100
???????????????????????? 0001 0000 0000 0000 0377 7777 096d 6963
???????????????????????? 726f 736f 6674 0363 6f6d 0000 0100 01
```
(未完待續)
## 參考
Network Troubleshooting Tools
- 介紹
- 網絡基本功(一):細說網絡傳輸
- 網絡基本功(二):細說交換機
- 網絡基本功(三):細說VLAN與Trunk
- 網絡基本功(四):細說路由(上)
- 網絡基本功(五):細說路由(下)
- 網絡基本功(六):鏈路聚合
- 網絡基本功(七):細說IP地址與子網
- 網絡基本功(八):細說TCP滑動窗口
- 網絡基本功(九):細說TCP重傳
- 網絡基本功(十):細說TCP確認機制
- 網絡基本功(十一):TCP窗口調整與流控
- 網絡基本功(十二):細說Linux網絡配置(上)
- 網絡基本功(十三):細說Linux網絡配置(下)
- 網絡基本功(十四):細說診斷工具ping
- 網絡基本功(十五):細說網絡性能監測與實例(上)
- 網絡基本功(十六):細說網絡性能監測與實例(下)
- 網絡基本功(十七):細說tcpdump的妙用(上)
- 網絡基本功(十八):細說tcpdump的妙用(下)
- 網絡基本功(十九):細說NAT原理與配置
- 網絡基本功(二十):細說ICMP和ARP
- 網絡基本功(二十一):細說HTTP(上)
- 網絡基本功(二十二):細說HTTP(下)
- 網絡基本功(二十三):Wireshark抓包實例診斷TCP連接問題
- 網絡基本功(二十四):Wireshark抓包實例分析TCP重傳
- 網絡基本功(二十五):Wireshark抓包實例分析TCP重復ACK與亂序
- 網絡基本功(二十六):Wireshark抓包實例分析TCP窗口及reset
- 網絡基本功(二十七):Wireshark抓包實例分析HTTP問題(上)
- 網絡基本功(二十八):Wireshark抓包實例分析HTTP問題(下)
- 網絡基本功(二十九):Wireshark抓包實例診斷數據庫常見問題
- 網絡基本功(三十):細說DNS(上)
- 網絡基本功(三十一):細說DHCP