【愚公系列】2022年02月 wireshark系列-数据抓包分析之TCP协议02

举报
愚公搬代码 发表于 2022/02/28 21:45:45 2022/02/28
【摘要】 一、数据抓包分析之TCP协议02任务描述:通过实验一,我们已经获取了数据包,并且进行了分类保存,实验二将对TCP的三次握手进行详细分析1.TCP首部在分析TCP数据包之前,先介绍一下TCP首部格式,如下TCP首部格式在上面的表中,TCP首部的各字段含义如下所示:源端口:用来传输数据包的端口。目标端口:数据包将要被发送到的端口。序号:该数字用来表示一个TCP片段。这个域用来保证数据流中的部分...

一、数据抓包分析之TCP协议02

任务描述:通过实验一,我们已经获取了数据包,并且进行了分类保存,实验二将对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首部在这里插入图片描述

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。