TCP协议概述:
TCP(传输控制协议)是一种面向连接的、可靠的传输层协议,主要用于在不可靠的网络环境中确保数据准确无误地传输。
可靠性保障
通过确认应答(ACK)、超时重传、序列号机制确保数据包按序到达,丢失或损坏的数据会自动重传。
流量控制
基于滑动窗口机制动态调整发送速率,避免接收方缓冲区溢出,实现高效数据传输。
拥塞控制
通过慢启动、拥塞避免等算法监测网络状态,主动降低传输速率以防止网络过载。
连接管理
采用三次握手建立连接和四次挥手释放连接,保证通信双方状态同步,避免资源浪费。
TCP协议核心机制
- 三次握手与四次挥手:建立与终止连接的详细流程
- 滑动窗口机制:流量控制与拥塞避免
- 重传机制:超时重传与快速重传
- 确认应答(ACK)与序列号(SEQ)的作用
TCP三次握手四次挥手

2. 为什么不是两次?
python
问题:历史连接导致的混乱
# 场景:旧连接延迟到达
1. Client发送SYN(x)建立连接
2. 建立成功后正常通信
3. 连接关闭
4. 旧的SYN(x)延迟到达Server
5. Server以为是新连接,回复SYN-ACK(y, ack=x+1)
# 如果只有两次握手:
Client收到SYN-ACK后,发现:
- 这不是我当前要建立的连接
- 但Server已经认为连接建立了
- 造成Server资源浪费(半开连接)
================================
3. 为什么不是四次?
python
# 三次已经足够:
1. C→S: 我的序列号是x
2. S→C: 我收到了x,我的序列号是y
3. C→S: 我收到了y
# 第四次S→C: "我知道你收到了y"
# 这个确认可以在第一个数据包中捎带
# 不需要单独握手包
**二、为什么是四次挥手?**
**1. 四次挥手的必要性**

python
2. 为什么不是三次?
问题:数据未发送完就被关闭
# 假设三次挥手:FIN → ACK+FIN → ACK
# 场景:
1. Client发送FIN:"我没有数据要发了"
2. Server立刻回复ACK+FIN:"好的,我也没有数据要发了"
3. Client回复ACK,连接关闭
# 但实际:
Server可能还有数据要发送!
那些数据会被丢弃,因为连接已关闭
TCP的半关闭状态
# TCP连接是全双工的,有两个独立通道:
发送通道A: Client → Server
发送通道B: Server → Client
# 四次挥手过程:
1. Client关闭A通道 (FIN)
2. Server确认A关闭 (ACK)
→ 此时B通道仍开放,Server还能发数据
3. Server发完数据后关闭B通道 (FIN)
4. Client确认B关闭 (ACK)
# 这就是为什么需要四次:分别关闭两个方向
| 特性 | 三次握手 | 四次挥手 |
|---|---|---|
| 目的 | 建立连接 | 关闭连接 |
| 确保 | 双方序列号同步 | 双向数据发送完毕 |
| 最少次数 | 3次(理论最少) | 4次(理论最少) |
| 可优化 | TFO(携带数据) | 延迟ACK(合并ACK) |
三次握手保证连接建立的可靠性和序列号同步,四次挥手保证双向数据传输完整后才安全关闭!
三次握手四次挥手的漏洞利用
1.SYN FLOOD
核心原理:服务器在收到第一次握手信息之后(收到SYN请求包),返回SYN-ACK包,发起第二次握手,但是客户端(攻击者)不回应服务器发来的SYN包(不发送第三次握手的ACK包),导致服务器傻等,在等待超时之后放弃会话,利用这一漏洞发送大量SYN包,导致目标服务器半连接队列满,正常请求排不上队
就像:你给人家发"在吗",人家回复你之后,你又不发消息了
python
# 服务器收到SYN后的行为:
1. 分配传输控制块(TCB)存储连接信息
2. 将连接放入半连接队列(SYN队列)
3. 启动定时器等待ACK(通常30秒-2分钟)
4. 如果超时未收到ACK,清理资源
# 攻击者利用点:
- 半连接队列大小有限(默认1024)
- 每个半连接占用约280字节内存
- 超时时间长(给了攻击者机会)
补充知识:
python
1. 为什么伪造源IP?
- 避免防火墙基于IP的限速
- 增加溯源难度
- 使服务器回复的SYN-ACK发往不存在的IP
2. 攻击变种:LAND攻击
-发送源IP=目标IP的SYN包
-导致服务器向自己发送SYN-ACK
-形成自循环,消耗更多资源
3. 现代防护:SYN Cookie
-服务器不立即分配资源
-而是将连接信息编码到SYN-ACK的序列号中
-只在收到有效ACK后才分配资源
2.连接耗尽攻击
核心原理:在执行完三次握手后,服务器给你发了整套资源,导致服务器资源被浪费
就像:你发"在吗"
对方:"在,什么事"
你:"那我们开始聊天吧"
然后他发什么你都敷衍的回复,消耗他的资源
python
# 攻击者建立并保持连接的代价:
1. 内存消耗:很小(每个连接约几十KB)
2. CPU消耗:很低(只需维持心跳)
3. 带宽消耗:几乎为零(保持连接几乎不传数据)
4. 连接数限制:可能有(但可伪造IP绕过)
python
# 服务器维持连接的代价:
1. 内存消耗:很大(每个连接数百KB到MB)
- TCP控制块(TCB)
- 应用层会话信息
- 缓冲区内存
2. 连接表限制:硬性限制
- Linux:net.ipv4.ip_conntrack_max(默认65536)
- Windows:MaxUserPort(默认16384)
- 数据库:max_connections(几百到几千)
3. 处理开销:
- 每个包要查连接表
- 超时检测和心跳处理
- 日志记录和监控
现代防御手段:
| 防御层级 | 核心措施 | 主要对抗的攻击类型 |
|---|---|---|
| 1. 网络层 | 分布式流量清洗(云清洗中心/高防IP/Anycast网络) | SYN Flood、UDP Flood等大流量DDoS |
| 2. 系统层 | 调整内核参数、启用SYN Cookie | SYN Flood、连接耗尽攻击 |
| 3. 应用层 | Web应用防火墙(WAF)、智能人机识别、API保护 | CC攻击、应用层漏洞利用 |
| 4. 架构与运维 | 弹性扩展与降级、代码与业务优化、边缘节点集成 | CC攻击、资源耗尽攻击 |
下一篇文章我们来探讨一些攻击方式和绕过防御
一、 法律与合规性声明
-
严格遵守法律
本文及所有相关技术讨论内容(包括但不限于TCP/IP协议分析、SYN Flood/CC攻击原理、防御技术)仅限用于合法的安全研究、教学与防御体系建设目的 。严禁在任何未经明确、书面授权的网络、系统或设备上进行任何形式的攻击、渗透、漏洞验证或干扰测试。
-
适用法律
所有行为必须遵守《中华人民共和国网络安全法》、《中华人民共和国数据安全法》、《中华人民共和国个人信息保护法》以及《中华人民共和国刑法》中关于非法侵入计算机信息系统罪(第285条)、破坏计算机信息系统罪(第286条)等相关规定。任何未经授权的网络攻击行为均属违法,将面临严厉的法律制裁。
-
技术讨论边界
讨论所涉及的技术细节、工具名称和代码示例,仅为解释技术原理、促进安全认知和提升防御能力。绝不能被解读为对任何非法活动的指导、鼓励或许可