Wireshark數據抓包分析之傳輸層協議(TCP協議)


TCP協議傳輸數據時,每發送一個數據包都要求確認。如果有一個數據包丟失,就收不到確認包,發送方就知道應該重發這個數據包,所以相比於UDP協議來說TCP協議保證了數據的安全性。

TCP端口

TCP端口就是為TCP協議通信提供服務的窗口。所有TCP通信都會使用源端口和目的端口,而這些可以在每個TCP頭中找到。端口就像是老式電話機上的接口,一個總計操作員會監視着一個面板上的指示燈和插頭。當指示燈亮起的時候,它就會鏈接這個呼叫者,問它想要和誰通話,然后插一根電纜線將它和它的目的地址鏈接起來。每次呼叫都需要有一個源端口(呼叫者)和目的端口(接收者)。TCP端口大概就是這樣工作的。

為了能夠將數據傳輸到遠程服務器或者設備的特定應用中去,TCP數據包必須知道遠程服務所監聽的端口。如果想試着鏈接一個不同於所設置的端口,那么這個通信就會失敗。這個序列中的源端口並不十分重要,所以可以隨機選擇。遠程服務器也可以很簡單的從發送過來的原始數據中得到這個端口。

客戶端與不同服務器建立連接時,使用的源端口和目標端口都不同。

 

在使用TCP進行通信的時候,有65535個端口可供使用,並通常將這些端口分成兩個部分,如下所示:

 

1~1023:是標准端口組(忽略掉被預留的0),特定服務會用到這些通常位於標准端口分組中的標准端口。

 

1024~65535:是臨時端口組(盡管一些操作對此有着不同的定義),當一個服務想在任意時間使用端口進行通信的時候,操作系統都會隨機選擇這個源端口,讓這個通信使用唯一的源端口。這些源端口通常就位於臨時端口組。

 

TCP三次握手

 

在TCP/IP協議中,TCP協議提供可靠的鏈接服務,通過使用三次握手建立一個鏈接。所有基於TCP協議的通信都需要以兩台主機的握手開始。

第一次握手建立連接時,客戶端向服務器端發送SYN報文(Seq=x,SYN=1),並進入SYN_SEND狀態,等待服務器確認

(Seq表示請求序列號,Ack表示確認序列號,SYN和ACK為控制位)

 

第二次握手實際上是分兩部分完成的。即SYN+ACK(請求和確認)報文。

 

(1)服務器收到了客戶端的請求,向客戶端回復一個確認信息(Ack=x+1)

 

(2)服務器再向客戶端發送一個SYN包(Seq=y)建立連接的請求,此時服務器進入SYN_RECV狀態

第三次握手,客戶端收到服務器的回復(SYN+ACK報文)。此時,客戶端也要向服務器發送確認包(ACK).此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手

此時,客戶端就可以與服務器開始傳送數據了

三次握手建立連接的圖示如下

 

 

 

 

 

TCP四次斷開

 

在TCP協議中,每次握手后都會終止。就和人與人之間相互問候一樣,最終都會有一句再見。TCP終止用來在兩台設備完成通信后正常的結束鏈接。該過程包含4個數據包,並且用一個FIN標志來標明鏈接的終結

 

整個過程的一個詳細概述如下:

 

(1)客戶端通過發送一個設置了FIN和ACK標志的TCP數據包,告訴服務器通信已經完成。

 

(2)服務器收到客戶端發送的數據包后,發送一個ACK數據包來響應客戶端。

 

(3)服務器再向客戶端傳送一個自己的FIN/ACK數據包。

 

(4)客戶端收到服務器的FIN/ACK包時,響應服務器一個ACK數據包。然后結束通信過程。

四次斷開的圖示如下

 

TCP重置

 

在理想情況中,每一個連接都會以TCP四次斷開來正常的結束會話。但是在現實中,連接經常會突然中斷。

(例如,這可能由於一個潛在的攻擊者正在進行斷開掃描,或者僅僅是主機配置的錯誤)

在這些情況下,就需要使用設置了RST標志的TCP數據包。RST標志用來指出連接異常中止或拒絕連接請求的包。

 

在本次實驗中,我們通過模擬局域網的兩台機器之間的數據傳輸,來抓取和分析TCP協議數據

 

服務器:windows 系統,IP地址:10.1.1.33

 

測試者:windows系統,IP地址:10.1.1.142

 

在測試環境使用發包工具和Wireshark抓取TCP三次握手和四次斷開的數據包

使用" TCP&UDP測試工具"來制作和發送TCP數據包。雙擊測試者機器桌面的" TCP&UDP測試工具"

 

1.配置服務器端

選擇10.1.1.33的機器,雙擊桌面的" TCP&UDP測試工具",右鍵點擊服務器模式,在下拉列表中,選擇創建服務器

 

選擇"創建服務器"之后,會彈出服務器端口設置,本次使用默認工具給的6000端口即可,點擊"確定"按鈕

 

點擊"確定"按鈕之后,在左側的服務器模式列表中,會出現創建的列表,選擇我們創建的服務器,右鍵點擊,選擇"啟動服務器",即完成了服務器端的配置

 

2.配置客戶端

選擇10.1.1.142的機器,雙擊桌面的" TCP&UDP測試工具",右鍵點擊客戶端模式,在下拉列表中,選擇"創建連接"

 

在彈出的窗口中,選擇TCP協議,服務器IP為10.1.1.33.端口6000,本機隨意IP

 

點擊創建

 

3.獲取TCP數據包

獲取的TCP協議的數據包。分為兩部分,即TCP三次握手,四次斷開的數據。但在實際的操作中,可能遇到的情況較多,比如源IP和目的IP比較多,協議的幀號亂序等各種問題

啟動Wireshark,在Filter中輸入tcp,點擊Apply會看到很多的數據包,這是因為測試環境中,有很多的應用程序,與其服務器連接,使用TCP協議

 

已知兩台機器的IP情況下,可以在filter中輸入"ip.addr == 10.1.1.142 and ip.addr == 10.1.1.33"來過濾出我們想要的數據,點擊工具中的"連接"按鈕

 

在發送區域輸入"hetinlabtcp"點擊發送,會持續的更新TCP數據

 

在點擊"斷開連接"后,會出現TCP的四次斷開。全部的過程如下

 

Wireshark還為我們提供了着色和指定的幀信息保存功能。左鍵點擊某一幀,右鍵選擇"Colorize Conversation",橫向選擇"TCP",橫向再選擇自己喜歡的顏色

 

結果如下

從上面可以很容易的看出,70,73,74幀是tcp的三次握手,428,429,430,431幀是四次斷開的數據。如果你還想把三次握手和四次斷開的數據包分別保存,Wireshark也提供了這樣的功能,並且支持幀序號亂序的情況。下面,我們先來保存三次握手的數據包,因三次握手的幀是亂序,我們先右鍵點擊70幀,選擇"Mark Packet(toggle)',在依次選擇73幀,74幀,如下圖

在Wireshark的菜單欄中,依次選擇FIle->Export Specified Packets 命令,打開如下所示頁面

選擇Marked packets,並選擇保存名字和路徑,即可。下面來保存四次斷開的數據,因428-431為連續的序號,所以在Wireshark的菜單欄中,依次選擇FIle->Export Specified Packets 命令,打開如下所示頁面

選擇Range,輸入序號的起始和結束數字,選擇保存名字和路徑即可

 

分析TCP協議的三次握手以及四次斷開

 

1.TCP首部

 

在分析TCP數據包之前,先介紹一下TCP首部格式,如下

 

 TCP首部格式

 

                       

 

在上面的表中,TCP首部的各字段含義如下所示:

 

源端口:用來傳輸數據包的端口。

 

目標端口:數據包將要被發送到的端口。

 

序號:該數字用來表示一個TCP片段。這個域用來保證數據流中的部分沒有流失。

 

確認號:該數字是通信中希望從另一個設備得到的下一個數據包的序號。

 

保留:包括Resverved、Nonce、CWR、和ENC-Echo,共6個比特位。

 

標記:用來表示所傳輸的TCP數據包類型。該字段中可用的標記包括URG、ACK、PSH、RST、SYN和FIN。

 

窗口大小:TCP接收者緩沖的字節大小。

 

校驗和:用來保證TCP首部和數據的內容,在達到目的地時的完整性。

 

緊急指針:如果設置了URG位,這個域將被檢查作為額外的指令,告訴CPU從數據包的哪里開始讀取數據。

 

選項:各種可選的域,可以在TCP數據包中進行指定。

 

上面提到了TCP傳輸時,可用到的標記位,下面分別介紹這6種標記的作用,如下:

 

URG:緊急標志,表示TCP包的緊急指針有效,用來保證TCP連接不被中斷,並且督促中間層設備要盡快處理這些數據。

 

ACK:確認標志,表示應答域有效,就是前面所說的TCP應答號將會包含在TCP數據包中,該標志位有兩個值,分別是0和1。當為1的時候,表示應答域有效。反之為0。

 

PSH:該標志位表示Push操作。所謂Push操作就是指在數據包到達接收端以后,立即傳送給應用程序,而不是在緩存區排隊。

 

RST:該標志位表示鏈接復位請求,用來復位那些產生錯誤的鏈接,也被用來拒絕錯誤和非法的數據包。

 

SYN:表示同步序號,用來建立連接。SYN 標志位和ACK標志位搭配使用,當連接請求的時候,SYN=1,ACK=0;當連接被響應的時候,SYN=1,ACK=1。這個標志的數據包經常被用來進行端口掃描。掃描者發現一個只有SYN的數據包,如果對方主機響應了一個數據包回來,就表面該主機存在這個端口;但是由於這種掃描方式只是進行TCP三次握手的第一次握手,因此這種掃描成功表示掃描的機器不安全。因為一個安全的主機,將會強制要求一個鏈接嚴格的進行TCP的三次握手。

 

FIN:表示發送端以及達到數據末尾,也就是說雙方的數據傳送完畢,沒有數據可以傳送了。此時發送FIN標志位的TCP數據包后,鏈接將被斷開。這個標志的數據包也經常被用於進行端口掃描。當一個FIN標志的TCP數據包發送到一台計算機的特定端口后,如果這台計算機響應了這個數據,並且反饋回來一個RST標志的TCP包,就表明這台計算機上沒有打開這個端口,但是這台計算機是存在的;如果這台計算機沒有反饋回來任何數據包,這就標明,這台被掃描的計算機存在這個端口。

 

2.分析TCP的三次握手

 

TCP三次握手是理解TCP協議最重要的部分,下面我們就以tcp-handshake.pcapng捕獲文件為例,來分析TCP的三次握手

 

2.1.第一次握手

 

TCP第一次握手,捕獲的數據包信息如下所示

 

 

從Wireshark的Packet List面板中的Info列可以看到顯示的TCP標志位是SYN。所以該數據包是客戶端向服務器發送的第一次握手連接。在Packet Details面板中,顯示了該包的詳細信息,下面詳細介紹

 

 

以上信息,表示這是第1個數據幀的相信信息,並且該包的大小為62個字節。

 

 

以上內容是以太網幀頭部信息,其實源MAC地址為02:00:04:78:01:7b,目標MAC地址為02:00:7b:16:02:43。

 

    

 

以上內容是IPv4首部的詳細信息。其中源IP是10.1.1.142,目的IP為10.1.1.33。

 

 

以上內容是傳輸層首部的詳細信息,這里使用TCP協議,其中源端口為56678,目標端口為6000.下面對該首部中的每個字段進行詳細介紹,

 

Source Port: 56678 (56678)                   #源端口號

 

Destination Port: 6000 (6000)                  #目標端口號

 

Stream index: 0                             #流節點號

 

TCP Segment Len: 0                        #分段長度

 

Sequence number: 0    (relative sequence number)   #序列號

 

Acknowledgment number: 0                      #確認編號

 

Header Length: 28 bytes                       #首部長度

 

.... 0000 0000 0010 = Flags: 0x002 (SYN)            #標志,這里是SYN

 

     000. .... .... = Reserved: Not set

 

     ...0 .... .... = Nonce: Not set

 

     .... 0... .... = Congestion Window Reduced (CWR): Not set

 

     .... .0.. .... = ECN-Echo: Not set

 

     .... ..0. .... = Urgent: Not set                #緊急指針            

 

     .... ...0 .... = Acknowledgment: Not set       #確認編號

 

     .... .... 0... = Push: Not set                 

 

     .... .... .0.. = Reset: Not set

 

     .... .... ..1. = Syn: Set                    #設置SYN標志位,值為1

 

    Expert Info (Chat/Sequence): Connection establish request (SYN): server port                      

 

      6000                               #專家信息   

 

         Connection establish request (SYN): server port 6000   #消息

 

         Severity level: Chat                              #安全級別

 

         Group: Sequence                            #組

 

.... .... ...0 = Fin: Not set                       #FIN標志位

 

Window size value: 8192               #窗口大小

 

Calculated window size: 8192              #估計的窗口大小

 

Checksum: 0x16d3 [validation disabled]        #校驗和

 

   Good Checksum: False                 

 

Bad Checksum: False

 

Urgent pointer: 0

 

Options: (8 bytes), Maximum segment size, No-Operation (NOP), No-Operation (NOP), SACK permitted                      #選項

 

    Maximum segment size: 1460 bytes                 #最大段大小

 

       Kind: Maximum Segment Size (2)

 

       Length: 4

 

       MSS Value: 1460

 

No-Operation (NOP)                            #無操作指令

 

       Type: 1

 

             0... .... = Copy on fragmentation: No

 

             .00. .... = Class: Control (0)

 

             ...0 0001 = Number: No-Operation (NOP) (1)

 

No-Operation (NOP)                     #無操作指令

 

         Type: 1

 

              0... .... = Copy on fragmentation: No

 

              .00. .... = Class: Control (0)

 

              ...0 0001 = Number: No-Operation (NOP) (1)

 

TCP SACK Permitted Option: True           #TCP SACK允許選項

 

        Kind: SACK Permitted (4)

 

        Length: 2

 

 

 

根據以上信息的描述,可以看出該包是客戶端發送給服務器建立連接請求的一個數據包。建立連接的源端口號為56678,目標端口號為6000,確認編號為0。而且在標志位FLAGS(0x0002)中,只設置了SYN,也就是位同步標志,表示請求建立連接。選項是8個字節,里面的內容有最大段(MSS),大小為1460字節。

 

我們將上面的信息,對應到TCP首部格式的每個字段,如下:

 

第一次握手TCP首部

 

   

 

2.2.第二次握手

 

TCP第二次握手捕獲數據包相信信息,如下:

 

 

在該界面顯示了第二次握手數據包的詳細信息,其中位於TCP上面的信息與第一次握手時相近似,這里不做解釋,重點看TCP協議部分,如下

 

Source Port: 6000(6000)                   #源端口號

 

Destination Port: 56678(56678)                  #目標端口號

 

Stream index: 0                             #流節點號

 

TCP Segment Len: 0                        #分段長度

 

Sequence number: 0    (relative sequence number)   #序列號

 

Acknowledgment number: 1    (relative ack number)         #確認編號,值為1

 

Header Length: 28 bytes                       #首部長度

 

.... 0000 0001 0010 = Flags: 0x012 (SYN,ACK)    #標志位,此處為(SYN,ACK)

 

    000. .... .... = Reserved: Not set

 

    ...0 .... .... = Nonce: Not set

 

     .... 0... .... = Congestion Window Reduced (CWR): Not set

 

     .... .0.. .... = ECN-Echo: Not set

 

     .... ..0. .... = Urgent: Not set                           

 

     .... ...1 .... = Acknowledgment: Not set       #確認編號已設置

 

     .... .... 0... = Push: Not set                

 

     .... .... .0.. = Reset: Not set

 

     .... .... ..1. = Syn: Set                    #請求位

 

Expert Info (Chat/Sequence): Connection establish request (SYN): server port                 

 

6000                               #專家信息   

 

Connection establish request (SYN): server port 6000   #消息

 

     Severity level: Chat                              #安全級別

 

     roup: Sequence                                  #組

 

     .... .... ...0 = Fin: Not set                               #FIN標志位

 

Window size value: 8192               #窗口大小

 

Calculated window size: 8192              #估計的窗口大小

 

Checksum: 0x5bf8 [validation disabled]        #校驗和

 

Good Checksum: False                 

 

Bad Checksum: False

 

Urgent pointer: 0

 

Options: (8 bytes), Maximum segment size, No-Operation (NOP), No-Operation (NOP), SACK permitted               #選項

 

Maximum segment size: 1460 bytes                 #最大段大小

 

     Kind: Maximum Segment Size (2)

 

     Length: 4

 

     MSS Value: 1460

 

No-Operation (NOP)                            #無操作指令

 

     Type: 1

 

          0... .... = Copy on fragmentation: No

 

          .00. .... = Class: Control (0)

 

          ...0 0001 = Number: No-Operation (NOP) (1)

 

No-Operation (NOP)                     #無操作指令

 

       Type: 1

 

        0... .... = Copy on fragmentation: No

 

        .00. .... = Class: Control (0)

 

        ...0 0001 = Number: No-Operation (NOP) (1)

 

TCP SACK Permitted Option: True           #TCP SACK允許選項

 

   Kind: SACK Permitted (4)

 

   Length: 2

 

SEQ/ACK analysis                  #序列號/確認編號分析

 

This is an ACK to the segment in frame: 1

 

The RTT to ACK the segment was: 0.002362000 seconds

 

iRTT: 0.002387000 seconds

 

 

 

以上描述的詳細信息是服務器收到請求后,發給客戶端的確認包(SYN+ACK)。根據以上描述,可以看到在該幀數據包中包含這個主機初始的序列號0,以及一個確認號1。這個確認號比之前那個數據包(1幀數據包)序列號大1,是因為該域是用來表示主機所期望得到的下一個序列號的值。

 

我們將上面的信息,對應到TCP首部格式的每個字段,如下:

 

第二次握手TCP首部

 

 

 

2.3.第三次握手

 

TCP第三次握手捕獲數據包相信信息,如下:

 

 

這里我們直接看重點的TCP協議部分

 

Source Port: 56678(56678)                  #源端口號

 

Destination Port: 6000(6000)                  #目標端口號

 

Stream index: 0                             #流節點號

 

TCP Segment Len: 0                        #分段長度

 

Sequence number: 1   (relative sequence number)   #序列號

 

Acknowledgment number: 1    (relative ack number)         #確認編號,值為1

 

Header Length: 20 bytes                       #首部長度

 

.... 0000 0001 0000 = Flags: 0x010  (ACK)           #標志位,此處為(ACK)

 

     000. .... .... = Reserved: Not set

 

     ...0 .... .... = Nonce: Not set

 

     .... 0... .... = Congestion Window Reduced (CWR): Not set

 

     .... .0.. .... = ECN-Echo: Not set

 

     .... ..0. .... = Urgent: Not set                          

 

     .... ...1 .... = Acknowledgment: Not set       #確認編號已設置

 

     .... .... 0... = Push: Not set                

 

     .... .... .0.. = Reset: Not set

 

     .... .... ..0. = Syn: Set                    #請求位

 

     .... .... ...0 = Fin: Not set                               #FIN標志位

 

Window size value: 64240               #窗口大小

 

Calculated window size: 64240                   #估計的窗口大小

 

Window size scaling factor: -2 (no window scaling used)  #窗口大小縮放比例因素

 

Checksum: 0x16cb [validation disabled]        #校驗和

 

    Good Checksum: False                 

 

    Bad Checksum: False

 

Urgent pointer: 0

 

SEQ/ACK analysis                  

 

    This is an ACK to the segment in frame: 2

 

The RTT to ACK the segment was: 0.000025000 seconds

 

iRTT: 0.002387000 seconds

 

 

 

以上信息就是客戶端向服務器發送的確認包。在以上信息中,序列號和確認號都是1。標志位中只設置了ACK,表示該數據包是一個確認包。這樣就完成了TCP鏈接的建立階段。此時沒有Options字段。

 

我們將上面的信息,對應到TCP首部格式的每個字段,如下:

 

第三次握手TCP首部

 

 

接下來分析TCP的四次斷開

 

1.第一次斷開

 

TCP第一次斷開連接的數據包,如下:

 

 

在該界面顯示了TCP第一次斷開,數據包的詳細信息,我們具體來看下TCP部分

 

Source Port: 56678(56678)                  #源端口號

 

Destination Port: 6000(6000)                  #目標端口號

 

Stream index: 0                         #流節點號

 

TCP Segment Len: 0                        #分段長度

 

Sequence number: 1   (relative sequence number)       #序列號

 

Acknowledgment number: 1    (relative ack number)         #確認編號

 

Header Length: 20 bytes                       #首部長度

 

.... 0000 0001 0001 = Flags: 0x011 (FIN,ACK)    #標志位,此處為(FIN,ACK)

 

     000. .... .... = Reserved: Not set

 

     ...0 .... .... = Nonce: Not set

 

     .... 0... .... = Congestion Window Reduced (CWR): Not set

 

     .... .0.. .... = ECN-Echo: Not set

 

     .... ..0. .... = Urgent: Not set                          

 

     .... ...1 .... = Acknowledgment: Not set       #確認編號已設置

 

     .... .... 0... = Push: Not set                

 

     .... .... .0.. = Reset: Not set

 

     .... .... ..0. = Syn: Set                    #請求位

 

     .... .... ...1 = Fin: Not set                               #FIN標志位

 

Expert Info (Chat/Sequence): Connection finish (FIN)       #專家信息

 

     Connection finish (FIN)          #消息內容,連接完成(FIN)

 

     Severity level: Chat           #安全級別

 

     Group: Sequence

 

Window size value: 64240               #窗口大小

 

Calculated window size: 64240                   #估計的窗口大小

 

   Window size scaling factor: -1 (unknown)      #窗口大小縮放比例因素

 

Checksum: 0x16cb [validation disabled]        #校驗和

 

   Good Checksum: False                 

 

   Bad Checksum: False

 

Urgent pointer: 0

 

通過以上信息的描述,可以看到客戶端向服務器發送FIN和ACK標志的數據包開始斷開連接,其中FIN和ACK標志位都為1.

 

我們將上面的信息,對應到TCP首部格式的每個字段,如下:

 

第一次斷開TCP首部格式

 

 

2.第二次斷開

 

TCP第二次斷開連接的數據包,如下

 

 

在該界面顯示了TCP第二次斷開,數據包的詳細信息,我們具體來看下TCP部分

 

Source Port: 6000(6000)                  #源端口號

 

Destination Port: 56678(56678)                  #目標端口號

 

Stream index: 0                             #流節點號

 

TCP Segment Len: 0                        #分段長度

 

Sequence number: 1   (relative sequence number)    #序列號

 

Acknowledgment number: 2    (relative ack number)         #確認編號

 

Header Length: 20 bytes                       #首部長度

 

.... 0000 0001 0000 = Flags: 0x010(ACK)    #標志位,此處為(ACK)

 

     000. .... .... = Reserved: Not set

 

     ...0 .... .... = Nonce: Not set

 

     .... 0... .... = Congestion Window Reduced (CWR): Not set

 

     .... .0.. .... = ECN-Echo: Not set

 

     .... ..0. .... = Urgent: Not set                          

 

     .... ...1 .... = Acknowledgment: Not set       #確認編號已設置

 

     .... .... 0... = Push: Not set                

 

     .... .... .0.. = Reset: Not set

 

     .... .... ..0. = Syn: Set                    #請求位

 

     .... .... ...0= Fin: Not set                               #FIN標志位

 

Window size value: 64240               #窗口大小

 

Calculated window size: 64240                   #估計的窗口大小

 

Window size scaling factor: -1 (unknown)      #窗口大小縮放比例因素

 

Checksum: 0xadbe [validation disabled]        #校驗和

 

    Good Checksum: False                 

 

    Bad Checksum: False

 

Urgent pointer: 0

 

SEQ/ACK analysis

 

     This is an ACK to the segment in frame: 1

 

     The RTT to ACK the segment was: 0.000369000 seconds

 

通過以上信息的描述,可以看出該包是服務器向客戶端發送的ACK包。其中ACK標志位為1.

 

我們將上面的信息,對應到TCP首部格式的每個字段,如下:

 

第二次斷開TCP首部格式

 

 

3.第三次斷開

 

TCP第三次斷開連接的數據包,如下

 

 

在該界面顯示了TCP第三次斷開,數據包的詳細信息,我們具體來看下TCP部分

 

Source Port: 6000(6000)                  #源端口號

 

Destination Port: 56678(56678)                  #目標端口號

 

Stream index: 0                             #流節點號

 

TCP Segment Len: 0                        #分段長度

 

Sequence number: 1   (relative sequence number)      #序列號

 

Acknowledgment number: 2    (relative ack number)         #確認編號

 

Header Length: 20 bytes                       #首部長度

 

.... 0000 0001 0001 = Flags: 0x010(FIN,ACK)    #標志位,此處為(FIN,ACK)

 

     000. .... .... = Reserved: Not set

 

     ...0 .... .... = Nonce: Not set

 

     .... 0... .... = Congestion Window Reduced (CWR): Not set

 

     .... .0.. .... = ECN-Echo: Not set

 

     .... ..0. .... = Urgent: Not set                          

 

     .... ...1 .... = Acknowledgment: Not set       #確認編號已設置

 

     .... .... 0... = Push: Not set                

 

     .... .... .0.. = Reset: Not set

 

     .... .... ..0. = Syn: Set                    #請求位

 

     .... .... ...1= Fin: Not set                     #FIN標志位

 

Expert Info (Chat/Sequence): Connection finish (FIN)    #專家信息

 

      Connection finish (FIN)

 

      Severity level: Chat

 

      Group: Sequence

 

Window size value: 64240               #窗口大小

 

Calculated window size: 64240                   #估計的窗口大小

 

Window size scaling factor: -1 (unknown)   #窗口大小縮放比例因素

 

Checksum: 0xadbe [validation disabled]        #校驗和

 

   Good Checksum: False                 

 

   Bad Checksum: False

 

Urgent pointer: 0

 

通過以上信息的描述,可以看出該包是服務器向客戶端發送的FIN和ACK包。其中FIN和ACK標志位為1.

 

我們將上面的信息,對應到TCP首部格式的每個字段,如下:

 

第三次斷開TCP首部格式

 

 

4.第四次斷開

 

TCP第四次斷開連接的數據包,如下

 

 

在該界面顯示了TCP第四次斷開,數據包的詳細信息,我們具體來看下TCP部分

 

Source Port: 56678(56678)                  #源端口號

 

Destination Port: 6000(6000)                  #目標端口號

 

Stream index: 0                          #流節點號

 

TCP Segment Len: 0                        #分段長度

 

Sequence number: 2   (relative sequence number)      #序列號

 

Acknowledgment number: 1    (relative ack number)         #確認編號

 

Header Length: 20 bytes                       #首部長度

 

.... 0000 0001 0000 = Flags: 0x010 (ACK)    #標志位,此處為(ACK)

 

     000. .... .... = Reserved: Not set

 

     ...0 .... .... = Nonce: Not set

 

     .... 0... .... = Congestion Window Reduced (CWR): Not set

 

     .... .0.. .... = ECN-Echo: Not set

 

     .... ..0. .... = Urgent: Not set                          

 

     .... ...1 .... = Acknowledgment: Not set       #確認編號已設置

 

     .... .... 0... = Push: Not set                

 

     .... .... .0.. = Reset: Not set

 

     .... .... ..0. = Syn: Set                    #請求位

 

     .... .... ...1 = Fin: Not set                               #FIN標志位

 

Window size value: 64240               #窗口大小

 

Calculated window size: 64240                   #估計的窗口大小

 

Window size scaling factor: -1 (unknown)      #窗口大小縮放比例因素

 

Checksum: 0x16cb [validation disabled]        #校驗和

 

    Good Checksum: False                 

 

    Bad Checksum: False

 

Urgent pointer: 0

 

SEQ/ACK analysis

 

    This is an ACK to the segment in frame: 3

 

    The RTT to ACK the segment was: 0.000040000 seconds

 

通過以上信息的描述,可以看到客戶端向服務器發送ACK的包。其中,ACK標志位都為1.

 

我們將上面的信息,對應到TCP首部格式的每個字段,如下:

 

第四次斷開TCP首部格式

 

TCP協議傳輸數據時,每發送一個數據包都要求確認。如果有一個數據包丟失,就收不到確認包,發送方就知道應該重發這個數據包,所以相比於UDP協議來說TCP協議保證了數據的安全性。

TCP端口

TCP端口就是為TCP協議通信提供服務的窗口。所有TCP通信都會使用源端口和目的端口,而這些可以在每個TCP頭中找到。端口就像是老式電話機上的接口,一個總計操作員會監視着一個面板上的指示燈和插頭。當指示燈亮起的時候,它就會鏈接這個呼叫者,問它想要和誰通話,然后插一根電纜線將它和它的目的地址鏈接起來。每次呼叫都需要有一個源端口(呼叫者)和目的端口(接收者)。TCP端口大概就是這樣工作的。

為了能夠將數據傳輸到遠程服務器或者設備的特定應用中去,TCP數據包必須知道遠程服務所監聽的端口。如果想試着鏈接一個不同於所設置的端口,那么這個通信就會失敗。這個序列中的源端口並不十分重要,所以可以隨機選擇。遠程服務器也可以很簡單的從發送過來的原始數據中得到這個端口。

客戶端與不同服務器建立連接時,使用的源端口和目標端口都不同。

 

在使用TCP進行通信的時候,有65535個端口可供使用,並通常將這些端口分成兩個部分,如下所示:

 

1~1023:是標准端口組(忽略掉被預留的0),特定服務會用到這些通常位於標准端口分組中的標准端口。

 

1024~65535:是臨時端口組(盡管一些操作對此有着不同的定義),當一個服務想在任意時間使用端口進行通信的時候,操作系統都會隨機選擇這個源端口,讓這個通信使用唯一的源端口。這些源端口通常就位於臨時端口組。

 

TCP三次握手

 

在TCP/IP協議中,TCP協議提供可靠的鏈接服務,通過使用三次握手建立一個鏈接。所有基於TCP協議的通信都需要以兩台主機的握手開始。

第一次握手建立連接時,客戶端向服務器端發送SYN報文(Seq=x,SYN=1),並進入SYN_SEND狀態,等待服務器確認

(Seq表示請求序列號,Ack表示確認序列號,SYN和ACK為控制位)

 

第二次握手實際上是分兩部分完成的。即SYN+ACK(請求和確認)報文。

 

(1)服務器收到了客戶端的請求,向客戶端回復一個確認信息(Ack=x+1)

 

(2)服務器再向客戶端發送一個SYN包(Seq=y)建立連接的請求,此時服務器進入SYN_RECV狀態

第三次握手,客戶端收到服務器的回復(SYN+ACK報文)。此時,客戶端也要向服務器發送確認包(ACK).此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手

此時,客戶端就可以與服務器開始傳送數據了

三次握手建立連接的圖示如下

 

 

 

 

 

TCP四次斷開

 

在TCP協議中,每次握手后都會終止。就和人與人之間相互問候一樣,最終都會有一句再見。TCP終止用來在兩台設備完成通信后正常的結束鏈接。該過程包含4個數據包,並且用一個FIN標志來標明鏈接的終結

 

整個過程的一個詳細概述如下:

 

(1)客戶端通過發送一個設置了FIN和ACK標志的TCP數據包,告訴服務器通信已經完成。

 

(2)服務器收到客戶端發送的數據包后,發送一個ACK數據包來響應客戶端。

 

(3)服務器再向客戶端傳送一個自己的FIN/ACK數據包。

 

(4)客戶端收到服務器的FIN/ACK包時,響應服務器一個ACK數據包。然后結束通信過程。

四次斷開的圖示如下

 

TCP重置

 

在理想情況中,每一個連接都會以TCP四次斷開來正常的結束會話。但是在現實中,連接經常會突然中斷。

(例如,這可能由於一個潛在的攻擊者正在進行斷開掃描,或者僅僅是主機配置的錯誤)

在這些情況下,就需要使用設置了RST標志的TCP數據包。RST標志用來指出連接異常中止或拒絕連接請求的包。

 

在本次實驗中,我們通過模擬局域網的兩台機器之間的數據傳輸,來抓取和分析TCP協議數據

 

服務器:windows 系統,IP地址:10.1.1.33

 

測試者:windows系統,IP地址:10.1.1.142

 

在測試環境使用發包工具和Wireshark抓取TCP三次握手和四次斷開的數據包

使用" TCP&UDP測試工具"來制作和發送TCP數據包。雙擊測試者機器桌面的" TCP&UDP測試工具"

 

1.配置服務器端

選擇10.1.1.33的機器,雙擊桌面的" TCP&UDP測試工具",右鍵點擊服務器模式,在下拉列表中,選擇創建服務器

 

選擇"創建服務器"之后,會彈出服務器端口設置,本次使用默認工具給的6000端口即可,點擊"確定"按鈕

 

點擊"確定"按鈕之后,在左側的服務器模式列表中,會出現創建的列表,選擇我們創建的服務器,右鍵點擊,選擇"啟動服務器",即完成了服務器端的配置

 

2.配置客戶端

選擇10.1.1.142的機器,雙擊桌面的" TCP&UDP測試工具",右鍵點擊客戶端模式,在下拉列表中,選擇"創建連接"

 

在彈出的窗口中,選擇TCP協議,服務器IP為10.1.1.33.端口6000,本機隨意IP

 

點擊創建

 

3.獲取TCP數據包

獲取的TCP協議的數據包。分為兩部分,即TCP三次握手,四次斷開的數據。但在實際的操作中,可能遇到的情況較多,比如源IP和目的IP比較多,協議的幀號亂序等各種問題

啟動Wireshark,在Filter中輸入tcp,點擊Apply會看到很多的數據包,這是因為測試環境中,有很多的應用程序,與其服務器連接,使用TCP協議

 

已知兩台機器的IP情況下,可以在filter中輸入"ip.addr == 10.1.1.142 and ip.addr == 10.1.1.33"來過濾出我們想要的數據,點擊工具中的"連接"按鈕

 

在發送區域輸入"hetinlabtcp"點擊發送,會持續的更新TCP數據

 

在點擊"斷開連接"后,會出現TCP的四次斷開。全部的過程如下

 

Wireshark還為我們提供了着色和指定的幀信息保存功能。左鍵點擊某一幀,右鍵選擇"Colorize Conversation",橫向選擇"TCP",橫向再選擇自己喜歡的顏色

 

結果如下

從上面可以很容易的看出,70,73,74幀是tcp的三次握手,428,429,430,431幀是四次斷開的數據。如果你還想把三次握手和四次斷開的數據包分別保存,Wireshark也提供了這樣的功能,並且支持幀序號亂序的情況。下面,我們先來保存三次握手的數據包,因三次握手的幀是亂序,我們先右鍵點擊70幀,選擇"Mark Packet(toggle)',在依次選擇73幀,74幀,如下圖

在Wireshark的菜單欄中,依次選擇FIle->Export Specified Packets 命令,打開如下所示頁面

選擇Marked packets,並選擇保存名字和路徑,即可。下面來保存四次斷開的數據,因428-431為連續的序號,所以在Wireshark的菜單欄中,依次選擇FIle->Export Specified Packets 命令,打開如下所示頁面

選擇Range,輸入序號的起始和結束數字,選擇保存名字和路徑即可

 

分析TCP協議的三次握手以及四次斷開

 

1.TCP首部

 

在分析TCP數據包之前,先介紹一下TCP首部格式,如下

 

 TCP首部格式

 

                       

 

在上面的表中,TCP首部的各字段含義如下所示:

 

源端口:用來傳輸數據包的端口。

 

目標端口:數據包將要被發送到的端口。

 

序號:該數字用來表示一個TCP片段。這個域用來保證數據流中的部分沒有流失。

 

確認號:該數字是通信中希望從另一個設備得到的下一個數據包的序號。

 

保留:包括Resverved、Nonce、CWR、和ENC-Echo,共6個比特位。

 

標記:用來表示所傳輸的TCP數據包類型。該字段中可用的標記包括URG、ACK、PSH、RST、SYN和FIN。

 

窗口大小:TCP接收者緩沖的字節大小。

 

校驗和:用來保證TCP首部和數據的內容,在達到目的地時的完整性。

 

緊急指針:如果設置了URG位,這個域將被檢查作為額外的指令,告訴CPU從數據包的哪里開始讀取數據。

 

選項:各種可選的域,可以在TCP數據包中進行指定。

 

上面提到了TCP傳輸時,可用到的標記位,下面分別介紹這6種標記的作用,如下:

 

URG:緊急標志,表示TCP包的緊急指針有效,用來保證TCP連接不被中斷,並且督促中間層設備要盡快處理這些數據。

 

ACK:確認標志,表示應答域有效,就是前面所說的TCP應答號將會包含在TCP數據包中,該標志位有兩個值,分別是0和1。當為1的時候,表示應答域有效。反之為0。

 

PSH:該標志位表示Push操作。所謂Push操作就是指在數據包到達接收端以后,立即傳送給應用程序,而不是在緩存區排隊。

 

RST:該標志位表示鏈接復位請求,用來復位那些產生錯誤的鏈接,也被用來拒絕錯誤和非法的數據包。

 

SYN:表示同步序號,用來建立連接。SYN 標志位和ACK標志位搭配使用,當連接請求的時候,SYN=1,ACK=0;當連接被響應的時候,SYN=1,ACK=1。這個標志的數據包經常被用來進行端口掃描。掃描者發現一個只有SYN的數據包,如果對方主機響應了一個數據包回來,就表面該主機存在這個端口;但是由於這種掃描方式只是進行TCP三次握手的第一次握手,因此這種掃描成功表示掃描的機器不安全。因為一個安全的主機,將會強制要求一個鏈接嚴格的進行TCP的三次握手。

 

FIN:表示發送端以及達到數據末尾,也就是說雙方的數據傳送完畢,沒有數據可以傳送了。此時發送FIN標志位的TCP數據包后,鏈接將被斷開。這個標志的數據包也經常被用於進行端口掃描。當一個FIN標志的TCP數據包發送到一台計算機的特定端口后,如果這台計算機響應了這個數據,並且反饋回來一個RST標志的TCP包,就表明這台計算機上沒有打開這個端口,但是這台計算機是存在的;如果這台計算機沒有反饋回來任何數據包,這就標明,這台被掃描的計算機存在這個端口。

 

2.分析TCP的三次握手

 

TCP三次握手是理解TCP協議最重要的部分,下面我們就以tcp-handshake.pcapng捕獲文件為例,來分析TCP的三次握手

 

2.1.第一次握手

 

TCP第一次握手,捕獲的數據包信息如下所示

 

 

從Wireshark的Packet List面板中的Info列可以看到顯示的TCP標志位是SYN。所以該數據包是客戶端向服務器發送的第一次握手連接。在Packet Details面板中,顯示了該包的詳細信息,下面詳細介紹

 

 

以上信息,表示這是第1個數據幀的相信信息,並且該包的大小為62個字節。

 

 

以上內容是以太網幀頭部信息,其實源MAC地址為02:00:04:78:01:7b,目標MAC地址為02:00:7b:16:02:43。

 

    

 

以上內容是IPv4首部的詳細信息。其中源IP是10.1.1.142,目的IP為10.1.1.33。

 

 

以上內容是傳輸層首部的詳細信息,這里使用TCP協議,其中源端口為56678,目標端口為6000.下面對該首部中的每個字段進行詳細介紹,

 

Source Port: 56678 (56678)                   #源端口號

 

Destination Port: 6000 (6000)                  #目標端口號

 

Stream index: 0                             #流節點號

 

TCP Segment Len: 0                        #分段長度

 

Sequence number: 0    (relative sequence number)   #序列號

 

Acknowledgment number: 0                      #確認編號

 

Header Length: 28 bytes                       #首部長度

 

.... 0000 0000 0010 = Flags: 0x002 (SYN)            #標志,這里是SYN

 

     000. .... .... = Reserved: Not set

 

     ...0 .... .... = Nonce: Not set

 

     .... 0... .... = Congestion Window Reduced (CWR): Not set

 

     .... .0.. .... = ECN-Echo: Not set

 

     .... ..0. .... = Urgent: Not set                #緊急指針            

 

     .... ...0 .... = Acknowledgment: Not set       #確認編號

 

     .... .... 0... = Push: Not set                 

 

     .... .... .0.. = Reset: Not set

 

     .... .... ..1. = Syn: Set                    #設置SYN標志位,值為1

 

    Expert Info (Chat/Sequence): Connection establish request (SYN): server port                      

 

      6000                               #專家信息   

 

         Connection establish request (SYN): server port 6000   #消息

 

         Severity level: Chat                              #安全級別

 

         Group: Sequence                            #組

 

.... .... ...0 = Fin: Not set                       #FIN標志位

 

Window size value: 8192               #窗口大小

 

Calculated window size: 8192              #估計的窗口大小

 

Checksum: 0x16d3 [validation disabled]        #校驗和

 

   Good Checksum: False                 

 

Bad Checksum: False

 

Urgent pointer: 0

 

Options: (8 bytes), Maximum segment size, No-Operation (NOP), No-Operation (NOP), SACK permitted                      #選項

 

    Maximum segment size: 1460 bytes                 #最大段大小

 

       Kind: Maximum Segment Size (2)

 

       Length: 4

 

       MSS Value: 1460

 

No-Operation (NOP)                            #無操作指令

 

       Type: 1

 

             0... .... = Copy on fragmentation: No

 

             .00. .... = Class: Control (0)

 

             ...0 0001 = Number: No-Operation (NOP) (1)

 

No-Operation (NOP)                     #無操作指令

 

         Type: 1

 

              0... .... = Copy on fragmentation: No

 

              .00. .... = Class: Control (0)

 

              ...0 0001 = Number: No-Operation (NOP) (1)

 

TCP SACK Permitted Option: True           #TCP SACK允許選項

 

        Kind: SACK Permitted (4)

 

        Length: 2

 

 

 

根據以上信息的描述,可以看出該包是客戶端發送給服務器建立連接請求的一個數據包。建立連接的源端口號為56678,目標端口號為6000,確認編號為0。而且在標志位FLAGS(0x0002)中,只設置了SYN,也就是位同步標志,表示請求建立連接。選項是8個字節,里面的內容有最大段(MSS),大小為1460字節。

 

我們將上面的信息,對應到TCP首部格式的每個字段,如下:

 

第一次握手TCP首部

 

   

 

2.2.第二次握手

 

TCP第二次握手捕獲數據包相信信息,如下:

 

 

在該界面顯示了第二次握手數據包的詳細信息,其中位於TCP上面的信息與第一次握手時相近似,這里不做解釋,重點看TCP協議部分,如下

 

Source Port: 6000(6000)                   #源端口號

 

Destination Port: 56678(56678)                  #目標端口號

 

Stream index: 0                             #流節點號

 

TCP Segment Len: 0                        #分段長度

 

Sequence number: 0    (relative sequence number)   #序列號

 

Acknowledgment number: 1    (relative ack number)         #確認編號,值為1

 

Header Length: 28 bytes                       #首部長度

 

.... 0000 0001 0010 = Flags: 0x012 (SYN,ACK)    #標志位,此處為(SYN,ACK)

 

    000. .... .... = Reserved: Not set

 

    ...0 .... .... = Nonce: Not set

 

     .... 0... .... = Congestion Window Reduced (CWR): Not set

 

     .... .0.. .... = ECN-Echo: Not set

 

     .... ..0. .... = Urgent: Not set                           

 

     .... ...1 .... = Acknowledgment: Not set       #確認編號已設置

 

     .... .... 0... = Push: Not set                

 

     .... .... .0.. = Reset: Not set

 

     .... .... ..1. = Syn: Set                    #請求位

 

Expert Info (Chat/Sequence): Connection establish request (SYN): server port                 

 

6000                               #專家信息   

 

Connection establish request (SYN): server port 6000   #消息

 

     Severity level: Chat                              #安全級別

 

     roup: Sequence                                  #組

 

     .... .... ...0 = Fin: Not set                               #FIN標志位

 

Window size value: 8192               #窗口大小

 

Calculated window size: 8192              #估計的窗口大小

 

Checksum: 0x5bf8 [validation disabled]        #校驗和

 

Good Checksum: False                 

 

Bad Checksum: False

 

Urgent pointer: 0

 

Options: (8 bytes), Maximum segment size, No-Operation (NOP), No-Operation (NOP), SACK permitted               #選項

 

Maximum segment size: 1460 bytes                 #最大段大小

 

     Kind: Maximum Segment Size (2)

 

     Length: 4

 

     MSS Value: 1460

 

No-Operation (NOP)                            #無操作指令

 

     Type: 1

 

          0... .... = Copy on fragmentation: No

 

          .00. .... = Class: Control (0)

 

          ...0 0001 = Number: No-Operation (NOP) (1)

 

No-Operation (NOP)                     #無操作指令

 

       Type: 1

 

        0... .... = Copy on fragmentation: No

 

        .00. .... = Class: Control (0)

 

        ...0 0001 = Number: No-Operation (NOP) (1)

 

TCP SACK Permitted Option: True           #TCP SACK允許選項

 

   Kind: SACK Permitted (4)

 

   Length: 2

 

SEQ/ACK analysis                  #序列號/確認編號分析

 

This is an ACK to the segment in frame: 1

 

The RTT to ACK the segment was: 0.002362000 seconds

 

iRTT: 0.002387000 seconds

 

 

 

以上描述的詳細信息是服務器收到請求后,發給客戶端的確認包(SYN+ACK)。根據以上描述,可以看到在該幀數據包中包含這個主機初始的序列號0,以及一個確認號1。這個確認號比之前那個數據包(1幀數據包)序列號大1,是因為該域是用來表示主機所期望得到的下一個序列號的值。

 

我們將上面的信息,對應到TCP首部格式的每個字段,如下:

 

第二次握手TCP首部

 

 

 

2.3.第三次握手

 

TCP第三次握手捕獲數據包相信信息,如下:

 

 

這里我們直接看重點的TCP協議部分

 

Source Port: 56678(56678)                  #源端口號

 

Destination Port: 6000(6000)                  #目標端口號

 

Stream index: 0                             #流節點號

 

TCP Segment Len: 0                        #分段長度

 

Sequence number: 1   (relative sequence number)   #序列號

 

Acknowledgment number: 1    (relative ack number)         #確認編號,值為1

 

Header Length: 20 bytes                       #首部長度

 

.... 0000 0001 0000 = Flags: 0x010  (ACK)           #標志位,此處為(ACK)

 

     000. .... .... = Reserved: Not set

 

     ...0 .... .... = Nonce: Not set

 

     .... 0... .... = Congestion Window Reduced (CWR): Not set

 

     .... .0.. .... = ECN-Echo: Not set

 

     .... ..0. .... = Urgent: Not set                          

 

     .... ...1 .... = Acknowledgment: Not set       #確認編號已設置

 

     .... .... 0... = Push: Not set                

 

     .... .... .0.. = Reset: Not set

 

     .... .... ..0. = Syn: Set                    #請求位

 

     .... .... ...0 = Fin: Not set                               #FIN標志位

 

Window size value: 64240               #窗口大小

 

Calculated window size: 64240                   #估計的窗口大小

 

Window size scaling factor: -2 (no window scaling used)  #窗口大小縮放比例因素

 

Checksum: 0x16cb [validation disabled]        #校驗和

 

    Good Checksum: False                 

 

    Bad Checksum: False

 

Urgent pointer: 0

 

SEQ/ACK analysis                  

 

    This is an ACK to the segment in frame: 2

 

The RTT to ACK the segment was: 0.000025000 seconds

 

iRTT: 0.002387000 seconds

 

 

 

以上信息就是客戶端向服務器發送的確認包。在以上信息中,序列號和確認號都是1。標志位中只設置了ACK,表示該數據包是一個確認包。這樣就完成了TCP鏈接的建立階段。此時沒有Options字段。

 

我們將上面的信息,對應到TCP首部格式的每個字段,如下:

 

第三次握手TCP首部

 

 

接下來分析TCP的四次斷開

 

1.第一次斷開

 

TCP第一次斷開連接的數據包,如下:

 

 

在該界面顯示了TCP第一次斷開,數據包的詳細信息,我們具體來看下TCP部分

 

Source Port: 56678(56678)                  #源端口號

 

Destination Port: 6000(6000)                  #目標端口號

 

Stream index: 0                         #流節點號

 

TCP Segment Len: 0                        #分段長度

 

Sequence number: 1   (relative sequence number)       #序列號

 

Acknowledgment number: 1    (relative ack number)         #確認編號

 

Header Length: 20 bytes                       #首部長度

 

.... 0000 0001 0001 = Flags: 0x011 (FIN,ACK)    #標志位,此處為(FIN,ACK)

 

     000. .... .... = Reserved: Not set

 

     ...0 .... .... = Nonce: Not set

 

     .... 0... .... = Congestion Window Reduced (CWR): Not set

 

     .... .0.. .... = ECN-Echo: Not set

 

     .... ..0. .... = Urgent: Not set                          

 

     .... ...1 .... = Acknowledgment: Not set       #確認編號已設置

 

     .... .... 0... = Push: Not set                

 

     .... .... .0.. = Reset: Not set

 

     .... .... ..0. = Syn: Set                    #請求位

 

     .... .... ...1 = Fin: Not set                               #FIN標志位

 

Expert Info (Chat/Sequence): Connection finish (FIN)       #專家信息

 

     Connection finish (FIN)          #消息內容,連接完成(FIN)

 

     Severity level: Chat           #安全級別

 

     Group: Sequence

 

Window size value: 64240               #窗口大小

 

Calculated window size: 64240                   #估計的窗口大小

 

   Window size scaling factor: -1 (unknown)      #窗口大小縮放比例因素

 

Checksum: 0x16cb [validation disabled]        #校驗和

 

   Good Checksum: False                 

 

   Bad Checksum: False

 

Urgent pointer: 0

 

通過以上信息的描述,可以看到客戶端向服務器發送FIN和ACK標志的數據包開始斷開連接,其中FIN和ACK標志位都為1.

 

我們將上面的信息,對應到TCP首部格式的每個字段,如下:

 

第一次斷開TCP首部格式

 

 

2.第二次斷開

 

TCP第二次斷開連接的數據包,如下

 

 

在該界面顯示了TCP第二次斷開,數據包的詳細信息,我們具體來看下TCP部分

 

Source Port: 6000(6000)                  #源端口號

 

Destination Port: 56678(56678)                  #目標端口號

 

Stream index: 0                             #流節點號

 

TCP Segment Len: 0                        #分段長度

 

Sequence number: 1   (relative sequence number)    #序列號

 

Acknowledgment number: 2    (relative ack number)         #確認編號

 

Header Length: 20 bytes                       #首部長度

 

.... 0000 0001 0000 = Flags: 0x010(ACK)    #標志位,此處為(ACK)

 

     000. .... .... = Reserved: Not set

 

     ...0 .... .... = Nonce: Not set

 

     .... 0... .... = Congestion Window Reduced (CWR): Not set

 

     .... .0.. .... = ECN-Echo: Not set

 

     .... ..0. .... = Urgent: Not set                          

 

     .... ...1 .... = Acknowledgment: Not set       #確認編號已設置

 

     .... .... 0... = Push: Not set                

 

     .... .... .0.. = Reset: Not set

 

     .... .... ..0. = Syn: Set                    #請求位

 

     .... .... ...0= Fin: Not set                               #FIN標志位

 

Window size value: 64240               #窗口大小

 

Calculated window size: 64240                   #估計的窗口大小

 

Window size scaling factor: -1 (unknown)      #窗口大小縮放比例因素

 

Checksum: 0xadbe [validation disabled]        #校驗和

 

    Good Checksum: False                 

 

    Bad Checksum: False

 

Urgent pointer: 0

 

SEQ/ACK analysis

 

     This is an ACK to the segment in frame: 1

 

     The RTT to ACK the segment was: 0.000369000 seconds

 

通過以上信息的描述,可以看出該包是服務器向客戶端發送的ACK包。其中ACK標志位為1.

 

我們將上面的信息,對應到TCP首部格式的每個字段,如下:

 

第二次斷開TCP首部格式

 

 

3.第三次斷開

 

TCP第三次斷開連接的數據包,如下

 

 

在該界面顯示了TCP第三次斷開,數據包的詳細信息,我們具體來看下TCP部分

 

Source Port: 6000(6000)                  #源端口號

 

Destination Port: 56678(56678)                  #目標端口號

 

Stream index: 0                             #流節點號

 

TCP Segment Len: 0                        #分段長度

 

Sequence number: 1   (relative sequence number)      #序列號

 

Acknowledgment number: 2    (relative ack number)         #確認編號

 

Header Length: 20 bytes                       #首部長度

 

.... 0000 0001 0001 = Flags: 0x010(FIN,ACK)    #標志位,此處為(FIN,ACK)

 

     000. .... .... = Reserved: Not set

 

     ...0 .... .... = Nonce: Not set

 

     .... 0... .... = Congestion Window Reduced (CWR): Not set

 

     .... .0.. .... = ECN-Echo: Not set

 

     .... ..0. .... = Urgent: Not set                          

 

     .... ...1 .... = Acknowledgment: Not set       #確認編號已設置

 

     .... .... 0... = Push: Not set                

 

     .... .... .0.. = Reset: Not set

 

     .... .... ..0. = Syn: Set                    #請求位

 

     .... .... ...1= Fin: Not set                     #FIN標志位

 

Expert Info (Chat/Sequence): Connection finish (FIN)    #專家信息

 

      Connection finish (FIN)

 

      Severity level: Chat

 

      Group: Sequence

 

Window size value: 64240               #窗口大小

 

Calculated window size: 64240                   #估計的窗口大小

 

Window size scaling factor: -1 (unknown)   #窗口大小縮放比例因素

 

Checksum: 0xadbe [validation disabled]        #校驗和

 

   Good Checksum: False                 

 

   Bad Checksum: False

 

Urgent pointer: 0

 

通過以上信息的描述,可以看出該包是服務器向客戶端發送的FIN和ACK包。其中FIN和ACK標志位為1.

 

我們將上面的信息,對應到TCP首部格式的每個字段,如下:

 

第三次斷開TCP首部格式

 

 

4.第四次斷開

 

TCP第四次斷開連接的數據包,如下

 

 

在該界面顯示了TCP第四次斷開,數據包的詳細信息,我們具體來看下TCP部分

 

Source Port: 56678(56678)                  #源端口號

 

Destination Port: 6000(6000)                  #目標端口號

 

Stream index: 0                          #流節點號

 

TCP Segment Len: 0                        #分段長度

 

Sequence number: 2   (relative sequence number)      #序列號

 

Acknowledgment number: 1    (relative ack number)         #確認編號

 

Header Length: 20 bytes                       #首部長度

 

.... 0000 0001 0000 = Flags: 0x010 (ACK)    #標志位,此處為(ACK)

 

     000. .... .... = Reserved: Not set

 

     ...0 .... .... = Nonce: Not set

 

     .... 0... .... = Congestion Window Reduced (CWR): Not set

 

     .... .0.. .... = ECN-Echo: Not set

 

     .... ..0. .... = Urgent: Not set                          

 

     .... ...1 .... = Acknowledgment: Not set       #確認編號已設置

 

     .... .... 0... = Push: Not set                

 

     .... .... .0.. = Reset: Not set

 

     .... .... ..0. = Syn: Set                    #請求位

 

     .... .... ...1 = Fin: Not set                               #FIN標志位

 

Window size value: 64240               #窗口大小

 

Calculated window size: 64240                   #估計的窗口大小

 

Window size scaling factor: -1 (unknown)      #窗口大小縮放比例因素

 

Checksum: 0x16cb [validation disabled]        #校驗和

 

    Good Checksum: False                 

 

    Bad Checksum: False

 

Urgent pointer: 0

 

SEQ/ACK analysis

 

    This is an ACK to the segment in frame: 3

 

    The RTT to ACK the segment was: 0.000040000 seconds

 

通過以上信息的描述,可以看到客戶端向服務器發送ACK的包。其中,ACK標志位都為1.

 

我們將上面的信息,對應到TCP首部格式的每個字段,如下:

 

第四次斷開TCP首部格式

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM