TCP协议简介
2026/7/25 19:23:26 网站建设 项目流程

前言

在互联网世界中,我们浏览网页、传输文件、微信聊天、下载资源,绝大多数数据传输都依赖 TCP 协议。HTTP、HTTPS、WebSocket、MySQL、SSH 等上层应用协议底层全部构建在 TCP 之上。
很多开发者学会 Socket 编码之后,只懂得调用 send、recv,却不了解 TCP 底层机制,遇到粘包、连接断开、超时重传等问题时无从下手。本文用通俗易懂的方式讲解 TCP 核心原理,结合开发场景说明实际意义。

TCP 全称:传输控制协议(Transmission Control Protocol),工作在 OSI 七层模型的传输层。

一、TCP 的核心特性

TCP 最重要的标签:面向连接、可靠传输、有序、全双工、流量控制、拥塞控制

  1. 面向连接
    通信双方传输数据前必须先建立专属连接,通信结束正常断开。不像 UDP,发数据包不需要提前打招呼。

  2. 可靠传输
    保证数据准确送达:不会丢包、不会重复接收。依靠确认应答、重传机制实现。

  3. 有序传输
    多个数据包到达对方时,TCP 会根据序列号重新排序,上层应用收到的数据和发送顺序保持一致。

  4. 全双工通信
    连接建立后,双方可以同时互相发送数据,不需要轮流单向传输。类似打电话,两边随时可以说话。

  5. 基于字节流
    TCP 没有清晰数据包边界,只看作一串连续字节流。这也是网络开发最常遇到TCP粘包的根本原因。

对比记忆:UDP = 无连接、不可靠、面向报文;TCP = 面向连接、可靠、面向字节流。

二、三次握手:建立连接

客户端想要和服务端通信,首先执行三次握手建立 TCP 连接。
目的:确认双方发送能力、接收能力正常,协商初始序列号。

流程:

  1. 第一次握手:客户端 → 服务端,发送 SYN 报文。客户端请求建立连接。
  2. 第二次握手:服务端 → 客户端,回复 SYN + ACK。同意连接,并确认收到客户端请求。
  3. 第三次握手:客户端 → 服务端,回复 ACK。确认收到服务端应答,连接正式建立。

通俗理解:

  • 客户端:能听到我吗?(SYN)
  • 服务端:能听到,你能听到我吗?(SYN+ACK)
  • 客户端:可以听到!(ACK)

连接建立完成,双方即可开始传输业务数据。

开发常见问题

服务端listen()之后等待连接,内核自动完成三次握手;
防火墙、端口未开放、路由不通,都会导致握手失败,客户端抛出连接超时 / 连接拒绝。

三、四次挥手:断开连接

TCP 连接是双向通道,关闭连接需要四次挥手,任何一方都可以主动发起关闭。

流程(客户端主动关闭为例):

  1. 第一次挥手:客户端发送 FIN,表示客户端不再发送数据。
  2. 第二次挥手:服务端回复 ACK,确认收到关闭请求。此时服务端依然可以继续向客户端发送剩余数据。
  3. 第三次挥手:当服务端数据全部发送完毕,发送 FIN,告诉客户端服务端也不再发数据。
  4. 第四次挥手:客户端回复 ACK,双方通道彻底关闭。

通俗理解:

  • 客户端:我说完了,不再说话了(FIN)
  • 服务端:收到,我知道你不说了(ACK)
  • 服务端:我这边数据也发完了,我也不说了(FIN)
  • 客户端:收到,通话结束(ACK)

⚠️ 关键点:
不能简化成三次。因为一方关闭发送通道后,另一方可能还有残留数据需要传输。

四、可靠性如何实现?

TCP 通过一系列机制保障数据不丢失:

  1. 序列号(Sequence Number)
    每一段字节分配序号,用于排序、去重、确认。
  2. 确认应答 ACK
    接收方收到数据后返回 ACK,告诉发送方“哪些数据我收到了”。
  3. 超时重传
    发送数据后启动计时器,如果迟迟等不到 ACK,自动重新发送报文,解决丢包。
  4. 重复报文去重
    收到重复数据包,依靠序列号识别并丢弃副本。

五、流量控制

防止发送方发送速度太快,接收方缓冲区塞满造成数据丢失。
核心机制:滑动窗口协议
接收方在 ACK 报文中通知发送方自己剩余缓冲区大小,发送方严格控制发送量,不能超过接收方处理上限。

六、拥塞控制

流量控制解决「发送方和接收方之间」速度匹配;
拥塞控制解决「整条网络链路」拥堵问题。

如果网络路由器过载、大量丢包,TCP 主动降低发送速率,避免持续加剧网络拥堵。
常见算法:慢启动、拥塞避免、快重传、快恢复。

七、TCP 开发避坑重点(Socket 开发必看)

1. TCP 粘包

TCP 是字节流,没有数据包边界。多次发送的数据可能合并在一起被一次 recv 读到,就是粘包。
解决方案:

  • 固定数据包长度
  • 使用分隔符分割数据包
  • 包头+包体:头部携带数据长度,先读长度,再读取对应字节数据

2. 不要认为 send 成功代表对方收到数据

send() 仅仅代表数据写入本机操作系统 TCP 缓冲区;
如果后续网络彻底断开,缓冲区数据依然可能发送失败,应用层无法直接感知。

3. recv 返回空字节b""

代表 TCP 连接已经正常关闭(对方执行四次挥手),业务代码需要主动断开套接字。

4. Keepalive(TCP保活)

长时间没有数据传输时,开启 TCP Keepalive,内核定时探测连接是否存活,及时清理僵死连接。常用于内网穿透、长连接服务。

八、TCP 适用场景

✅ 适合:文件传输、数据库访问、网页访问、即时通讯、远程登录,要求数据完整不丢失。
❌ 不适合:直播、语音通话、游戏实时数据包,这类场景允许少量丢包,追求极低延迟,一般选用 UDP。

九、总结

TCP 通过三次握手建立连接、四次挥手关闭连接;依靠序列号、ACK应答、重传、滑动窗口实现可靠有序传输。
所有上层网络应用协议都建立在 TCP 之上,理解 TCP 原理,才能真正看懂网络异常、解决 Socket 通信中的粘包、断线、超时等疑难问题。

掌握 TCP 理论后,再结合 Python Socket、Netty、Go net 等网络库编码,就不再只是复制粘贴代码,能够从底层理解每一个现象背后的原因。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询