|
10.0.3.246.56894 > 192.168.0.92.22: Flags [S], cksum 0xcf28 (incorrect -> 0x0388),
seq
682725222, win 29200, options [mss 1460,sackOK,TS val 619989005 ecr 0,nop,wscale 7], length 0
|
從上面的例子,咱們能夠判斷這個數據包是一個 SYN 數據包。咱們是經過 tcpdump 輸出中的 [S] 標記字段得出這個結論,不一樣類型的數據包有不一樣類型的標記。不須要深刻了解 TCP 協議中的數據包類型,你就能夠經過下面的速查表來加以判斷。 tcp
- [S] – SYN (開始鏈接)
- [.] – 沒有標記
- [P] – PSH (數據推送)
- [F] – FIN (結束鏈接)
- [R] – RST (重啓鏈接)
在這個版本的 tcpdump 輸出中,[S.] 標記表明這個數據包是 SYN-ACK 數據包。
16.很差的例子
15:15:43.323412 IP (tos 0x0, ttl 64,
id
51051, offset 0, flags [DF], proto TCP (6), length 60)
10.0.3.246.56894 > 192.168.0.92.22: Flags [S], cksum 0xcf28 (incorrect -> 0x0388),
seq
682725222, win 29200, options [mss 1460,sackOK,TS val 619989005 ecr 0,nop,wscale 7], length 0
15:15:44.321444 IP (tos 0x0, ttl 64,
id
51052, offset 0, flags [DF], proto TCP (6), length 60)
10.0.3.246.56894 > 192.168.0.92.22: Flags [S], cksum 0xcf28 (incorrect -> 0x028e),
seq
682725222, win 29200, options [mss 1460,sackOK,TS val 619989255 ecr 0,nop,wscale 7], length 0
15:15:46.321610 IP (tos 0x0, ttl 64,
id
51053, offset 0, flags [DF], proto TCP (6), length 60)
10.0.3.246.56894 > 192.168.0.92.22: Flags [S], cksum 0xcf28 (incorrect -> 0x009a),
seq
682725222, win 29200, options [mss 1460,sackOK,TS val 619989755 ecr 0,nop,wscale 7], length 0
上面顯示了一個很差的通訊例子,在這個例子中「很差」,表明通訊沒有創建起來。咱們能夠看到 10.0.3.246 發出一個 SYN 數據包給 主機 192.168.0.92,可是主機並無應答。
17.好的例子
15:18:25.716453 IP (tos 0x10, ttl 64,
id
53344, offset 0, flags [DF], proto TCP (6), length 60)
10.0.3.246.34908 > 192.168.0.110.22: Flags [S], cksum 0xcf3a (incorrect -> 0xc838),
seq
1943877315, win 29200, options [mss 1460,sackOK,TS val 620029603 ecr 0,nop,wscale 7], length 0
15:18:25.716777 IP (tos 0x0, ttl 63,
id
0, offset 0, flags [DF], proto TCP (6), length 60)
192.168.0.110.22 > 10.0.3.246.34908: Flags [S.], cksum 0x594a (correct),
seq
4001145915, ack 1943877316, win 5792, options [mss 1460,sackOK,TS val 18495104 ecr 620029603,nop,wscale 2], length 0
15:18:25.716899 IP (tos 0x10, ttl 64,
id
53345, offset 0, flags [DF], proto TCP (6), length 52)
10.0.3.246.34908 > 192.168.0.110.22: Flags [.], cksum 0xcf32 (incorrect -> 0x9dcc), ack 1, win 229, options [nop,nop,TS val 620029603 ecr 18495104], length 0
好的例子應該向上面這樣,咱們看到典型的 TCP 3次握手。第一數據包是 SYN 包,從主機 10.0.3.246 發送給 主機192.168.0.110,第二個包是 SYN-ACK 包,主機192.168.0.110 迴應 SYN 包。最後一個包是一個 ACK 或者 SYN – ACK – ACK 包,是主機 10.0.3.246 迴應收到了 SYN – ACK 包。從上面看到一個 TCP/IP 鏈接成功創建。
=======================================================================
數據包檢查
18.用十六進制和 ASCII 碼打印數據包
tcpdump -nvvv -i any -c 1 -XX 'port 80 and host 10.0.3.1'
排查應用程序網絡問題的一般作法,就是用 tcpdump 的 -XX 標記打印出 16 進制和 ASCII 碼格式的數據包。這是一個至關有用的命令,它可讓你看到源地址,目的地址,數據包類型以及數據包自己。但我不是這個命令輸出的粉絲,我認爲它太難讀了。
19.只打印 ASCII 碼格式的數據包
tcpdump -nvvv -i any -c 1 -A 'port 80 and host 10.0.3.1'
我傾向於只打印 ASCII 格式數據,這能夠幫助我快速定位數據包中發送了什麼,哪些是正確的,哪些是錯誤的。你能夠經過 -A 標記來實現這一點。
tcpdump -nvvv -i any -c 1 -A 'port 80 and host 10.0.3.1'
tcpdump: listening on any, link-
type
LINUX_SLL (Linux cooked), capture size 65535 bytes
19:59:52.011337 IP (tos 0x0, ttl 64,
id
53757, offset 0, flags [DF], proto TCP (6), length 406)
10.0.3.1.46172 > 10.0.3.246.80: Flags [P.], cksum 0x1c7f (incorrect -> 0xead1),
seq
1552520173:1552520527, ack 428165415, win 237, options [nop,nop,TS val 624251177 ecr 624247749], length 354
...
....\.P\.....I'...........
%5Q)%5C.GET
/newpage
HTTP
/1
.1
Host: 10.0.3.246
Connection: keep-alive
Accept: text
/html
,application
/xhtml
+xml,application
/xml
;q=0.9,image
/webp
,*/*;q=0.8
User-Agent: Mozilla
/5
.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit
/537
.36 (KHTML, like Gecko) Chrome
/38
.0.2125.101 Safari
/537
.36
Accept-Encoding:
gzip
,deflate,sdch
Accept-Language: en-US,en;q=0.8
從上面的輸出,你能夠看到咱們成功獲取了一個 http 的 GET 請求包。若是網絡通訊沒有被加密,用人類可閱讀的格式打出包中數據,對於解決應用程序的問題是頗有幫助。若是你排查一個網絡通訊被加密的問題,打印包中數據就不是頗有用。不過若是你有證書的話,你仍是可使用 ssldump 或者 wireshark。
===================================================================
非 TCP 數據流
雖然這篇文章主要採用 TCP 傳輸來說解 tcpdump ,可是 tcpdump 絕對不是隻能抓 TCP 數據包。它還能夠用來獲取其餘類型的數據包,例如 ICMP、 UDP 和 ARP 包。下面是一些簡單的例子,說明 tcpdump 能夠截獲非 TCP 數據包。
20.ICMP 數據包
tcpdump -nvvv -i any -c 2 icmp
tcpdump: listening on any, link-
type
LINUX_SLL (Linux cooked), capture size 65535 bytes
20:11:24.627824 IP (tos 0x0, ttl 64,
id
0, offset 0, flags [DF], proto ICMP (1), length 84)
10.0.3.169 > 10.0.3.246: ICMP
echo
request,
id
15683,
seq
1, length 64
20:11:24.627926 IP (tos 0x0, ttl 64,
id
31312, offset 0, flags [none], proto ICMP (1), length 84)
10.0.3.246 > 10.0.3.169: ICMP
echo
reply,
id
15683,
seq
1, length 64
21.UDP 數據包
tcpdump -nvvv -i any -c 2 udp
tcpdump: listening on any, link-
type
LINUX_SLL (Linux cooked), capture size 65535 bytes
20:12:41.726355 IP (tos 0xc0, ttl 64,
id
0, offset 0, flags [DF], proto UDP (17), length 76)
10.0.3.246.123 > 198.55.111.50.123: [bad udp cksum 0x43a9 -> 0x7043!] NTPv4, length 48
Client, Leap indicator: clock unsynchronized (192), Stratum 2 (secondary reference), poll 6 (64s), precision -22
Root Delay: 0.085678, Root dispersion: 57.141830, Reference-ID: 199.102.46.75
Reference Timestamp: 3622133515.811991035 (2014
/10/12
20:11:55)
Originator Timestamp: 3622133553.828614115 (2014
/10/12
20:12:33)
Receive Timestamp: 3622133496.748308420 (2014
/10/12
20:11:36)
Transmit Timestamp: 3622133561.726278364 (2014
/10/12
20:12:41)
Originator - Receive Timestamp: -57.080305658
Originator - Transmit Timestamp: +7.897664248
20:12:41.748948 IP (tos 0x0, ttl 54,
id
9285, offset 0, flags [none], proto UDP (17), length 76)
198.55.111.50.123 > 10.0.3.246.123: [udp
sum
ok] NTPv4, length 48
Server, Leap indicator: (0), Stratum 3 (secondary reference), poll 6 (64s), precision -20
Root Delay: 0.054077, Root dispersion: 0.058944, Reference-ID: 216.229.0.50
Reference Timestamp: 3622132887.136984840 (2014
/10/12
20:01:27)
Originator Timestamp: 3622133561.726278364 (2014
/10/12
20:12:41)
Receive Timestamp: 3622133618.830113530 (2014
/10/12
20:13:38)
Transmit Timestamp: 3622133618.830129086 (2014
/10/12
20:13:38)
Originator - Receive Timestamp: +57.103835195
Originator - Transmit Timestamp: +57.103850722