TCP协议三次握手与四次挥手Wireshark抓包详解

4 阅读5分钟

TCP协议与wireshark抓包分析

一、tcp协议格式

1. 源端口号 :

发送方使用的端口号

2. 目的端口号 :

接收方使用的端口号

3. 序号:

数据包编号 , tcp 协议 为每个数据都设置编号,用于确认是否接收到相应的包

4. 确认序列号 :

使用 tcp 协议接收到数据包,会根据这个接收到这个数据包编号发送一个应答包,一般为上一次的数据包的编号加上长度,如果是 SYN 或者FIN ,则是上一次的数据包的编号 加1

5. 标志位: 用于标识

URG: 表示紧急指针是否有效ACK : 表示确认号是否有效。称携带ACK标志的tcp报文段位确认报文段PSH : 提示接收端应用程序应该立即从tcp接受缓冲区中读走数据,为接受后续数据腾出空间(如果应用程序不将接收的数据读走,它们就会一直停留在tcp缓冲区中)

RST: 表示要求对方重新建立连接。携带RST标志的tcp报文段为复位报文段。

SYN: 表示请求建立一个连接。携带SYN标志的tcp报文段为同步报文段。

FIN: 表示通知对方本端要关闭连接了。携带FIN标志的tcp报文段为结束报文段。

6. 窗口大小:

用于 tcp 进行流量控制,这里的窗口用于向发送端说明当前 tcp 接收缓冲区还能存储的数据大小

7. 校验和:

用于接收端用于校验接收的数据是否正确,由发送端进行填充,计算校验和主要包括 tcp 协议头与数据区校验的方式为 CRC 校验

二、tcp三次握手

  1. 设置 wireshark 使用绝对数据包编号

除了Wireshark,Sniffmaster抓包工具同样支持TCP协议抓包,且在全平台包括iOS和Android设备上无需代理即可使用,非常适合移动应用调试。

  1. 选择网卡,并设置tcp端口过滤,开启抓包

  2. 启动tcp服务器,并使用网络调试助手连接服务器

  3. 查看抓包结果

第一次握手 : 客户端给服务器发送 SYN 数据包

Flags标志设置为 SYN ,数据包编号为 2968294989

第二次握手 : 服务器给客户端发送 SYN + ACK 的数据包

Flags 标志: 设置为 SYN + ACK

数据包应答编号为 2968294990,相当是 SEQ_SYN + 1

数据包编号为 672472624

第三次握手 : 客户端给服务器发送 ACK 数据包

Flags 标志 : ACK

数据包应答编号为 672472625,是第二个数据包的编号加1

数据包编号为 2968294990

三、tcp 四次挥手

TCP(传输控制协议)的四次挥手是用于关闭一个已经建立的TCP连接的过程。它确保了数据的可靠传输,并且能够让双方安全地断开连接。以下是四次挥手的详细过程:

1. 第一次挥手(FIN):主动方发起关闭请求

  • 操作:假设客户端(A)想要关闭连接,它会发送一个带有 FIN 标志的TCP报文给服务器(B)。这个 FIN 报文表示客户端已经没有数据要发送了,但仍然可以接收来自服务器的数据。

  • 状态变化:客户端进入 FIN_WAIT_1 状态,等待服务器的响应。

2. 第二次挥手(ACK):被动方确认关闭请求

  • 操作:服务器(B)收到客户端(A)的 FIN 报文后,会发送一个带有 ACK 标志的TCP报文作为确认。这个 ACK 报文的确认号是客户端 FIN 报文序列号加1,表示服务器已经收到了客户端的关闭请求。

  • 状态变化:客户端收到 ACK 后,进入 FIN_WAIT_2 状态;服务器进入 CLOSE_WAIT 状态。此时,服务器可能还有数据要发送给客户端。

3. 第三次挥手(FIN):被动方发起关闭请求

  • 操作:当服务器(B)完成数据发送后,它会发送一个带有 FIN 标志的TCP报文给客户端(A),表示服务器也没有数据要发送了,希望关闭连接。

  • 状态变化:服务器进入 LAST_ACK 状态,等待客户端的最终确认。

4. 第四次挥手(ACK):主动方确认关闭请求

  • 操作:客户端(A)收到服务器(B)的 FIN 报文后,会发送一个带有 ACK 标志的TCP报文作为确认,确认号是服务器 FIN 报文序列号加1。此时,客户端进入 TIME_WAIT 状态,等待2个最大报文段寿命(2MSL)的时间,以确保最后一个 ACK 报文能够被服务器收到。

  • 状态变化:服务器收到客户端的 ACK 后,进入 CLOSED 状态,完成关闭过程。客户端在2MSL时间后也进入 CLOSED 状态。

为什么需要四次挥手

  • 确保数据完整传输:TCP是一个面向连接的协议,需要确保数据的可靠传输。四次挥手确保了双方都明确知道对方已经没有数据要发送,并且双方都收到了对方的关闭请求。

  • 防止资源泄露:通过四次挥手,可以优雅地关闭连接,释放系统资源,避免连接长时间占用资源。

TIME_WAIT 状态的作用

  • 确保最后一个ACK报文能够被对方收到:在第四次挥手时,客户端发送的 ACK 报文可能会丢失。服务器在等待 ACK 超时后会重新发送 FIN 报文。客户端进入 TIME_WAIT 状态后,可以重新发送 ACK,确保连接能够正确关闭。

  • 防止老的连接干扰新的连接:在2MSL时间内,网络中可能还残留着旧连接的报文。 TIME_WAIT 状态可以防止这些报文干扰新的连接。

TCP四次挥手是TCP协议中非常重要的机制,它确保了连接的可靠关闭,是TCP协议可靠性的关键体现之一。