网络抓包分析
網絡抓包分析
1,網絡抓包介紹
1、Tcpdump簡介
tcpdump 命令是基于unix系統的命令行的數據報嗅探工具,可以抓取流動在網卡上的數據包。它的原理大概如下:**linux 抓包是通過注冊一種虛擬的底層網絡協議來完成對網絡報文(準確的是網絡設備)消息的處理權。**當網卡接收到一個網絡報文之后,它會遍歷系統中所有已經注冊的網絡協議,如以太網協議、x25協議處理模塊來嘗試進行報文的解析處理。當抓包模塊把自己偽裝成一個網絡協議的時候,系統在收到報文的時候就會給這個偽協議一次機會,讓它對網卡收到的包進行一次處理,此時該模塊就會趁機對報文進行窺探,也就是將報文完完整整的復制一份,假裝是自己接收的報文,匯報給抓包模塊。
2、Wireshark 簡介
Wireshark 是一個網絡協議檢測工具,支持Windows平臺、Unix平臺、Mac平臺,一般只在圖形界面平臺下使用Wireshark,如果是Linux的話,直接使用 tcpdump了,因為一般而言 Linux 都自帶的 tcpdump,或者用 tcpdump 抓包以后用 Wireshark 打開分析。
在Mac平臺下,Wireshark 通過 WinPcap 進行抓包,封裝的很好,使用起來很方便,可以很容易的制定抓包過濾器或者顯示過濾器,具體簡單使用下面會介紹。Wireshark是一個免費的工具。
所以,tcpdump是用來抓取數據非常方便,Wireshark則是用于分析抓取到的數據比較方便。
2、Tcpdump 語法
1、查看本地網卡狀態
[root@qfedu.com ~]# netstat -i Kernel Interface table Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg docker0 1500 40409 0 0 0 20376 0 0 0 BMU eth0 1500 22999894941 0 0 0 25581016784 0 0 0 BMRU lo 65536 850291094 0 0 0 850291094 0 0 0 LRU-
Iface:存在的網卡。
-
MTU:最大傳輸單元。
-
RX-OK RX-ERR RX-DRP RX-OVR:正確接收數據報的數量以及發生錯誤、流式、碰撞的總數。
-
TX-OK TX-ERR TX-DRP TX-OVR:正確發送數據報的數量以及發生錯誤、流式、碰撞的總數。
[root@qfedu.com ~]# tcpdump --helptcpdump version 4.9.0libpcap version 1.5.3OpenSSL 1.0.1e-fips 11 Feb 2013Usage: tcpdump [-aAbdDefhHIJKlLnNOpqStuUvxX#] [ -B size ] [ -c count ][ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ][ -i interface ] [ -j tstamptype ] [ -M secret ] [ --number ][ -Q|-P in|out|inout ][ -r file ] [ -s snaplen ] [ --time-stamp-precision precision ][ --immediate-mode ] [ -T type ] [ --version ] [ -V file ][ -w file ] [ -W filecount ] [ -y datalinktype ] [ -z postrotate-command ][ -Z user ] [ expression ]
2、 Tcpdump 抓包分類
1、類型的關鍵字
- host:指明一臺主機。如:host 192.168.152.110
- net:指明一個網絡地址,如:net 192.168.152.0
- port:指明端口號:如:port 8090
2、確定方向的關鍵字
- src:ip包的源地址,如:src 192.168.152.110
- dst:ip包的目標地址。如:dst 192.168.152.110
3、協議的關鍵字(缺省是所有協議的信息包)
- fddi、ip、arp、rarp、tcp、udp。
4、其它關鍵字
- gateway、broadcast、less、greater。
5、常用表達式
- ! or not
- && or and
- || or or
3、Tcpdump 參數詳解
- A:以ascii編碼打印每個報文(不包括鏈路的頭)。
- a:將網絡地址和廣播地址轉變成名字。
- c:抓取指定數目的包。
- C:用于判斷用 -w 選項將報文寫入的文件的大小是否超過這個值,如果超過了就新建文件(文件名后綴是1、2、3依次增加);
- d:將匹配信息包的代碼以人們能夠理解的匯編格式給出;
- dd:將匹配信息包的代碼以c語言程序段的格式給出;
- ddd:將匹配信息包的代碼以十進制的形式給出;
- D:列出當前主機的所有網卡編號和名稱,可以用于選項 -i;
- e:在輸出行打印出數據鏈路層的頭部信息;
- f:將外部的Internet地址以數字的形式打印出來;
- F<表達文件>:從指定的文件中讀取表達式,忽略其它的表達式;
- i<網絡界面>:監聽主機的該網卡上的數據流,如果沒有指定,就會使用最小網卡編號的網卡(在選項-D可知道,但是不包括環路接口),linux 2.2 內核及之后的版本支持 any 網卡,用于指代任意網卡;
- l:如果沒有使用 -w 選項,就可以將報文打印到 標準輸出終端(此時這是默認);
- n:顯示ip,而不是主機名;
- nn:顯示port,而不是服務名;
- N:不列出域名;
- O:不將數據包編碼最佳化;
- p:不讓網絡界面進入混雜模式;
- q:快速輸出,僅列出少數的傳輸協議信息;
- r<數據包文件>:從指定的文件中讀取包(這些包一般通過-w選項產生);
- s<數據包大小>:指定抓包顯示一行的寬度,-s0表示可按包長顯示完整的包,經常和-A一起用,默認截取長度為60個字節,但一般ethernet MTU都是1500字節。所以,要抓取大于60字節的包時,使用默認參數就會導致包數據丟失;
- S:用絕對而非相對數值列出TCP關聯數;
- t:在輸出的每一行不打印時間戳;
- tt:在輸出的每一行顯示未經格式化的時間戳記;
- T<數據包類型>:將監聽到的包直接解釋為指定的類型的報文,常見的類型有rpc (遠程過程調用)和snmp(簡單網絡管理協議);
- v:輸出一個稍微詳細的信息,例如在ip包中可以包括ttl和服務類型的信息;
- vv:輸出詳細的報文信息;
- x/-xx/-X/-XX:以十六進制顯示包內容,幾個選項只有細微的差別,詳見man手冊;
- w<數據包文件>:直接將包寫入文件中,并不分析和打印出來;
- expression:用于篩選的邏輯表達式;
4、Tcpdump 參數含義
[root@qfedu.com ~]# tcpdump host 192.168.152.110 -i eth0 -c 10 -l -n tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on ens5f0, link-type EN10MB (Ethernet), capture size 262144 bytes 10:59:51.071567 IP 192.168.152.21.ssh > 192.168.152.110.7608: Flags [P.], seq 1715331653:1715331865, ack 2259278754, win 65535, length 212 10:59:51.071699 IP 192.168.152.21.ssh > 192.168.152.110.7608: Flags [P.], seq 212:408, ack 1, win 65535, length 196 10:59:51.071794 IP 192.168.152.21.ssh > 192.168.152.110.7608: Flags [P.], seq 408:572, ack 1, win 65535, length 164 10:59:51.071861 IP 192.168.152.21.ssh > 192.168.152.110.7608: Flags [P.], seq 572:736, ack 1, win 65535, length 164 10:59:51.071910 IP 192.168.152.21.ssh > 192.168.152.110.7608: Flags [P.], seq 736:900, ack 1, win 65535, length 164 10:59:51.071958 IP 192.168.152.21.ssh > 192.168.152.110.7608: Flags [P.], seq 900:1064, ack 1, win 65535, length 164 10:59:51.072006 IP 192.168.152.21.ssh > 192.168.152.110.7608: Flags [P.], seq 1064:1228, ack 1, win 65535, length 164 10:59:51.072053 IP 192.168.152.21.ssh > 192.168.152.110.7608: Flags [P.], seq 1228:1392, ack 1, win 65535, length 164 10:59:51.072141 IP 192.168.152.21.ssh > 192.168.152.110.7608: Flags [P.], seq 1392:1556, ack 1, win 65535, length 164 10:59:51.077438 IP 192.168.152.110.7608 > 10.1.87.25.ssh: Flags [.], ack 212, win 63360, length 0 10 packets captured 13 packets received by filter 0 packets dropped by kernel1、第一行:`tcpdump: verbose output suppressed, use -v or -vv for full protocol decode` 使用選項`v`和`vv`,可以看出更全的詳細內容。2、第二行:`listening on ens5f0, link-type EN10MB (Ethernet), capture size 262144 bytes`,說明監聽的是`ens5f0`這個NIC設備的網絡包,且它的鏈路層是基于以太網的,要抓的包大小限制`262144`,裝包大小限制可以用利用`-s`來控制。3、第三行:`10:59:51.071567 IP 192.168.152.21.ssh > 192.168.152.110.7608: Flags [P.], seq 1715331653:1715331865, ack 2259278754, win 65535, length 212`。- `10:59:51.071567`:抓包時間為時、分、秒、微妙。 - `IP 192.168.152.21.ssh > 192.168.152.110.7608: Flags [P.], seq 1715331653:1715331865, ack 2259278754, win 65535, length 212`,這里用`man dump`這個命令引用說明:上面視圖簡單的解釋就是該包`192.168.152.21`傳到`192.168.152.110`,通過的端口是`22`(ssh的端口)向`7608`,前幾個是使用的是`PUSH`的標識,最后一個是返回的`ACK`標識。5、Tcpdump 命令實踐
1、直接啟動tcpdump,將抓取所有經過第一個網絡接口上的數據包
[root@qfedu.com ~]# tcpdump2、抓取所有經過指定網絡接口上的數據包
[root@qfedu.com ~]# tcpdump -i eth03、抓取所有經過 eth0,目的或源地址是 192.168.152.255 的網絡數據:
[root@qfedu.com ~]# tcpdump -i eth0 host 192.168.152.1004、抓取主機192.168.152.255和主機192.168.152.61或192.168.152.95的通信:
[root@qfedu.com ~]# tcpdump host 192.168.152.100 and 192.168.152.101 (或者用 or)5、抓取主機192.168.1523.210除了和主機192.168.152.61之外所有主機通信的數據包:
[root@qfedu.com ~]# tcpdump -n host 192.168.152.100 and ! 192.168.152.1016、抓取主機192.168.152.255除了和主機192.168.152.61之外所有主機通信的ip包
[root@qfedu.com ~]# tcpdump ip -n host 192.168.152.100 and ! 192.168.152.1017、抓取主機192.168.152.3發送的所有數據:
[root@qfedu.com ~]# tcpdump -i eth0 src host 192.168.152.100 (注意數據流向)8、抓取主機192.168.152.3接收的所有數據:
[root@qfedu.com ~]# tcpdump -i eth0 dst host 192.168.152.100 (注意數據流向)9、抓取主機192.168.152.3所有在TCP 80端口的數據包:
[root@qfedu.com ~]# tcpdump -i eth0 host 192.168.152.3 and tcp port 8010、抓取HTTP主機192.168.152.3在80端口接收到的數據包:
[root@qfedu.com ~]# tcpdump -i eth0 host 192.168.152.3 and dst port 8011、抓取所有經過 eth0,目的或源端口是 25 的網絡數據
[root@qfedu.com ~]# tcpdump -i eth0 port 25 #源端口 [root@qfedu.com ~]# tcpdump -i eth0 src port 25 #目的端口 [root@qfedu.com ~]# tcpdump -i eth0 dst port 25 # 網絡過濾12、抓取所有經過 eth0,網絡是 192.168上的數據包
[root@qfedu.com ~]# tcpdump-i eth0 net 192.168 [root@qfedu.com ~]# tcpdump -i enh0 src net 192.168 [root@qfedu.com ~]# tcpdump -i eth0 dst net 192.168 [root@qfedu.com ~]# tcpdump-i eth0 net 192.168.152 [root@qfedu.com ~]# tcpdump -i eth0 net 192.168.152.0/2413、協議過濾
[root@qfedu.com ~]# tcpdump -i eth0 arp [root@qfedu.com ~]# tcpdump-i eth0 ip [root@qfedu.com ~]# tcpdump -i eth0 [root@qfedu.com ~]# tcptcpdump -i eth0 udp [root@qfedu.com ~]# tcpdump -i eth0 icmp14、抓取所有經過 eth0,目的地址是 192.168.152.254 或 192.168.152.200 端口是 80 的 TCP 數據
[root@qfedu.com ~]# tcpdump -i eth0 '((tcp) and (port 80) and ((dst host 192.168.152.254) or (dst host 192.168.152.200)))15、抓取所有經過 eth0,目標 MAC 地址是 00:01:02:03:04:05 的 ICMP 數據
[root@qfedu.com ~]# tcpdump -i eth1 '((icmp) and ((ether dst host 00:01:02:03:04:05)))16、抓取所有經過 eth0,目的網絡是 192.168,但目的主機不是 192.168.152.200 的 TCP 數據
[root@qfedu.com ~]# tcpdump -i eth0 '((tcp) and ((dst net 192.168) and (not dst host 192.168.152.200)))'17、只抓 SYN 包
[root@qfedu.com ~]# tcpdump -i eth0 'tcp[tcpflags] =tcp-syn18、抓 SYN, ACK
[root@qfedu.com ~]# tcpdump -i eth0 'tcp[tcpflags]'19、抓 SMTP 數據,抓取數據區開始為”MAIL”的包,”MAIL”的十六進制為 0x4d41494c
[root@qfedu.com ~]# tcpdump -i eth0 '((port 25) and (tcp[(tcp[12]>>2):4] = 0x4d41494c))'20、抓 HTTP GET 數據,”GET “的十六進制是 0x47455420
[root@qfedu.com ~]# tcpdump -i eth0 'tcp[(tcp[12]>x2):4] =0x47455429' # 0x4745為"GET"前兩個字母"GE",0x4854為"HTTP"前兩個字母"HT" [root@qfedu.com ~]# tcpdump -XvvennSs 0 -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x485421、抓 SSH 返回,”SSH-“的十六進制是 0x5353482D
[root@qfedu.com ~]# tcpdump -i eth0 'tcp[(tcp[12]2):4]-0x5353482D' # 抓老版本的SSH返回信息,如"SSH-1.99.." [root@qfedu.com ~]# tcpdump -i eth0 (tcp (tcp[12]>>2):4] = 0x5353482D) and (tcp[((tcp[12]>2)+4):2] = 0x312E3)'22、高級包頭過濾如前兩個的包頭過濾,首先了解如何從包頭過濾信息:
proto[x:y] # :過濾從x字節開始的y字節數。比如ip[2:2]過濾出3、4字節(第二字專從研始排) 操作符: >, =, 抓取端口大于1024的TCP數據包 [root@qfedu.com ~]# tcpdump -i eth0 'tcp[0:2] > 1024‘23、抓 DNS 請求數據
[root@qfedu.com ~]# tcpdump -i eth0 udp dst port 5324、其他-c 參數對于運維人員來說也比較常用,因為流量比較大的服務器,靠人工 CTRL+C 還是抓的太多,于是可以用-c 參數指定抓多少個包。
[root@qfedu.com ~]# time tcpdump -nn -i eth0 'tcp[tcpflags] = tcp-syn' -C 10000 > /dev/null 上面的命令計算抓10000個SYN包花費多少時間,可以判斷訪問量大概是多少。實時抓取端口號8000的GET包,然后寫入GET.log [root@qfedu.com ~]# tcpdump -i eth0 '((port 8000) and (tcp[(tcp[12]>>2):4]=0x47455420))' -nnAL -w /tmp/GET.log6、Tcpdump 抓包示例
想抓取訪問某個網站時的網絡數據。比如網站 http://www.baidu.com/ 怎么做?
1、通過tcpdump截獲主機 www.baidu.com 發送與接收所有的數據包
[root@qfedu.com ~]# tcpdump -i eth0 host www.baidu.com2、訪問這個網站
[root@qfedu.com ~]# wget www.baidu.cn 查看控制臺輸出 確認序列號ack為何是1。這是相對值,如何顯示絕對值 [root@qfedu.com ~]# tcpdump -S -i eth0 host www.baidu.com [root@qfedu.com ~]# wget www.baidu.com 再次查看控制輸出3、想要看到詳細的http報文。怎么做?
[root@qfedu.com ~]# tcpdump -A -i eth0 host www.baidu.com 將抓取的結果存到文件,比如文件file1 [root@qfedu.com ~]# tcpdump -A -i eth0 -w filel host www.baidu.com 如何讀取這個文件的基本信息 [root@qfedu.com ~]# tcpdump -r filel 想要了解更多,比如上面的http報文 [root@qfedu.com ~]# tcpdump -A -r filel 也同時想要將確認序列號ack打印成絕對值 [root@qfedu.com ~]# tcpdump -AS -r filel 注:無參數的選項比如-A,-S,-e,等。均可以共用一個減號 'src host www.baidu.cn' 屬于expression ,如果太長,可以用單引號括起來: [root@qfedu.com ~]# tcpdump -i eth0 'src host www. baidu.com'4、分析抓取到的報文
16:50:11.916308 IP 192.168.152.3.52346 > 61.135.169.121.http: Flags [P.], seq 1888894293:1888894434, ack 2526934942, win 8192, Length 14 1: HTTP: GET/ HTTP/1.1第一列是時間戳:時、分、秒、微秒 第二列是網際網路協議的名稱 第三列是報文發送方的十進制的網際網路協議地址,以及緊跟其后的端口號(偶爾會是某個協議名如http,如果在此處仍然顯示端口號加上-n選項 第四列是大于號 第五列是報文接收方的十進制的網際網路協議地址,以及緊跟其后的端口號(偶爾會是某個協議名如http,如果在此處仍然顯示端口號加上-n選項) 第六列是冒號第七列是Flags標識,可能的取值是[S.] [] [P.] [F.] 第八、九、.…列是tcp協議報文頭的一些變量值: seq是請求同步的序列號 ack是已經同步的序列號 win是當前可用窗口大小 length是tcp協議報文體的長度 如果加入了-5選項,會看到的seg, ack是兩個冒號分割的值,分別表示變更前后的值。7、Tcpdump 抓取 TCP 包分析
TCP傳輸控制協議是面向連接的可靠的傳輸層協議,在進行數據傳輸之前,需要在傳輸數據的兩端(客戶端和服務器端)創建一個連接,這個連接由一對插口地址唯一標識,即是在IP報文首部的源IP地址、目的IP地址,以及TCP數據報首部的源端口地址和目的端口地址。TCP首部結構如下:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-42excr6h-1608122997108)(assets/image-20200304004851192.png)]
注意:通常情況下,一個正常的TCP連接,都會有三個階段:1、TCP三次握手;2、數據傳送;3、TCP四次揮手
其中在TCP連接和斷開連接過程中的關鍵部分如下:
-
源端口號:即發送方的端口號,在TCP連接過程中,對于客戶端,端口號往往由內核分配,無需進程指定;
-
目的端口號:即發送目的的端口號;
-
序號:即為發送的數據段首個字節的序號;
-
確認序號:在收到對方發來的數據報,發送確認時期待對方下一次發送的數據序號;
-
SYN:同步序列編號,Synchronize Sequence Numbers;
-
ACK:確認編號,Acknowledgement Number;
-
FIN:結束標志,FINish;
1、TCP三次握手
三次握手的過程如下:
- step1. 由客戶端向服務器端發起TCP連接請求。Client發送:同步序列編號SYN置為1,發送序號Seq為一個隨機數,這里假設為X,確認序號ACK置為0;
- step2. 服務器端接收到連接請求。Server響應:同步序列編號SYN置為1,并將確認序號ACK置為X+1,然后生成一個隨機數Y作為發送序號Seq(因為所確認的數據報的確認序號未初始化);
- step3. 客戶端對接收到的確認進行確認。Client發送:將確認序號ACK置為Y+1,然后將發送序號Seq置為X+1(即為接收到的數據報的確認序號);
為什么是三次握手而不是兩次對于step3的作用,假設一種情況,客戶端A向服務器B發送一個連接請求數據報,然后這個數據報在網絡中滯留導致其遲到了,雖然遲到了,但是服務器仍然會接收并發回一個確認數據報。但是A卻因為久久收不到B的確認而將發送的請求連接置為失效,等到一段時間后,接到B發送過來的確認,A認為自己現在沒有發送連接,而B卻一直以為連接成功了,于是一直在等待A的動作,而A將不會有任何的動作了。這會導致服務器資源白白浪費掉了,因此,兩次握手是不行的,因此需要再加上一次,對B發過來的確認再進行一次確認,即確認這次連接是有效的,從而建立連接。
對于雙方,發送序號的初始化為何值有的系統中是顯式的初始化序號是0,但是這種已知的初始化值是非常危險的,因為這會使得一些黑客鉆漏洞,發送一些數據報來破壞連接。因此,初始化序號因為取隨機數會更好一些,并且是越隨機越安全。
1.Tcpdump抓TCP三次握手抓包分析
[root@qfedu.com ~]# tcpdump host 192.168.152.3 -i lo and tcp port 8080 # 接著再運行: [root@qfedu.com ~]# curl http://192.168.152.3:8080/atbg/doc2.控制臺輸出
# TCP三次握手start 16:00:13.486776 IP 192.168.152.3.61725 > 192.168.152.3.8080: Flags [S], seq 1944916150,win 65535,options [mss 16344 ,nop ,wscale 5 , nop,nop,TS val 906474698 ecr O,sackoK,eol], length 0 16:00:13.486850 IP 192.168.152.3.8080 > 192.168.152.3.61725: Flags [S.], seq 1119565918, ack 1944916151, win 65535, options_ [mss 16344 ,nop,wscale 5,nop ,nop,TS val 906474698 ecr 906474698, sackOK, eol], length 0 16:00:13.486860 IP 192.168.152.3.61725 > 192.168.152.3.8080: Flags [.],ack 1119565919,win 12759,options [nop ,nop,TS val 906474698 ecr 906474698], length0 16:00:13. 486868 IP 192.168.152.3.8080 > 192.168.152.3.61725: Flags [.], ack 1944916151, win 12759, options [nop ,nop,TS val 906474698 ecr 906474698], length0 # TCP三次握手end #傳輸數據start 16:00:13.486923 IP 192.168.152.3.61725 > 192.168.152..3.8080: Flags [P.], seq 1944916151:1944916238,ack 1119565919, win 12759,options [nop,nop,TS val 906474698 ecr 906474698], length 87: HTTP: GET /atbg/doc HTTP/1.1 16:00:13. .486944 IP 192.168.152.3.8080 > 192.168.152.3.61725: FLags [.],ack 1944916238, win 12756,options [nop ,nop,TS val 906474698 ecr 906474698], length0 16:00:13.489750 IP 192.168.152.3.8080 > 192.168.152.3.61725: Flags [P.], seq 1119565919:1119571913, ack 1944916238, win 12756, options [nop , nop,p,ts val 906474701 ecr 906474698], length 5994: HTTP: HTTP/1.1 200 0K 16:00:13.489784 IP 192.168.152.3.61725 > 192.168.152.3.8080: FLags [.],ack 1119571913, win 12572, options [nop,nop,TS val 906474701 ecr 906474701], length? #傳輸數據end # TCP四次揮手start 16:00:13.490836 IP 192.168.152.3.61725 > 192.168.152.3.8080: Flags_ [F.], seq 1944916238, ack 1119571913,win 12572,options [nop,nop,TS val 906474702 ecr906474701],length 0 16:00:13490869 IP 192.168.152.3. 8080 > 10.37. 63.3.61725: Flags [.],ack 1944916239, win 12756, options [nop ,nop,TS val 906474702 ecr 906474702], length0 16:00:13.490875 IP 192.168.152.3.61725 > 192.168.152.3.8080: Flags [.], ack_ 1119571913, win 12572, options [nop,nop,TS val 906474702 ecr 906474702], length0 16:00:13.491004 IP 192.168.152.3.8080 > 192.168.152.3.61725: Flags [F.],seq 1119571913, ack 1944916239,win 12756, options [nop,nop,TS val 906474702 ecr906474702],length 16:00:13.491081 IP 10.37. 63.3.61725 > 192.168.152.3. 8080: Flags [.],ack 1119571914, win 12572, options [nop ,nop,TS val 906474702 ecr 906474702], length0 # TCP四次揮手end每一行中間都有這個包所攜帶的標志:
- S=SYN,發起連接標志。
- P=PUSH,傳送數據標志。
- F=FIN,關閉連接標志。
- ack,表示確認包。
- RST=RESET,異常關閉連接。
- .,表示沒有任何標志。
第1行:16:00:13.486776,從192.168.152.3(client)的臨時端口61725向192.168.152.3(server)的8080監聽端口發起連接,client初始包序號seq為1944916150,滑動窗口大小為65535字節(滑動窗口即tcp接收緩沖區的大小,用于tcp擁塞控制),mss大小為16344(即可接收的最大包長度,通常為MTU減40字節,IP頭和TCP頭各20字節)。【seq=1944916150,ack=0,syn=1】
第2行:16:00:13.486850,server響應連接,同時帶上第一個包的ack信息,為client端的初始包序號seq加1,即1944916151,即server端下次等待接受這個包序號的包,用于tcp字節流的順序控制。Server端的初始包序號seq為1119565918,mss也是16344。【seq=1119565918,ack=1944916151,syn=1】
第3行:15:46:13.084161,client再次發送確認連接,tcp連接三次握手完成,等待傳輸數據包。【ack=1119565919,seq=1944916151】
2、TCP四次揮手
連接雙方在完成數據傳輸之后就需要斷開連接。由于TCP連接是屬于全雙工的,即連接雙方可以在一條TCP連接上互相傳輸數據,因此在斷開時存在一個半關閉狀態,即有有一方失去發送數據的能力,卻還能接收數據。因此,斷開連接需要分為四次。主要過程如下:
- step1. 主機A向主機B發起斷開連接請求,之后主機A進入FIN-WAIT-1狀態;
- step2. 主機B收到主機A的請求后,向主機A發回確認,然后進入CLOSE-WAIT狀態;
- step3. 主機A收到B的確認之后,進入FIN-WAIT-2狀態,此時便是半關閉狀態,即主機A失去發送能力,但是主機B卻還能向A發送數據,并且A可以接收數據。此時主機B占主導位置了,如果需要繼續關閉則需要主機B來操作了;
- step4. 主機B向A發出斷開連接請求,然后進入LAST-ACK狀態;
- step5. 主機A接收到請求后發送確認,進入TIME-WAIT狀態,等待2MSL之后進入CLOSED狀態,而主機B則在接受到確認后進入CLOSED狀態;
為何主機A在發送了最后的確認后沒有進入CLOSED狀態,反而進入了一個等待2MSL的TIME-WAIT主要作用有兩個:
第一,確保主機A最后發送的確認能夠到達主機B。如果處于LAST-ACK狀態的主機B一直收不到來自主機A的確認,它會重傳斷開連接請求,然后主機A就可以有足夠的時間去再次發送確認。但是這也只能盡最大力量來確保能夠正常斷開,如果主機A的確認總是在網絡中滯留失效,從而超過了2MSL,最后也無法正常斷開;
第二,如果主機A在發送了確認之后立即進入CLOSED狀態。假設之后主機A再次向主機B發送一條連接請求,而這條連接請求比之前的確認報文更早地到達主機B,則會使得主機B以為這條連接請求是在舊的連接中A發出的報文,并不看成是一條新的連接請求了,即使得這個連接請求失效了,增加2MSL的時間可以使得這個失效的連接請求報文作廢,這樣才不影響下次新的連接請求中出現失效的連接請求。
為什么斷開連接請求報文只有三個,而不是四個因為在TCP連接過程中,確認的發送有一個延時(即經受延時的確認),一端在發送確認的時候將等待一段時間,如果自己在這段事件內也有數據要發送,就跟確認一起發送,如果沒有,則確認單獨發送。而我們的抓包實驗中,由服務器端先斷開連接,之后客戶端在確認的延遲時間內,也有請求斷開連接需要發送,于是就與上次確認一起發送,因此就只有三個數據報了。
3、Wireshark 分析 Tcpdump 抓包結果
1、Tcpdump 抓包
tcpdump host 10.37.63.3 -i lo and port 8080 -n -w ./Desktop/tcpdump_10.37.63.3_8080_20160525.cap # 然后再執行curl curl http://10.37.63.3:8080/atbg/doc2、Wireshark 分析
使用Wireshark打開tcpdump_10.37.63.3_8080_20160525.cap文件
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ymVN4l2x-1608122997113)(assets/image-20200304005033561.png)]
- No. 1-4 行:TCP三次握手環節;
- No. 5-8 行:TCP傳輸數據環節;
- No. 9-13 行:TCP四次揮手環節;
3、查看 http 請求和響應的方法
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-3ugKxuCe-1608122997115)(assets/image-20200304005118038.png)]
彈窗如下圖所示,上面紅色部分為請求信息,下面藍色部分為響應信息:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-xL0WCm3P-1608122997117)(assets/image-20200304005147620.png)]
以上是 Wireshark 分析 tcpdump 的簡單使用,Wireshark更強大的是過濾器工具,大家可以自行去多研究學習Wireshark.
總結
- 上一篇: 指定开始_Flink-Kafka指定of
- 下一篇: Spring Cloud Gateway