深入理解TCP以及三次握手与四次挥手
一、核心概念和分类
TCP(传输控制协议,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,属于 OSI模型的第四层(传输层) 和 TCP/IP模型的传输层。以下是其核心概念和分类的详细说明:
1. 所属分类
1.1 网络模型中的位置
- OSI模型:TCP属于第四层(传输层),负责在端到端之间提供可靠的数据传输服务。
- TCP/IP模型:TCP位于传输层,与IP协议(网络层)共同构成TCP/IP协议栈的核心。
1.2 协议类型
- 传输层协议:TCP是传输层的典型代表协议,与UDP(用户数据报协议)并列,但两者特性截然不同:
- TCP:面向连接、可靠、有序、流量控制。
- UDP:无连接、不可靠、无序、低开销。
2. 核心概念
2.1 面向连接
- 连接建立:通过 三次握手(Three-Way Handshake)建立连接,确保双方具备通信能力。
- 连接终止:通过 四次挥手(Four-Way Handshake)安全关闭连接,避免数据丢失。
2.2 可靠性
- 确认机制(ACK):接收方对每个数据包发送确认(ACK),发送方未收到ACK时会重传。
- 校验和:检测数据传输中的错误。
- 序列号与确认号:确保数据按顺序到达,并避免重复或丢失。
2.3 基于字节流
- 非结构化数据:TCP将数据视为连续的字节流(无消息边界),由应用层定义数据格式。
- 数据分段:根据网络条件(如MTU)将数据分割成适当大小的报文段(Segment)。
2.4 流量控制
- 滑动窗口机制:动态调整发送窗口大小,避免接收方缓冲区溢出。
- 接收方反馈:通过窗口字段告知发送方当前可接收的数据量。
2.5 拥塞控制
- 慢启动(Slow Start):初始阶段以指数增长速率发送数据。
- 拥塞避免(Congestion Avoidance):进入稳定状态后线性增长速率。
- 快速重传与恢复:检测到丢包时快速调整发送速率,减少网络拥塞。
3. 关键特性
特性 | 描述 |
---|---|
可靠性 | 通过确认机制、重传机制和校验和确保数据完整性和正确性。 |
有序性 | 序列号确保数据按发送顺序重组,避免乱序。 |
全双工通信 | 双方可同时发送和接收数据(如HTTP/1.1的请求与响应)。 |
连接管理 | 三次握手建立连接,四次挥手终止连接,保证连接的稳定性。 |
适应性 | 动态调整传输速率(流量控制、拥塞控制),适应不同网络环境。 |
4. 与其他协议的对比
协议 | 特性 | 适用场景 |
---|---|---|
TCP | 面向连接、可靠、有序、高开销 | 需要可靠传输的场景(如HTTP、FTP、电子邮件)。 |
UDP | 无连接、不可靠、无序、低开销 | 实时性要求高的场景(如视频流、在线游戏)。 |
5. 典型应用场景
- Web浏览(HTTP/HTTPS):确保网页内容完整加载。
- 文件传输(FTP):保障文件无损传输。
- 电子邮件(SMTP/POP/IMAP):可靠传递邮件数据。
- 远程登录(SSH):安全、可靠的终端连接。
6. 标准与规范
- 定义标准:由 IETF RFC 793 首次定义,后续通过 RFC 9293 等文档更新。
- 标准化组织:国际互联网工程任务组(IETF)负责维护和改进TCP协议。
TCP 协议通过 三次握手 建立连接,通过 四次挥手 终止连接。以下是完整过程、标志位含义及常见问题解析。
二、三次握手(建立连接)
1. 过程详解
第一次握手:
- 客户端 → 服务器:
SYN=1, Seq=x
- SYN(Synchronize,同步):请求建立连接。
- Seq=x:客户端随机生成初始序列号(Sequence Number),用于标识数据流的起点。
第二次握手:
- 服务器 → 客户端:
SYN=1, ACK=1, Seq=y, Ack=x+1
- SYN=1:服务器同步自己的初始序列号
Seq=y
。 - ACK=1(Acknowledgment,确认):确认号(Acknowledgment Number)有效,表示服务器已收到客户端的
Seq=x
,并期望下次收到x+1
的数据。 - Ack=x+1:对客户端的确认号,确保双方序列号同步。
- SYN=1:服务器同步自己的初始序列号
第三次握手:
- 客户端 → 服务器:
ACK=1, Ack=y+1
- ACK=1:客户端确认服务器的
Seq=y
,期望下次收到y+1
的数据。 - 连接建立完成:双方同步序列号,具备收发能力,进入
ESTABLISHED
状态。
- ACK=1:客户端确认服务器的
2. 核心目的
- 防止历史连接干扰:通过同步序列号和三次确认,避免旧请求的SYN报文被误认为新连接。
- 验证收发能力:确保双方均能发送和接收数据。
三、四次挥手(终止连接)
1. 过程详解
第一次挥手:
- 客户端 → 服务器:
FIN=1, Seq=u
- FIN=1(Finish,结束):客户端声明“已无数据发送”,请求关闭连接。
- Seq=u:客户端当前发送的数据序列号。
第二次挥手:
- 服务器 → 客户端:
ACK=1, Ack=u+1
- ACK=1:服务器确认收到客户端的
FIN
,并期望下次收到u+1
的数据。 - 服务器进入 CLOSE_WAIT 状态:等待处理剩余数据。
- ACK=1:服务器确认收到客户端的
第三次挥手:
- 服务器 → 客户端:
FIN=1, Seq=v
- FIN=1:服务器声明“已无数据发送”,请求关闭连接。
- Seq=v:服务器当前发送的数据序列号。
第四次挥手:
- 客户端 → 服务器:
ACK=1, Ack=v+1
- ACK=1:客户端确认收到服务器的
FIN
,连接完全关闭。 - 客户端进入 TIME_WAIT 状态:等待 2MSL(最大报文段生存时间),确保最后一个 ACK 到达服务器。
- ACK=1:客户端确认收到服务器的
2. 核心目的
- 全双工独立关闭:每个方向需独立关闭,确保双方数据传输完成。
- 防止数据丢失:通过四次确认,避免因未处理完数据而强制关闭连接。
四、TCP 标志位详解
缩写 | 全称 | 中文含义 | 作用 |
---|---|---|---|
SYN | Synchronize | 同步 | 建立连接时同步序列号(三次握手) |
FIN | Finish | 结束 | 请求关闭连接(四次挥手) |
ACK | Acknowledgment | 确认 | 确认收到数据或响应(握手/挥手) |
RST | Reset | 复位 | 强制终止异常连接(如端口未监听) |
PSH | Push | 推送 | 提示接收方立即交付数据(如交互式应用) |
URG | Urgent | 紧急 | 标记紧急数据需优先处理 |
标志位在 TCP 报文段中的位置
TCP 报文段头部包含 20 字节固定字段,其中 Flags 字段 为 6 位,顺序为:
URG | ACK | PSH | RST | SYN | FIN
。
五、常见问题与扩展
1. 为什么三次握手?
- 防止资源浪费:若仅两次握手,服务器收到SYN后分配资源,但客户端可能未响应ACK,导致资源浪费。
- 同步序列号:三次握手确保双方序列号同步,避免历史报文干扰。
2. 为什么四次挥手?
- 全双工关闭:客户端和服务器需独立关闭发送通道,四次挥手确保双方确认无数据残留。
- 避免数据丢失:若合并挥手步骤,服务器可能在未处理完数据时被强制关闭。
3. TIME_WAIT 状态的作用
- 确保最后一个 ACK 到达:客户端等待 2MSL,防止服务器未收到 ACK 而重传 FIN。
- 避免旧连接报文干扰:等待足够时间让旧报文段失效,防止新连接误用旧数据。
4. 如何解决 TIME_WAIT 过多?
- 端口复用:设置
net.ipv4.tcp_tw_reuse=1
(Linux)。 - 缩短超时时间:调整
net.ipv4.tcp_fin_timeout
(默认60秒)。
5. CLOSE_WAIT 状态堆积的原因
- 应用程序未调用 close():检查代码是否正确关闭连接。
- 防火墙拦截 FIN 报文:排查网络设备是否丢弃 FIN。
6. RST 的典型场景
- 异常终止:服务器端口未监听或数据错误时,发送
RST=1
强制关闭连接。 - 数据错误:接收方检测到非法序列号或数据时,发送
RST=1
。
六、TCP 报文段结构简图
0 1 2 30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Source Port | Destination Port |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Sequence Number |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Acknowledgment Number |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Data | |U|A|P|R|S|F| || Offset| Reserved |R|C|S|S|Y|I| Window || | |G|K|H|T|N|N| |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Checksum | Urgent Pointer |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Options | Padding |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| data |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
七、总结
- 三次握手:建立连接,通过SYN和ACK同步序列号,确保双方具备通信能力。
- 四次挥手:终止连接,通过FIN和ACK独立关闭全双工通道,保证数据完整性。
- 标志位作用:SYN/FIN控制连接状态,ACK确认数据,RST/PSH/URG处理异常或紧急数据。
- 核心原则:TCP 通过严格的确认机制和状态转换,保障通信的稳定性和数据完整性。