TCP协议简介

前言

在互联网世界中,我们浏览网页、传输文件、微信聊天、下载资源,绝大多数数据传输都依赖 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 等网络库编码,就不再只是复制粘贴代码,能够从底层理解每一个现象背后的原因。

相关推荐
清欢渡---1 小时前
防火墙---安全策略配置
网络·防火墙·防御保护
TlSfoward2 小时前
如何用 TLS 与 HTTP 指标降低误伤 TLSFOWARD抓包工具
网络·网络协议·http
跨境小陈2 小时前
2026 年如何使用 Python 抓取 Reddit 数据
开发语言·网络·python
念恒123062 小时前
Socket编程UDP(中)
linux·网络协议·udp
汤愈韬3 小时前
关于OSPF中一类、二类、三类LSA的一些思考
网络·网络协议
柒号华仔4 小时前
一文讲透5G RedCap
网络协议·5g·信息与通信
Flandern11114 小时前
HTTPS(TLS 1.3)完整流程
数据库·网络协议·计算机网络·https
我送炭你添花4 小时前
HART协议详解:00 为什么工业世界仍然需要HART?
网络·机器人·自动化·智能工厂
vortex54 小时前
网络路径探测三大技术:原理、缺陷与选型指南
网络