tcpdump是Linux下的截獲分析網(wǎng)絡(luò)數(shù)據(jù)包的工具,對(duì)優(yōu)化系統(tǒng)性能有很大參考價(jià)值。
一 安裝
tcpdump不是默認(rèn)安裝的,在CentOS下安裝:
yum install tcpdump
在Ubuntu下安裝:
apt-get install tcpdump
二 開始截獲
tcpdump執(zhí)行很簡單,就直接輸入即可,不過這樣會(huì)截獲全部的數(shù)據(jù)包,眼花繚亂,顯示的內(nèi)容根本沒有辦法用。一般都會(huì)為它加上參數(shù),比如:
最常用的是截獲某IP的主機(jī)的網(wǎng)絡(luò)數(shù)據(jù)包:
tcpdump host 192.168.0.123
三 分析一次完整請(qǐng)求
為簡單明了起見,我截獲了一段“干凈”的數(shù)據(jù)包,顯示了本機(jī)對(duì)某URL發(fā)起的一次請(qǐng)求的全過程:
23:30:01.828266 IP 192.168.0.251.34245 > li527-105.members.linode.com.http: Flags [S], seq 2340440979, win 14600, options [mss 1460,sackOK,TS val 237397584 ecr 0,nop,wscale 7], length 0
23:30:01.931109 IP li527-105.members.linode.com.http > 192.168.0.251.34245: Flags [S.], seq 64288983, ack 2340440980, win 14480, options [mss 1440,sackOK,TS val 3220226885 ecr 237397584,nop,wscale 7], length 0
23:30:01.931221 IP 192.168.0.251.34245 > http://www.server110.com/.http: Flags [.], ack 1, win 115, options [nop,nop,TS val 237397594 ecr 3220226885], length 0
23:30:01.931544 IP 192.168.0.251.34245 > li527-105.members.linode.com.http: Flags [P.], seq 1:133, ack 1, win 115, options [nop,nop,TS val 237397594 ecr 3220226885], length 132
23:30:02.031923 IP li527-105.members.linode.com.http > 192.168.0.251.34245: Flags [.], ack 133, win 122, options [nop,nop,TS val 3220226987 ecr 237397594], length 0
23:30:02.032171 IP li527-105.members.linode.com.http > 192.168.0.251.34245: Flags [P.], seq 1:323, ack 133, win 122, options [nop,nop,TS val 3220226988 ecr 237397594], length 322
23:30:02.032233 IP 192.168.0.251.34245 > li527-105.members.linode.com.http: Flags [.], ack 323, win 123, options [nop,nop,TS val 237397604 ecr 3220226988], length 0
23:30:02.034852 IP 192.168.0.251.34245 > li527-105.members.linode.com.http: Flags [F.], seq 133, ack 323, win 123, options [nop,nop,TS val 237397605 ecr 3220226988], length 0
23:30:02.139101 IP li527-105.members.linode.com.http > 192.168.0.251.34245: Flags [F.], seq 323, ack 134, win 122, options [nop,nop,TS val 3220227091 ecr 237397605], length 0
23:30:02.139233 IP 192.168.0.251.34245 > li527-105.members.linode.com.http: Flags [.], ack 324, win 123, options [nop,nop,TS val 237397615 ecr 3220227091], length 0
TCP協(xié)議要建立連接要經(jīng)過3次“握手”,截取的數(shù)據(jù)包也是從3次握手開始,可以看到前三個(gè)包的狀態(tài)(Flags)分別是:
[S]、[S.]、[.]
首先是客戶端向服務(wù)端發(fā)送一個(gè)10位的序號(hào)給服務(wù)端;服務(wù)端收到后把它+1再返回回去;客戶端檢查返回來的序號(hào)是對(duì)的,就返回給服務(wù)端一個(gè)1。根據(jù)上面的描述,知道這三個(gè)包滿足:第一個(gè)包的seq+1=第二個(gè)包的ack;第三個(gè)包的ack=1
連接建立了之后就是具體的數(shù)據(jù)交互了,tcpdump腳本加-X參數(shù)可以通過十六進(jìn)制和ASCII方式顯示出具體的數(shù)據(jù)內(nèi)容,這里略過。
TCP協(xié)議要斷開連接要經(jīng)過4次“揮手”,上面數(shù)據(jù)包的最后3條就是揮手的過程。細(xì)心的朋友會(huì)發(fā)現(xiàn)前面說的4次揮手,卻只有3個(gè)包,這不是筆誤。
最后三個(gè)包的狀態(tài)分別是:
[F.]、[F.]、[.]
首先是客戶端發(fā)一個(gè)序號(hào)告訴服務(wù)器我要斷開,服務(wù)器說行,服務(wù)器發(fā)回一個(gè)序號(hào),說斷開吧,客戶端說:“斷!”
四次揮手之所以只能看到3個(gè)數(shù)據(jù)包是因?yàn)椋篈CK延遲發(fā)送機(jī)制。為了提高性能,TCP在收到ACK之后會(huì)攢起來而不是立即發(fā)送的,在幾種情況下才會(huì)發(fā)送:
1 超過MSS(可以理解為攢得太多了,放不下了)
2 有FIN
3 系統(tǒng)設(shè)置為禁用延遲(TCP_NODELAY)
倒數(shù)第二條的前面應(yīng)該還有一個(gè)ACK,因?yàn)椴环仙鲜?條,所以被延遲(一般是40ms或者200ms)了,等到倒數(shù)第二條發(fā)出時(shí)符合條件了(有FIN)就一塊發(fā)出來了,所以4次揮手只能看到3個(gè)包。如果系統(tǒng)禁用了延遲發(fā)送,就會(huì)看到4個(gè)包了。
以上均為我自己的理解,如果理解的不對(duì),請(qǐng)指正。