tcpdump是Linux下的截獲闡明網絡數據包的東西,對優化系統機能有很大參考代價。
一 安裝
tcpdump不是默認安裝的,在CentOS下安裝:
yum install tcpdump
在Ubuntu下安裝:
apt-get install tcpdump
二 開始截獲
tcpdump執行很簡樸,就直接輸入即可,不外這樣會截獲全部的數據包,目眩凌亂,顯示的內容基礎沒有步伐用。一般城市為它加上參數,好比:
最常用的是截獲某IP的主機的網絡數據包:
tcpdump host 192.168.0.123
三 闡明一次完整請求
為簡樸明白起見,我截獲了一段“清潔”的數據包,顯示了本機對某URL提倡的一次請求的全進程:
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協議要成立毗連要顛末3次“握手”,截取的數據包也是從3次握手開始,可以看到前三個包的狀態(Flags)別離是:
[S]、[S.]、[.]
首先是客戶端向處事端發送一個10位的序號給處事端;處事端收到后把它+1再返回歸去;客戶端查抄返返來的序號是對的,就返回給處事端一個1。按照上面的描寫,韓國云服務器 美國云主機,知道這三個包滿意:第一個包的seq+1=第二個包的ack;第三個包的ack=1
毗連成立了之后就是詳細的數據交互了,tcpdump劇本加-X參數可以通過十六進制和ASCII方法顯示出詳細的數據內容,這里略過。
TCP協議要斷開毗連要顛末4次“揮手”,上面數據包的最后3條就是揮手的進程。細心的伴侶會發明前面說的4次揮手,卻只有3個包,這不是筆誤。
最后三個包的狀態別離是:
[F.]、[F.]、[.]
首先是客戶端發一個序號匯報處事器我要斷開,處事器說行,處事器發回一個序號,說斷開吧,客戶端說:“斷!”
四次揮手之所以只能看到3個數據包是因為:ACK延遲發送機制。為了提高機能,TCP在收到ACK之后會攢起來而不是當即發送的,在幾種環境下才會發送:
1 高出MSS(可以領略為攢得太多了,放不下了)
2 有FIN
3 系統配置為禁用延遲(TCP_NODELAY)