从TCP到HTTP与RPC:网络通信的演进之路

在分布式系统的世界里,RPC(远程过程调用)和HTTP(超文本传输协议)是两种最常见的通信方式。它们看似不同,但本质上都是基于底层的TCP/IP协议发展而来。本文将从网络通信的底层逻辑出发,梳理两者的演进历程、核心区别以及适用场景。

什么是RPC

RPC,全程Remote Procedure Calls远程程序调用,是一种方法,并不是和http一样的协议

首先看时间关系

gantt dateFormat YYYY title TCP协议、RPC、HTTP1.0和2.0诞生时间轴 section 协议诞生 TCP协议诞生 :1974, 1y RPC(ONC RPC定义为标准):1988, 1y HTTP/1.0发布 :1996, 1y HTTP/2.0发布 :2015, 1y

一、TCP:一切通信的基石

TCP(传输控制协议)是互联网的“基础设施”,负责在不可靠的网络环境中提供可靠的数据传输。它的核心特性包括:

  • 面向连接:通过三次握手建立连接,确保通信双方就绪。
  • 可靠传输:通过确认机制、重传和流量控制保证数据不丢失、不重复。
  • 有序性:数据包按顺序到达,避免乱序问题。

为什么需要上层协议?
TCP虽然可靠,但它只负责传输“原始字节流”,无法直接表达复杂的业务逻辑(比如“调用一个远程函数”或“获取一个网页”)。因此,开发者需要在其上构建应用层协议,定义数据格式和交互规则,这就是HTTP和RPC诞生的背景。

sequenceDiagram participant Client participant Server Client->>Server: 发送 SYN(同步位),初始序号 seq=x Server->>Client: 发送 SYN+ACK(同步位和确认位),确认序号 ack=x+1,初始序号 seq=y Client->>Server: 发送 ACK(确认位),确认序号 ack=y+1

二、HTTP的演进:从简单文本到高效协议

HTTP最初是为Web设计的“请求-响应”协议,随着互联网的发展不断优化:

  1. HTTP/0.9与HTTP/1.0
    • 简单文本协议,每次请求需新建TCP连接,效率低下。
    • 典型场景:获取静态HTML页面。
  2. HTTP/1.1(1997)
    • 引入持久连接(Keep-Alive)和管道化(Pipelining),复用TCP连接。
    • 新增缓存控制、分块传输等特性。
    • 痛点:队头阻塞(Head-of-Line Blocking),顺序请求导致效率受限。
  3. HTTP/2(2015)
    • 二进制分帧层:将请求/响应拆分为帧,支持多路复用(Multiplexing),彻底解决队头阻塞。
    • 头部压缩(HPACK)、服务端推送(Server Push)等优化。
    • 核心思想:在保持HTTP语义的同时,提升传输效率。
  4. HTTP/3(2022)
    • 基于UDP的QUIC协议,解决TCP的队头阻塞和握手延迟。
    • 连接迁移(切换网络不断连)、0-RTT快速握手。

HTTP的核心定位

  • 通用性强:无状态、基于URI的资源操作(GET/POST/PUT/DELETE)。
  • 跨平台:浏览器、移动端、API网关均可使用。
  • 语义明确:设计目标是传输超文本(如HTML),但逐渐成为RESTful API的事实标准。

三、RPC的诞生:让远程调用像本地调用一样简单

RPC的目标是隐藏网络细节,让开发者像调用本地函数一样调用远程服务。其核心设计包括:

  1. 核心组件
    • 序列化:将对象转换为二进制(如Protobuf、JSON、Thrift)。
    • 传输协议:基于TCP或HTTP/2等协议传输数据。
    • 服务发现:自动定位服务节点(如Consul、Zookeeper)。
    • 负载均衡与容错:失败重试、熔断机制等。
  2. RPC协议的发展
    • 早期RPC:如Sun RPC(1980s),基于TCP/UDP,但耦合度高。
    • 现代RPC框架:如gRPC(基于HTTP/2)、Dubbo(自定义协议)、Thrift(多协议支持)。
    • 趋势:拥抱标准协议(如HTTP/2),同时提供更高效的序列化(如Protobuf)。
  3. 与HTTP的关键区别
    • 性能:RPC通常使用二进制序列化(如Protobuf),比HTTP+JSON更高效。
    • 灵活性:RPC协议可定制(如连接池、压缩算法),而HTTP是通用协议。
    • 服务治理:RPC框架内置服务发现、监控等能力,HTTP需依赖外部组件(如API网关)。

四、RPC与HTTP的融合:界限逐渐模糊

随着HTTP/2的普及,RPC与HTTP的界限不再绝对:

  • gRPC:基于HTTP/2和Protobuf,兼具RPC的高效和HTTP的通用性。
  • RESTful API:可通过OpenAPI规范实现类似RPC的强类型接口(如GraphQL)。
  • HTTP/3:QUIC协议可能成为未来RPC的底层传输选项。

五、如何选择RPC与HTTP?

  • 选择RPC的场景
    • 微服务内部通信,追求高性能、低延迟。
    • 需要服务治理(如熔断、链路追踪)。
    • 强类型接口,跨语言支持(如gRPC)。
  • 选择HTTP的场景
    • 对外公开API,需跨平台兼容(浏览器、移动端)。
    • 遵循RESTful风格,资源化操作(如CRUD)。
    • 快速迭代,无需复杂服务治理。

六、总结

  • TCP是通信的基石,解决了可靠传输问题。
  • HTTP是通用应用层协议,从简单文本发展到高效二进制协议。
  • RPC是面向服务调用的设计模式,追求性能和开发体验。
  • 未来趋势:协议分层逐渐淡化,底层追求效率(QUIC),上层追求易用性(gRPC)。

无论是RPC还是HTTP,本质上都是为了解决同一个问题:如何在网络上高效、可靠地交换数据。理解它们的底层逻辑,才能在实际场景中做出合理的技术选型。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇