不同程序之间交换数据,首先要解决的不是消息长什么样,而是数据怎么从一端到达另一端。传输层(Transport Layer)负责的正是这件事,而 JSON-RPC 与 MCP、ACP、A2A 都建立在它之上。
一、传输层是什么?
在 Agent 系统中,不同程序之间需要交换数据。例如:
- AI Host 与 MCP Server 通信。
- IDE 与 AI Agent 通信。
- Agent 与 Agent 通信。
- Web 前端与 Agent 后端通信。
这些程序可能运行在同一台机器,也可能运行在不同机器上。
传输层(Transport Layer)负责解决数据如何从一个程序传递到另一个程序的问题。
常见的传输方式有:
| 传输方式 | 通信范围 | 核心特点 |
|---|---|---|
| HTTP | 本地或网络 | 请求—响应 |
| WebSocket | 本地或网络 | 双向、持续通信 |
| stdio | 本地进程 | 通过标准输入输出通信 |
需要区分三个层次:
- 传输层:HTTP、WebSocket、stdio,解决数据怎么传递。
- 消息协议层:JSON-RPC,解决请求、响应和通知如何表达。
- 业务协议层:MCP、ACP、A2A,定义具体的业务方法和交互规则。
例如:
MCP └── JSON-RPC 2.0 └── stdio └── OS Pipe └── 本地进程二、HTTP
2.1 什么是 HTTP?
HTTP(HyperText Transfer Protocol,超文本传输协议)是一种应用层通信协议。
它采用典型的请求—响应模式:
- 客户端发送请求(Request)。
- 服务端接收并处理请求。
- 服务端返回响应(Response)。
例如,客户端请求服务器读取文件:
POST /files/read HTTP/1.1Host: example.com:8080Content-Type: application/json
{ "path": "/home/user/config.yaml"}服务器处理后返回:
HTTP/1.1 200 OKContent-Type: application/json
{ "content": "server:\n port: 8080"}2.2 HTTP 的通信过程
Client Server | | |------ HTTP Request --->| | | | 处理请求 | | |<----- HTTP Response ---| | |基本过程:
- Client 确定服务器地址和端口。
- 建立 TCP 连接(HTTPS 还涉及 TLS 握手)。
- 发送 HTTP 请求。
- Server 解析请求并执行对应业务逻辑。
- Server 返回 HTTP 响应。
- 连接可以关闭,也可以通过 Keep-Alive 复用。
2.3 HTTP 的特点
- 请求—响应模式。
- 客户端主动发起请求。
- 服务端通常通过响应返回结果。
- 支持 GET、POST、PUT、DELETE 等方法。
- 支持 HTTPS 加密。
- HTTP/1.1、HTTP/2 通常运行在 TCP 之上;HTTP/3 使用 QUIC。
2.4 HTTP 在 Agent 系统中的应用
例如,Agent A 需要调用 Agent B:
POST /a2a HTTP/1.1Content-Type: application/json
{ "jsonrpc": "2.0", "id": 1, "method": "message/send", "params": { "message": { "role": "user", "parts": [ { "kind": "text", "text": "帮我实现一个 HTTP 服务" } ] } }}这里:
- HTTP 负责将数据发送到 Agent B。
- JSON-RPC 负责描述调用请求。
- A2A 负责定义
message/send的业务含义。
三、WebSocket
3.1 什么是 WebSocket?
WebSocket 是一种支持全双工通信的网络协议。
与 HTTP 典型的请求—响应模式不同,WebSocket 建立连接后,客户端和服务端都可以主动发送消息。
双方可以在同一条持久连接上随时发送数据。
3.2 WebSocket 的通信过程
WebSocket 通常先通过 HTTP Upgrade 请求建立连接。
客户端发送:
GET /ws HTTP/1.1Host: example.comUpgrade: websocketConnection: UpgradeSec-WebSocket-Key: ...Sec-WebSocket-Version: 13服务器同意升级:
HTTP/1.1 101 Switching ProtocolsUpgrade: websocketConnection: UpgradeSec-WebSocket-Accept: ...握手成功后,双方开始使用 WebSocket 帧交换数据。
通信过程:
Client Server | | |---- HTTP Upgrade ----->| |<--- 101 Switching -----| | | |<==== WebSocket ========>| | | |---- Message ---------->| |<--- Message -----------| |---- Message ---------->| |<--- Message -----------| | |3.3 WebSocket 的特点
- 全双工通信。
- 建立连接后可以持续通信。
- 客户端和服务端都可以主动发送消息。
- 不需要每次通信都重新发起 HTTP 请求。
- 适合实时交互和事件推送。
- 需要管理连接状态、断线重连和心跳。
3.4 WebSocket 在 Agent 系统中的应用
例如,Web 前端需要实时展示 Agent 的执行过程。
Web Frontend Agent Backend | | |---- 建立 WebSocket ------>| |<--- 连接成功 -------------| | | |---- 发送用户任务 -------->| | | |<--- 正在分析代码 ---------| |<--- 正在调用工具 ---------| |<--- 正在修改文件 ---------| |<--- 任务执行完成 ---------| | |它适合:
- Agent 实时输出。
- 多轮交互。
- 工具执行进度。
- 双向控制消息。
- 实时状态更新。
NOTEWebSocket 只提供双向消息传输,并不规定 JSON-RPC 消息格式。可以在 WebSocket 上运行 JSON-RPC,也可以设计自己的消息格式。
四、stdio
4.1 什么是 stdio?
stdio 是 Standard Input / Output 的缩写,即标准输入输出。
在 Linux / Unix 系统中,一个普通进程通常会获得三个标准文件描述符:
| 名称 | 文件描述符 | 用途 |
|---|---|---|
| stdin | 0 | 标准输入 |
| stdout | 1 | 标准输出 |
| stderr | 2 | 标准错误输出 |
stdio 本身不是网络协议,而是操作系统提供给进程使用的标准输入输出接口。
两个本地程序可以通过 Pipe(管道)连接彼此的标准输入输出,实现进程间通信。
4.2 stdio 的通信原理
假设有两个程序:
- MCP Client
- MCP Server
Client 创建 Server 子进程,并建立两个管道:
- Client 的输出连接 Server 的 stdin。
- Server 的 stdout 连接 Client 的输入。
MCP Client MCP Server
stdin <--------------------- stdout stdout ---------------------> stdin也可以理解为:
Client Server
写入请求 --------------------> stdin 读取请求
读取响应 <-------------------- stdout 写入响应4.3 stdio 的实际通信过程
假设 Client 启动一个 MCP Server:
npx @modelcontextprotocol/server-filesystem /home/user通信过程:
第一步:创建进程
Client 通过操作系统的进程创建接口启动 MCP Server。
第二步:建立管道
Client 获取子进程的 stdin 和 stdout 管道。
第三步:发送请求
Client 将 JSON-RPC 请求写入 Server 的 stdin:
{"jsonrpc":"2.0","id":1,"method":"initialize","params":{}}第四步:Server 处理请求
Server 从 stdin 读取数据,解析 JSON-RPC,根据 method 分发到对应的处理函数。
第五步:返回响应
Server 将 JSON-RPC 响应写入 stdout:
{"jsonrpc":"2.0","id":1,"result":{"protocolVersion":"2025-03-26"}}Client 从 stdout 读取响应。
4.4 stdio 的特点
- 不需要启动 HTTP 服务。
- 不需要监听网络端口。
- 适合本机进程间通信。
- 通常由 Client 创建和管理 Server 子进程。
- stdout 可以作为专用通信通道。
- stderr 用于输出日志和诊断信息。
WARNINGstdout 不能随意输出普通日志。因为 Client 会将 stdout 当作协议消息读取,额外的日志文本可能导致 JSON 解析失败。
日志应该写入 stderr。
NOTEstdio 本质上是字节流,不能认为一次 Write 就对应一次 Read。MCP 的 stdio 传输采用一行一条 JSON 消息,以换行符作为消息分隔符。
4.5 stdio 在 Agent 系统中的应用
例如,一个本地 Agent 需要调用文件系统 MCP Server:
Agent Host | | 创建子进程 vMCP Server | | 读取本地文件 v文件系统适合:
- 本地 MCP Server。
- IDE 启动本地 Agent。
- 本地开发工具集成。
- 不需要远程访问的工具服务。
五、三种传输方式的区别
| 对比 | HTTP | WebSocket | stdio |
|---|---|---|---|
| 通信范围 | 本地 / 网络 | 本地 / 网络 | 本地进程 |
| 通信模式 | 请求—响应 | 全双工 | 通过管道双向传输 |
| 是否需要网络端口 | 通常需要 | 需要 | 不需要 |
| 是否需要启动服务端进程 | 通常需要 | 需要 | 通常由 Client 启动子进程 |
| 是否支持双向主动发送 | 需要额外机制 | 支持 | 支持 |
| 连接形式 | 请求连接,可复用 | 持久连接 | 管道 |
| 典型场景 | API、远程服务 | 实时通信 | 本地工具通信 |
如何选择?
选择 HTTP:
- 需要跨机器通信。
- 需要提供标准 API。
- 需要利用成熟的 HTTP 基础设施。
选择 WebSocket:
- 需要持续双向通信。
- 需要实时推送。
- 需要频繁交换消息。
选择 stdio:
- 两个程序运行在同一台机器。
- Client 可以直接启动 Server。
- 不需要网络访问和端口管理。
六、在 MCP、ACP、A2A 中的应用
| 协议 | 常见传输方式 | 说明 |
|---|---|---|
| MCP | stdio、Streamable HTTP | 本地进程或远程服务 |
| ACP | stdio | IDE 与 Agent 通过进程通信 |
| A2A | HTTP(S)、SSE | Agent 之间远程任务通信 |
NOTE需要注意:
- MCP 的 Streamable HTTP 可以使用 HTTP 请求和 SSE 流式响应,并不要求 WebSocket。
- ACP 常见实现采用 stdio,但不能将 ACP 与 stdio 画等号。
- A2A 的 HTTP 传输可以使用 SSE 提供任务状态和事件流。
- 传输方式与 JSON-RPC 是相互独立的概念,不同传输方式可以承载相同的消息协议。
七、核心总结
可以用三句话记住:
- HTTP: 客户端发起请求,服务端返回响应,适合 API 和网络服务。
- WebSocket: 建立持久连接,双方随时发送消息,适合实时双向通信。
- stdio: 利用操作系统的标准输入输出和管道,让本地进程直接交换数据。
整个 Agent 通信体系可以理解为:
应用层:MCP / ACP / A2A |消息层:JSON-RPC 2.0 |传输层:HTTP / WebSocket / stdio |底层机制:TCP / Pipe / 操作系统进程接口核心思想:传输层解决数据怎么到达对方,消息协议解决数据怎么表达,业务协议解决双方具体要做什么。