Wireshark数据抓包分析之传输层协议(TCP协议)

时间:2024-04-16 22:02:38

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首部格式