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