一、实验原理
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 = v,ack = u + 1 - 含义:B 收到了 A 的关闭请求,我知道你不发数据了。
这一步只是确认关闭请求,B 可能还有数据要发给 A,所以不会立刻发 FIN。
第三次挥手:B → A 【被动方发 FIN,请求关闭己方发送通道】
当 B 把所有剩余数据全部发送完毕后,正式发起关闭:
- 报文:
[FIN, ACK],seq = v,ack = u + 1 - 含义:B 告诉 A:我这边数据也发完了,我也要关闭连接。
第四次挥手:A → B 【主动方回 ACK,最终确认关闭】
- 报文:
[ACK],seq = u + 1,ack = v + 1 - 含义:A 收到 B 的关闭请求,连接彻底可以关闭。
二、实验过程
打开wireshark,选择网卡启动:
三次握手的序列号
TCP 协议规定,每个连接的初始序号(ISN,Initial Sequence Number)必须是随机生成的 32 位无符号整数(范围 0~4294967295),目的是防止被预测序号的攻击。
比如真实场景中,客户端的初始序号可能是 35214789,服务器的初始序号可能是 98765432,但 Wireshark 为了让你一眼看懂三次握手的序号逻辑,做了两件事:
- 把每个连接的第一个 SYN 包的初始序号,映射为相对序号
0 - 后续所有包的序号 / 确认号,都基于这个 “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
可以在 Wireshark 里关闭相对序号:
- 打开 Wireshark → 点击顶部菜单栏「编辑」→「首选项」
- 在左侧列表找到「协议」→ 展开后选择「TCP」
- 取消勾选 “Relative sequence numbers”(相对序列号)
- 重新加载你的抓包,就能看到真实的随机序号了(比如
seq=35214789这种大数字)
2、四次挥手
标准四次挥手 分步详解(报文 + 序号 + 状态)
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