tcp/ip学习之13: tcp协议之四次挥手

一. TCP 协议的四次挥手

image

image

二. 抓包分析

image

从抓包数据上来看, 只发现了三次挥手(可能与我这边实现的代码有关,后期排查下原因)

第一次挥手

0000 02 00 00 30 00 4a 00 e0 4c 68 03 8d 08 00 45 00
0010 00 28 f2 9f 40 00 80 06 00 00 c0 a8 01 68 c0 a8
0020 01 02 dd b0 13 89 53 e5 15 41 00 00 19 c0 50 11
0030 ff ba 83 d5 00 00

这段数据是一个以太网帧的十六进制表示,包含了TCP协议的第一次挥手(FIN报文)。我们可以逐步解析这个数据包,以了解其各个字段的含义。

以太网帧结构

以太网帧的结构如下:

  • 目的MAC地址(6字节)
  • 源MAC地址(6字节)
  • 类型字段(2字节)
  • 数据(可变长度)
  • 帧校验序列(FCS,4字节,可选)

数据解析

1. 目的MAC地址和源MAC地址

  • 目的MAC地址02 00 00 30 00 4a
  • 源MAC地址00 e0 4c 68 03 8d

2. 类型字段

  • 类型字段08 00,表示这是一个IPv4数据包。

3. IPv4报头

IPv4报头的格式如下:

  • 版本(4位):4
  • 首部长度(4位):5(表示20字节的IP报头)
  • 服务类型(8位)00
  • 总长度(16位)00 28(十进制40字节)
  • 标识(16位)f2 9f
  • 标志和片偏移(16位)40 00(标志位为4,表示不分片)
  • 生存时间(TTL,8位)80(十进制128)
  • 协议(8位)06(表示TCP)
  • 头部校验和(16位)00 00(校验和由发送方计算,接收方验证)
  • 源IP地址(32位)c0 a8 01 68(十进制192.168.1.104)
  • 目的IP地址(32位)c0 a8 01 02(十进制192.168.1.2)

4. TCP报头

TCP报头的格式如下:

  • 源端口(16位)dd b0(十进制56784)
  • 目的端口(16位)13 89(十进制5001)
  • 序列号(32位)53 e5 15 41(十进制1406062081)
  • 确认号(32位)00 00 19 c0(十进制6624,这是对之前报文的确认号)
  • 数据偏移(4位)50(十进制80,表示20字节的TCP报头)
  • 保留(6位)00
  • 标志位(6位)11(二进制000101,表示FIN和ACK标志位为1)
  • 窗口大小(16位)ff ba(十进制65466)
  • 校验和(16位)83 d5(校验和由发送方计算,接收方验证)
  • 紧急指针(16位)00 00(十进制0,表示没有紧急数据)

总结

这是一个TCP FIN报文,用于发起关闭连接的请求。以下是关键信息:

  • 目的MAC地址02:00:00:30:00:4a
  • 源MAC地址00:e0:4c:68:03:8d
  • 源IP地址192.168.1.104
  • 目的IP地址192.168.1.2
  • 源端口56784
  • 目的端口5001
  • 序列号1406062081
  • 确认号6624(对之前报文的确认号)
  • 标志位FINACK
  • 窗口大小65466

解释

  • FIN标志位:表示发送方(客户端)已经没有数据要发送,请求关闭连接。
  • ACK标志位:表示对之前接收到的报文的确认。
  • 确认号6624,这是对之前报文的确认号,表示接收方已经正确接收了序列号为6624 - 1 = 6623之前的所有数据。

这个报文是客户端向服务器发送的FIN报文,表示客户端希望关闭TCP连接。

第二次挥手

0000 00 e0 4c 68 03 8d 02 00 00 30 00 4a 08 00 45 00
0010 00 40 00 06 00 00 ff 06 37 f7 c0 a8 01 02 c0 a8
0020 01 68 13 89 dd b0 00 00 19 c0 53 e5 15 42 50 19
0030 0b 67 33 3e 00 00 54 43 50 20 63 6c 69 65 6e 74
0040 20 64 69 73 63 6f 6e 6e 65 63 74 65 64 0a

这段数据是一个以太网帧的十六进制表示,包含了TCP协议的第二次挥手(ACK报文)。我们可以逐步解析这个数据包,以了解其各个字段的含义。

以太网帧结构

以太网帧的结构如下:

  • 目的MAC地址(6字节)
  • 源MAC地址(6字节)
  • 类型字段(2字节)
  • 数据(可变长度)
  • 帧校验序列(FCS,4字节,可选)

数据解析

1. 目的MAC地址和源MAC地址

  • 目的MAC地址02 00 00 30 00 4a
  • 源MAC地址00 e0 4c 68 03 8d

2. 类型字段

  • 类型字段08 00,表示这是一个IPv4数据包。

3. IPv4报头

IPv4报头的格式如下:

  • 版本(4位):4
  • 首部长度(4位):5(表示20字节的IP报头)
  • 服务类型(8位)00
  • 总长度(16位)00 40(十进制64字节)
  • 标识(16位)00 06
  • 标志和片偏移(16位)00 00(标志位为0,表示不分片)
  • 生存时间(TTL,8位)ff(十进制255)
  • 协议(8位)06(表示TCP)
  • 头部校验和(16位)37 f7(校验和由发送方计算,接收方验证)
  • 源IP地址(32位)c0 a8 01 02(十进制192.168.1.2)
  • 目的IP地址(32位)c0 a8 01 68(十进制192.168.1.104)

4. TCP报头

TCP报头的格式如下:

  • 源端口(16位)13 89(十进制5001)
  • 目的端口(16位)dd b0(十进制56784)
  • 序列号(32位)00 00 19 c0(十进制6624)
  • 确认号(32位)53 e5 15 42(十进制1406062082,这是对第一次挥手报文序列号的确认)
  • 数据偏移(4位)50(十进制80,表示20字节的TCP报头)
  • 保留(6位)00
  • 标志位(6位)10(二进制000100,表示ACK标志位为1)
  • 窗口大小(16位)0b 67(十进制2919)
  • 校验和(16位)33 3e(校验和由发送方计算,接收方验证)
  • 紧急指针(16位)00 00(十进制0,表示没有紧急数据)

5. 数据部分

TCP数据部分如下:

  • 数据内容54 43 50 20 63 6c 69 65 6e 74 20 64 69 73 63 6f 6e 6e 65 63 74 65 64 0a
  • ASCII表示TCP client disconnected.

总结

这是一个TCP ACK报文,用于响应第一次挥手(FIN报文)。以下是关键信息:

  • 目的MAC地址02:00:00:30:00:4a
  • 源MAC地址00:e0:4c:68:03:8d
  • 源IP地址192.168.1.2
  • 目的IP地址192.168.1.104
  • 源端口5001
  • 目的端口56784
  • 序列号6624
  • 确认号1406062082(对第一次挥手报文序列号的确认)
  • 标志位ACK
  • 窗口大小2919
  • 数据内容TCP client disconnected.

解释

  • ACK标志位:表示对之前接收到的FIN报文的确认。
  • 确认号1406062082,这是对第一次挥手报文序列号的确认,表示接收方已经正确接收了序列号为1406062081的FIN报文。
  • 数据内容TCP client disconnected.,这是一条应用层消息,表明客户端已经断开连接。

这个报文是服务器对客户端发送的FIN报文的响应,表示服务器已经收到并确认了客户端的关闭连接请求。

第三次挥手

0000 02 00 00 30 00 4a 00 e0 4c 68 03 8d 08 00 45 00
0010 00 28 f2 a0 40 00 80 06 00 00 c0 a8 01 68 c0 a8
0020 01 02 dd b0 13 89 53 e5 15 42 00 00 19 d8 50 14
0030 00 00 83 d5 00 00

这段数据是一个以太网帧的十六进制表示,包含了TCP协议的第三次挥手(FIN报文)。我们可以逐步解析这个数据包,以了解其各个字段的含义。

以太网帧结构

以太网帧的结构如下:

  • 目的MAC地址(6字节)
  • 源MAC地址(6字节)
  • 类型字段(2字节)
  • 数据(可变长度)
  • 帧校验序列(FCS,4字节,可选)

数据解析

1. 目的MAC地址和源MAC地址

  • 目的MAC地址02 00 00 30 00 4a
  • 源MAC地址00 e0 4c 68 03 8d

2. 类型字段

  • 类型字段08 00,表示这是一个IPv4数据包。

3. IPv4报头

IPv4报头的格式如下:

  • 版本(4位):4
  • 首部长度(4位):5(表示20字节的IP报头)
  • 服务类型(8位)00
  • 总长度(16位)00 28(十进制40字节)
  • 标识(16位)f2 a0
  • 标志和片偏移(16位)40 00(标志位为4,表示不分片)
  • 生存时间(TTL,8位)80(十进制128)
  • 协议(8位)06(表示TCP)
  • 头部校验和(16位)00 00(校验和由发送方计算,接收方验证)
  • 源IP地址(32位)c0 a8 01 68(十进制192.168.1.104)
  • 目的IP地址(32位)c0 a8 01 02(十进制192.168.1.2)

4. TCP报头

TCP报头的格式如下:

  • 源端口(16位)dd b0(十进制56784)
  • 目的端口(16位)13 89(十进制5001)
  • 序列号(32位)53 e5 15 42(十进制1406062082)
  • 确认号(32位)00 00 19 d8(十进制6648,这是对之前报文的确认号)
  • 数据偏移(4位)50(十进制80,表示20字节的TCP报头)
  • 保留(6位)00
  • 标志位(6位)14(二进制000101,表示FIN和ACK标志位为1)
  • 窗口大小(16位)00 00(十进制0)
  • 校验和(16位)83 d5(校验和由发送方计算,接收方验证)
  • 紧急指针(16位)00 00(十进制0,表示没有紧急数据)

总结

这是一个TCP FIN报文,用于发起关闭连接的请求。以下是关键信息:

  • 目的MAC地址02:00:00:30:00:4a
  • 源MAC地址00:e0:4c:68:03:8d
  • 源IP地址192.168.1.104
  • 目的IP地址192.168.1.2
  • 源端口56784
  • 目的端口5001
  • 序列号1406062082
  • 确认号6648(对之前报文的确认号)
  • 标志位FINACK
  • 窗口大小0

解释

  • FIN标志位:表示发送方(客户端)已经没有数据要发送,请求关闭连接。
  • ACK标志位:表示对之前接收到的报文的确认。
  • 确认号6648,这是对之前报文的确认号,表示接收方已经正确接收了序列号为6647之前的所有数据。
  • 窗口大小0,表示发送方希望关闭连接。

这个报文是客户端向服务器发送的FIN报文,表示客户端希望关闭TCP连接。

第四次挥手(略)

待排查,按道理应该回复个确认帧。

posted @ 2025-07-28 11:30  cupid8505  阅读(18)  评论(0)    收藏  举报