3.1 网络安全实验三 wireshark抓包分析

一、实验原理

TCP:(TCP是面向连接的通信协议,通过三次握手建立连接,通讯完成时要拆除连接,由于TCP是面向连接的,所以只能用于点对点的通讯)源IP地址:发送包的IP地址;目的IP地址:接收包的IP地址;源端口:源系统上的连接的端口;目的端口:目的系统上的连接的端口。

TCP是因特网中的传输层协议,使用三次握手协议建立连接。当主动方发出SYN连接请求后,等待对方回答SYN,ACK。这种建立连接的方法可以防止产生错误的连接,TCP使用的流量控制协议是可变大小的滑动窗口协议。

1、三次握手

第一次握手:建立连接时,客户端发送SYN包(SEQ=x)到服务器,并进入SYN_SEND状态,等待服务器确认。
第二次握手:服务器收到SYN包,必须确认客户的SYN(ACK=x+1),同时自己也送一个SYN包(SEQ=y),即SYN+ACK包,此时服务器进入SYN_RECV状态。
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ACK=y+1),此包发送完毕,客户端和服务器进入Established状态,完成三次握手。

2、四次挥手

TCP 是全双工通信(两端可以同时收发数据),因此关闭连接不能像打电话一样 “一句话挂断”,需要分别关闭两个方向的数据流,这就是四次挥手的由来。

  • A 当前发送序列号:seq = u
  • B 当前发送序列号:seq = v

第一次挥手:A → B 【主动方发 FIN,请求关闭己方发送通道】

  • 报文[FIN, ACK]seq = u
  • 含义:A 告诉 B:我这边不再发数据了,准备关闭连接

第二次挥手:B → A 【被动方回 ACK,确认收到关闭请求】

  • 报文[ACK]seq = vack = u + 1
  • 含义:B 收到了 A 的关闭请求,我知道你不发数据了

这一步只是确认关闭请求,B 可能还有数据要发给 A,所以不会立刻发 FIN。

第三次挥手:B → A 【被动方发 FIN,请求关闭己方发送通道】

当 B 把所有剩余数据全部发送完毕后,正式发起关闭:

  • 报文[FIN, ACK]seq = vack = u + 1
  • 含义:B 告诉 A:我这边数据也发完了,我也要关闭连接

第四次挥手:A → B 【主动方回 ACK,最终确认关闭】

  • 报文[ACK]seq = u + 1ack = v + 1
  • 含义:A 收到 B 的关闭请求,连接彻底可以关闭

二、实验过程

打开wireshark,选择网卡启动:

三次握手的序列号

TCP 协议规定,每个连接的初始序号(ISN,Initial Sequence Number)必须是随机生成的 32 位无符号整数(范围 0~4294967295),目的是防止被预测序号的攻击。

比如真实场景中,客户端的初始序号可能是 35214789,服务器的初始序号可能是 98765432,但 Wireshark 为了让你一眼看懂三次握手的序号逻辑,做了两件事:

  1. 每个连接的第一个 SYN 包的初始序号,映射为相对序号 0
  2. 后续所有包的序号 / 确认号,都基于这个 “0 基准” 做偏移计算
阶段 抓包显示(相对序号) 真实序号(Wireshark 隐藏的部分) 逻辑说明
第一次握手(客户端→服务器) [SYN] seq=0 seq=ISN_c(比如35214789 客户端发送 SYN,初始序号为随机值ISN_c,Wireshark 显示为0
第二次握手(服务器→客户端) [SYN, ACK] seq=0 ack=1 seq=ISN_s(比如98765432

ack=ISN_c + 1(比如35214790
服务器的初始序号ISN_s显示为0,确认号是客户端 ISN+1,显示为1
第三次握手(客户端→服务器) [ACK] seq=1 ack=1 seq=ISN_c + 1(比如35214790

ack=ISN_s + 1(比如98765433
客户端的序号是自己的 ISN+1,显示为1;确认号是服务器 ISN+1,显示为1

简单说:抓包里的0/1,只是真实序号相对于初始值的偏移量,不是真实的序号本身

TCP抓包实操

1、三次握手

设置筛选条件:

ip.addr == 192.168.150.10 && tcp # 替换为自己的IP
Pasted image 20260527133558

可以在 Wireshark 里关闭相对序号:

  1. 打开 Wireshark → 点击顶部菜单栏「编辑」→「首选项」
  2. 在左侧列表找到「协议」→ 展开后选择「TCP」
  3. 取消勾选 “Relative sequence numbers”(相对序列号)
  4. 重新加载你的抓包,就能看到真实的随机序号了(比如seq=35214789这种大数字)
Pasted image 20260527135946 Pasted image 20260527140251

2、四次挥手

标准四次挥手 分步详解(报文 + 序号 + 状态)

Pasted image 20260527203622
1. 第一次挥手(主动方发 FIN)
  • 报文 1:192.168.150.10 → 120.253.244.226 [FIN, ACK]
  • 含义:客户端主动发起关闭请求,seq=76280999,FIN 消耗 1 个序号,下一次发送序号应为76281000
2. 第二次挥手(被动方回 ACK)
  • 报文 2:120.253.244.226 → 192.168.150.10 [ACK]
  • 含义:服务器确认收到 FIN,ack=76280999 + 1,完全符合规则。此时服务器还未发送 FIN,处于CLOSE_WAIT状态。
3. 第三次挥手(被动方发 FIN)
  • 报文 3:120.253.244.226 → 192.168.150.10 [FIN, PSH, ACK]
  • 含义:服务器发送完剩余数据后,发起关闭请求。这里带了PSH标志,说明报文里还携带了少量待发送数据(业务上的收尾数据),这是完全正常的,不影响挥手流程。
  • 关键:seq=1710316648,ack=76280999 + 1,符合规则,FIN 消耗 1 个序号,下一次发送序号应为1710316649
4. 第四次挥手(主动方回 ACK)
  • 报文 4:192.168.150.10 → 120.253.244.226 [ACK]
  • 含义:客户端确认收到服务器的 FIN,ack=1710316648 + 1,同时客户端的 seq=76280999 + 1(和第一次挥手的 FIN 序号 + 1 对应),完全符合规则。

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 kipleyarch@gmail.com
Archive PDF预览 PPTX Obsidian