TCP协议详解:互联网可靠传输的基石

举报
暮山紫 发表于 2026/10/09 09:55:28 2026/10/09
【摘要】 一、TCP是什么?TCP(Transmission Control Protocol,传输控制协议)是互联网核心协议之一,位于TCP/IP协议族的传输层。它为应用程序提供了一种面向连接的、可靠的、基于字节流的数据传输服务。简单来说,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(报文最大生存时间的两倍),原因有二:

  1. 确保最后一个ACK能到达对方。如果丢失,对方会重传FIN,此时本端仍能响应。
  2. 让本次连接的所有报文在网络中消失,避免影响后续相同端口的新连接。

六、可靠传输机制

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的核心思想仍深刻影响着现代网络协议的设计。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。