TCP 协议详
一、TCP 协议概述
TCP(Transmission Control Protocol,传输控制协议) 是互联网传输层的核心协议之一,基于 面向连接、可靠传输、流式数据传输 的特性,为应用层提供稳定的数据传输服务。其主要特点包括:
- 可靠性:通过序列号、确认机制、重传机制确保数据无丢失、无重复。
- 面向连接:通信前需建立逻辑连接(三次握手),通信后释放连接(四次挥手)。
- 流量控制:通过滑动窗口机制调节发送方速率,避免接收方缓冲区溢出。
- 拥塞控制:动态调整发送速率,防止网络拥塞导致性能下降。
二、TCP 连接建立与关闭过程
(一)三次握手:建立连接
三次握手的核心是确保 通信双方的发送与接收能力正常,流程如下:
1. 第一次握手(客户端 → 服务器)
- 客户端发送带有 SYN(同步标志)=1 和 初始序列号(Seq=x) 的报文段,请求建立连接。
- 客户端状态从 CLOSED 变为 SYN_SENT。
2. 第二次握手(服务器 → 客户端)
- 服务器收到请求后,返回 SYN=1、ACK(确认标志)=1、确认号(Ack=x+1) 和 服务器初始序列号(Seq=y) 的报文段,确认客户端请求并发起自身连接请求。
- 服务器状态从 CLOSED 变为 SYN_RCVD。
3. 第三次握手(客户端 → 服务器)
- 客户端收到服务器响应后,发送 ACK=1、Ack=y+1 的报文段,确认服务器的连接请求。
- 客户端状态变为 ESTABLISHED;服务器收到后状态也变为 ESTABLISHED,连接正式建立。
(二)四次挥手:关闭连接
当通信结束时,双方通过四次挥手释放连接,流程如下:
1. 第一次挥手(主动关闭方 → 被动关闭方)
- 主动关闭方发送 FIN(结束标志)=1 和 序列号(Seq=m) 的报文段,请求关闭连接。
- 主动关闭方状态从 ESTABLISHED 变为 FIN_WAIT_1。
2. 第二次挥手(被动关闭方 → 主动关闭方)
- 被动关闭方返回 ACK=1、Ack=m+1 的报文段,确认关闭请求,此时被动关闭方仍可发送剩余数据。
- 被动关闭方状态变为 CLOSE_WAIT,主动关闭方收到后变为 FIN_WAIT_2。
3. 第三次挥手(被动关闭方 → 主动关闭方)
- 被动关闭方发送完剩余数据后,发送 FIN=1、Seq=n 的报文段,请求彻底关闭连接。
- 被动关闭方状态变为 LAST_ACK。
4. 第四次挥手(主动关闭方 → 被动关闭方)
- 主动关闭方返回 ACK=1、Ack=n+1 的报文段,确认关闭。
- 主动关闭方状态变为 TIME_WAIT(等待 2MSL 时间以确保报文段失效),最终变为 CLOSED;被动关闭方收到后变为 CLOSED。
(三)三次握手与四次挥手的核心作用
- 三次握手:防止历史连接初始化,确保双方同步序列号。
- 四次挥手:确保数据完全传输,避免丢包导致连接异常关闭。
三、TCP 拥塞控制算法:核心机制与演进
(一)拥塞控制的目标与关键参数
- 目标:在网络拥塞时动态调整发送速率,避免丢包并最大化链路利用率。
- 关键参数:
- 拥塞窗口(cwnd):发送方当前允许发送的数据量上限,由拥塞控制算法动态调整。
- 慢启动阈值(ssthresh):区分“慢启动”和“拥塞避免”阶段的阈值。
- 最大段大小(MSS):单个 TCP 报文段的最大数据量。
(二)经典 TCP 拥塞控制算法
1. 慢启动(Slow Start)
- 核心逻辑:初始时 cwnd 设为 1 MSS,每收到一个确认(ACK)就将 cwnd 翻倍,呈指数增长。
- 目的:快速探测网络可用带宽,避免初始发送量过大导致拥塞。
- 触发条件:连接建立或超时重传后。
- 终止条件:当 cwnd ≥ ssthresh 时,进入拥塞避免阶段。
2. 拥塞避免(Congestion Avoidance)
- 核心逻辑:cwnd 达到 ssthresh 后,改为线性增长(每轮次增加 1 MSS),避免网络过载。
- 公式:
cwnd = cwnd + (MSS * MSS / cwnd)
- 目的:在探测带宽的同时,降低拥塞风险。
3. 快速重传(Fast Retransmit)
- 触发条件:发送方收到 3 个重复的 ACK(表明某个报文段丢失)。
- 核心逻辑:无需等待超时,立即重传丢失的报文段,减少延迟。
- 优化:相比超时重传(需等待 RTO),快速重传能更快恢复传输。
4. 快速恢复(Fast Recovery)
- 配合快速重传使用:
- 收到 3 个重复 ACK 后,将 ssthresh 设为当前 cwnd 的一半。
- 将 cwnd 设为 ssthresh + 3 MSS(假设 3 个 ACK 对应 3 个已接收的报文段)。
- 进入“快速恢复”阶段,cwnd 线性增长,直到收到新的 ACK 后进入拥塞避免阶段。
- 目的:在不降低发送速率的前提下,快速恢复传输,减少带宽浪费。
(三)TCP 拥塞控制算法的演进
算法版本 | 核心改进 | 应用场景 |
---|---|---|
TCP Reno | 实现“慢启动 + 拥塞避免 + 快速重传 + 快速恢复”四阶段模型 | 早期互联网 |
TCP NewReno | 优化快速恢复阶段,支持多个报文段丢失时的重传 | 高丢包率网络 |
TCP SACK | 引入选择性确认(SACK),允许接收方告知发送方哪些报文段已丢失,减少重传量 | 高延迟或丢包网络 |
TCP CUBIC | 基于数学函数(三次曲线)调整 cwnd,更适应高带宽时延积(BDP)网络 | 数据中心、骨干网 |
TCP BBR | 基于“带宽探测 + 往返时间(RTT)”动态调整发送速率,减少缓冲区膨胀 | 低延迟、高带宽网络 |
(四)拥塞控制与流量控制的区别
维度 | 拥塞控制 | 流量控制 |
---|---|---|
目标 | 防止网络过载(全局视角) | 避免接收方缓冲区溢出(端到端视角) |
控制方 | 发送方根据网络状态动态调整 | 接收方通过窗口大小告知发送方 |
依据 | 网络拥塞信号(丢包、延迟) | 接收方缓冲区剩余空间 |
四、TCP 协议的其他关键特性
(一)流量控制:滑动窗口机制
- 接收方通过 窗口大小(Window Size) 字段告知发送方当前可接收的数据量,防止缓冲区溢出。
- 当接收方缓冲区满时,窗口大小设为 0,发送方停止发送,直到收到新的窗口更新。
(二)可靠性保障:序列号与确认机制
- 序列号(Seq):为每个字节数据编号,确保接收方按序重组。
- 确认号(Ack):接收方返回期望接收的下一个字节编号,确认已收到的数据。
- 重传机制:发送方超时未收到 ACK 时,重传未确认的数据。
(三)TCP 与 UDP 的对比
特性 | TCP | UDP |
---|---|---|
连接性 | 面向连接(三次握手/四次挥手) | 无连接(直接发送) |
可靠性 | 可靠(重传、确认、排序) | 不可靠(无重传、不保证顺序) |
传输效率 | 较低(头部开销大、拥塞控制) | 较高(头部开销小、无额外机制) |
应用场景 | 网页浏览、文件传输、邮件 | 实时通信(音视频)、DNS、直播 |
五、TCP 协议的应用与优化方向
(一)典型应用场景
- HTTP/HTTPS:Web 服务的底层传输协议。
- FTP/SMTP/POP3:文件传输与邮件服务。
- 数据库连接:如 MySQL、PostgreSQL 的客户端-服务器通信。
(二)性能优化方向
- 调整拥塞控制算法:根据网络环境选择 CUBIC、BBR 等算法。
- 优化初始窗口(Initial CWND):提高连接建立后的初始传输效率。
- 减少 RTT 延迟:通过 CDN、就近接入等方式缩短物理距离。
- TCP 快速打开(TFO):在三次握手中复用历史密钥,减少延迟。
通过以上内容,可全面了解 TCP 协议的连接机制、拥塞控制原理及实际应用,为网络编程、服务器配置及性能优化提供理论基础。