TCP协议详解:互联网可靠传输的基石
一、TCP是什么?
TCP(Transmission Control Protocol,传输控制协议)是互联网核心协议之一,位于TCP/IP协议族的传输层。它为应用程序提供了一种面向连接的、可靠的、基于字节流的数据传输服务。
简单来说,TCP就像一位严谨的快递员:寄件前先确认收件人在家(建立连接),运输过程中给每个包裹编号并跟踪(序列号与确认),如果包裹丢失就重新发送(重传机制),最后确认所有包裹送达后才结束服务(断开连接)。
二、TCP的核心特性
1. 面向连接
TCP通信前必须先建立连接,通信结束后释放连接。这个连接不是物理线路,而是双方维护的一组状态信息。
2. 可靠传输
TCP通过多种机制保证数据无差错、不丢失、不重复、按序到达:
- 序列号与确认应答(ACK):每个字节都有编号,接收方收到后回复确认
- 超时重传:发送方在指定时间内未收到ACK,就重新发送
- 校验和:检测数据在传输过程中是否损坏
- 去重与排序:根据序列号去除重复数据,并按序重组
3. 基于字节流
TCP不保留消息边界。发送方写入100字节,接收方可能分两次读到60和40字节。应用程序需要自己定义消息边界(如长度前缀、分隔符)。
4. 全双工
连接双方可以同时发送和接收数据。
三、TCP报文结构
理解TCP报文格式是掌握其工作机制的关键:
| 字段 | 长度 | 作用 |
|---|---|---|
| 源端口/目的端口 | 各2字节 | 标识发送方和接收方应用 |
| 序列号 | 4字节 | 本报文段数据第一个字节的编号 |
| 确认号 | 4字节 | 期望收到对方下一个字节的编号 |
| 数据偏移 | 4位 | 首部长度 |
| 标志位 | 6位 | URG/ACK/PSH/RST/SYN/FIN |
| 窗口 | 2字节 | 接收窗口大小,用于流量控制 |
| 校验和 | 2字节 | 检验首部和数据 |
| 紧急指针 | 2字节 | 指向紧急数据 |
| 选项 | 可变 | 如MSS、窗口扩大、SACK等 |
关键标志位:
- SYN:建立连接
- ACK:确认号有效
- FIN:释放连接
- RST:重置连接
- PSH:尽快交付给应用层
- URG:紧急数据
四、三次握手:建立连接
TCP建立连接需要三次握手:
text
客户端 服务器
| |
|------ SYN seq=x --->| 第一次:客户端请求连接
| |
|<-- SYN+ACK seq=y, --| 第二次:服务器同意并请求连接
| ack=x+1 |
| |
|------ ACK ack=y+1 ->| 第三次:客户端确认
| |
为什么是三次而不是两次?
核心原因:防止已失效的连接请求突然到达服务器,导致服务器建立无效连接、浪费资源。
如果只有两次握手,一个延迟很久的SYN到达服务器后,服务器直接进入连接状态并等待数据,而客户端早已放弃这个连接,服务器就会一直空等。三次握手让服务器在收到客户端最终确认前不分配完整资源,避免了这个问题。
五、四次挥手:释放连接
TCP连接是全双工的,每个方向需要单独关闭:
text
客户端 服务器
| |
|------ FIN seq=u --->| 第一次:客户端不再发送数据
| |
|<----- ACK ack=u+1 --| 第二次:服务器确认
| |
|<---- FIN seq=w -----| 第三次:服务器也不再发送
| |
|------ ACK ack=w+1 ->| 第四次:客户端确认
| |
为什么需要TIME_WAIT状态?
主动关闭方在发送最后一个ACK后进入TIME_WAIT,等待2MSL(报文最大生存时间的两倍),原因有二:
- 确保最后一个ACK能到达对方。如果丢失,对方会重传FIN,此时本端仍能响应。
- 让本次连接的所有报文在网络中消失,避免影响后续相同端口的新连接。
六、可靠传输机制
1. 超时重传
发送方为每个报文段设置定时器,超时未收到ACK就重传。超时时间(RTO)根据往返时间(RTT)动态计算:
text
RTO = SRTT + 4 × RTTVAR
其中SRTT是平滑RTT,RTTVAR是RTT偏差。这种自适应机制能应对网络延迟变化。
2. 快速重传
接收方收到乱序报文时,立即重复发送最后一个按序报文的ACK。发送方连续收到3个重复ACK,就认为该报文丢失,无需等待超时立即重传。
3. 选择确认(SACK)
接收方可以告知发送方已收到哪些不连续的数据块,发送方只需重传真正丢失的部分,提高效率。
七、流量控制
TCP使用滑动窗口机制进行流量控制,防止发送方压垮接收方。
接收方在ACK中通告自己的接收窗口(rwnd),表示还能接收多少字节。发送方根据rwnd调整发送速率,确保未确认数据不超过窗口大小。
零窗口与坚持定时器:
当接收方缓冲区满时,通告rwnd=0。发送方停止发送,但会启动坚持定时器,定期发送窗口探测报文,防止接收方窗口更新通知丢失导致死锁。
八、拥塞控制
流量控制关注接收方能力,拥塞控制关注网络状况。TCP通过四个算法协同工作:
1. 慢启动
连接初期,拥塞窗口(cwnd)从1个MSS开始,每收到一个ACK就翻倍增长,呈指数上升,快速探测网络容量。
2. 拥塞避免
当cwnd达到慢启动阈值(ssthresh)后,改为每个RTT增加1个MSS,呈线性增长,避免过快导致拥塞。
3. 快速重传与快速恢复
收到3个重复ACK时:
- ssthresh设为当前cwnd的一半
- cwnd设为ssthresh(而非回到1)
- 进入拥塞避免阶段
这避免了每次丢包都从慢启动重新开始,提高了效率。
4. 超时重传
如果超时,说明网络严重拥塞:
- ssthresh设为当前cwnd的一半
- cwnd重置为1
- 重新进入慢启动
现代演进: CUBIC、BBR等新算法在高速网络中表现更优。BBR不依赖丢包判断拥塞,而是基于带宽和RTT建模,在Google的部署中显著提升了吞吐量。
九、TCP与UDP的对比
| 特性 | TCP | UDP |
|---|---|---|
| 连接性 | 面向连接 | 无连接 |
| 可靠性 | 可靠 | 不可靠 |
| 顺序 | 保证有序 | 不保证 |
| 速度 | 较慢 | 较快 |
| 首部开销 | 20-60字节 | 8字节 |
| 适用场景 | 文件传输、网页、邮件 | 视频直播、DNS、游戏 |
十、总结
TCP通过连接管理、序列号确认、超时重传、滑动窗口、拥塞控制等精密机制,在不可靠的IP网络上构建了可靠的传输通道。它的设计体现了端到端原则和自适应思想,是互联网能够承载海量应用的基石。
理解TCP不仅有助于排查网络问题(如连接超时、传输慢、丢包),也是设计高性能分布式系统的基础。尽管QUIC等新协议正在崛起,TCP的核心思想仍深刻影响着现代网络协议的设计。
- 点赞
- 收藏
- 关注作者
评论(0)