很多后端开发在刚接触消息队列、微服务或者 AI 网关时,都会碰到这样一串词:
- TCP
- HTTP
- HTTP/2
- gRPC
单看每个词,好像都认识。 但一旦放在一起,就容易开始乱:
- HTTP 不是协议吗,为什么还能长连接
- gRPC 不是远程调用吗,怎么又跑在 HTTP/2 上
- TCP 和 HTTP 到底谁包谁
- RocketMQ、微服务、网关这些中间件,为什么老提 gRPC
这篇不准备堆定义,而是把它们当成一套”运输系统”来讲。
先说最短结论
你可以先把这四个东西简单记成这样:
- TCP:负责把路打通
- HTTP:规定车上货物怎么装、怎么写单子
- HTTP/2:HTTP 的升级版,让同一条路可以更高效地跑很多车
- gRPC:一种基于 HTTP/2 的远程调用方式,定义”双方怎么像调本地函数一样通信”
如果你只记住这一层,已经够应付很多工程场景。
但为了彻底不混,下面拆开讲。
先用生活中的寄快递来类比
假设你在上海开公司,仓库在杭州。
你每天都要不断往仓库发各种东西:
- 订单
- 图片
- 对账单
- 通知单
- 统计报表
这个”你和仓库之间反复通信”的场景,就很像程序和服务器之间的网络通信。
现在我们来对应这几个概念。
第一层:TCP 是什么
你先别把 TCP 想复杂。
你可以把它理解成:
TCP 负责把一条可靠的运输线路打通。
也就是说,它不关心你运的是订单、图片还是聊天消息,它主要关心的是:
- 这条路能不能通
- 货能不能按顺序送到
- 丢了能不能补发
- 对面到底收没收到
所以 TCP 更像是:
一条能稳定送货的公路系统。
它解决的是”传输可靠性”问题,而不是”业务语义”问题。
换句话说:
TCP 不关心你传的是”登录请求”还是”支付请求”,它只负责尽量可靠地把字节流送过去。
第二层:HTTP 是什么
如果说 TCP 只是把路修好了,那接下来还缺什么?
还缺:
- 送货单怎么写
- 发货人写哪里
- 收货人写哪里
- 这是请求还是响应
- 内容是什么格式
- 一次通信怎么开始,怎么结束
这就是 HTTP 干的事。
所以 HTTP 你可以理解成:
在 TCP 这条路之上,约定一套大家都看得懂的通信规则。
比如:
- 请求行怎么写
- Header 怎么写
- Body 放哪里
- 状态码是什么
- 方法是 GET 还是 POST
所以 HTTP 不是”路”,而是:
跑在路上的运输规范。
就像快递行业里,不同公司之间要统一面单格式、包裹规则、签收流程一样。
一句话区分 TCP 和 HTTP
这是最容易记混的地方,可以直接记这一句:
TCP 解决”怎么可靠地传”,HTTP 解决”传的内容按什么规则组织”。
也就是说:
- 没有 TCP,路都不稳
- 没有 HTTP,双方虽然能传,但不知道该怎么理解彼此的数据
第三层:HTTP/2 又是什么
HTTP/2 不是一种跟 HTTP 完全没关系的新协议。
它本质上还是 HTTP 家族的一员,只是比传统 HTTP/1.x 更现代、更高效。
你可以把它理解成:
HTTP/2 = 对 HTTP 这套通信规则做了一次大升级。
升级点里,最重要的是两个:
- 一条连接可以长期复用
- 一条连接里可以并发跑多个流
这句话第一次听会很抽象,所以继续用生活类比讲。
HTTP/1.x 更像单车道小路
假设你和仓库之间只有一条比较窄的路。
虽然这条路能用,但很多车要排队:
- 订单车先过
- 图片车等着
- 报表车再等
- 通知车继续排队
这样的问题是:
- 容易堵
- 效率不高
- 一个慢任务容易拖住后面的任务
这就像早期 HTTP 使用体验里,虽然也能通信,但同一条连接上的并发利用率不高。
HTTP/2 更像多车道高速公路
HTTP/2 的思路不是”有多少请求就修多少路”,而是:
保留少量长期存在的大路,然后让很多车在不同车道上同时跑。
也就是说:
- 路先修好
- 不要老拆老建
- 同一条路上有多个车道
- 多辆车可以同时运输不同货物
这就是为什么大家会说:
HTTP/2 更强调在少量长期存在的连接上复用和并发多个流。
翻译成人话就是:
不要每次请求都新建一条连接,而是在少数几条长期存在的连接里,同时跑很多独立任务。
那”流”到底是什么
如果你还没学过协议细节,可以先不要死磕”流”的精确定义。
你只要先把它理解成:
同一条连接里的一个独立任务通道。
比如同一条高速公路上:
- 1 号车道跑订单
- 2 号车道跑图片
- 3 号车道跑通知
- 4 号车道跑报表
它们都在一条大路上,但彼此相对独立,不必完全串行排队。
这就是”多个流”。
第四层:gRPC 是什么
讲到这里,再看 gRPC 就容易多了。
gRPC 不是在和 TCP、HTTP 平级竞争。
它更像是:
建立在 HTTP/2 之上的一套远程调用框架。
你可以把 gRPC 理解成:
它不是只规定”请求怎么发”,而是进一步规定”服务之间怎么像调用本地函数一样互相调用”。
比如你写代码时可能会想这样调用:
CreateOrder(userId, goodsId)
GetUserProfile(userId)
SendMessage(content)
在本地进程里,函数调用很自然。 但如果这个函数实际上在另一台机器上,你就需要一套机制来完成:
- 参数怎么编码
- 方法名怎么传过去
- 返回值怎么带回来
- 错误怎么表达
- 超时、重试、流式传输怎么处理
gRPC 解决的就是这一层问题。
gRPC 和 HTTP/2 的关系
这句话可以直接背下来:
gRPC 通常跑在 HTTP/2 上。
为什么?
因为 gRPC 很适合这种场景:
- 高频调用
- 长连接复用
- 低延迟
- 流式通信
- 一个连接里并发多个请求
而 HTTP/2 刚好非常适合承载这些能力。
所以它们的关系不是:
- 二选一
- 谁替代谁
而是:
gRPC 借助 HTTP/2 作为底层传输通道。
再往下一层,HTTP/2 又通常跑在 TCP 上。
所以整条链路可以理解成:
gRPC
↓
HTTP/2
↓
TCP
再换一个更完整的类比
你可以把整个通信过程想成一家物流公司。
TCP
负责修高速公路,保证车能从 A 地到 B 地,并且尽量不丢件、不乱序。
HTTP
规定物流面单怎么写、箱子怎么打包、签收单怎么返回。
HTTP/2
把原来单车道的小路升级成多车道高速公路,让同一条路上可以同时跑很多运输任务。
gRPC
不只是寄”包裹”,而是直接定义一套”业务调用规则”:
- 我要调用哪个服务
- 方法名是什么
- 参数是什么
- 返回值是什么
- 错误码怎么传
所以 gRPC 更像是:
在高等级公路和统一物流规则之上,再加一层标准化的业务调度系统。
为什么很多中间件和云产品都喜欢 gRPC
因为它很适合现代服务之间的频繁通信。
比如:
- 微服务之间互调
- AI 推理服务调用
- 消息代理层通信
- 网关和后端服务通信
它的优势通常在于:
- 连接复用好
- 编码效率高
- 接口定义清晰
- 流式能力强
- 更适合服务间通信
所以你会发现,很多新一代中间件文档里,经常出现”基于 gRPC""通过 HTTP/2 通信”这种表述。
那 REST 和 gRPC 又是什么关系
这也是一个高频疑问。
你可以这样简单区分:
REST
更像”面向资源”的 HTTP 接口风格。
例如:
GET /users/123POST /orders
它更适合:
- 对外开放接口
- 给前端调用
- 人类更容易理解和调试
gRPC
更像”面向方法调用”的服务通信方式。
例如:
GetUserCreateOrderSendMessage
它更适合:
- 内部服务之间通信
- 高频 RPC 调用
- 强类型接口约束
- 流式场景
它们不是谁绝对替代谁,而是各有适用场景。
回到最常见的误区
误区一:HTTP 和 TCP 是一回事
不是。
- TCP 是传输层
- HTTP 是应用层
一个负责”路通不通”,一个负责”交流规则是什么”。
误区二:HTTP/2 是完全不同的新协议
也不是。
HTTP/2 仍然是 HTTP 家族,只是做了现代化升级。
误区三:gRPC 和 HTTP/2 是平级关系
不是。
更准确地说:
gRPC 通常建立在 HTTP/2 之上。
误区四:用了 gRPC 就不用 TCP
也不对。
底层传输通常还是要落到 TCP 上。
最后用一张关系图记住
业务调用层:gRPC
通信协议层:HTTP/2
传输保障层:TCP
如果你更喜欢生活化版本,也可以记成:
gRPC = 业务调度规则
HTTP/2 = 高效运输规范
TCP = 可靠公路系统
最后总结
把这四个概念压缩成一句最实用的话:
TCP 负责把路修稳,HTTP 负责规定交流格式,HTTP/2 负责把这条路升级成高效多车道,gRPC 则是在这套基础上,进一步把跨机器通信包装成标准化的远程方法调用。
评论 / 0
共 0 条你可能是第一个留下评论的人