2213 字
11 分钟
Agent 通信基础:HTTP、WebSocket 与 stdio 三种传输方式

不同程序之间交换数据,首先要解决的不是消息长什么样,而是数据怎么从一端到达另一端。传输层(Transport Layer)负责的正是这件事,而 JSON-RPC 与 MCP、ACP、A2A 都建立在它之上。

一、传输层是什么?#

在 Agent 系统中,不同程序之间需要交换数据。例如:

  • AI Host 与 MCP Server 通信。
  • IDE 与 AI Agent 通信。
  • Agent 与 Agent 通信。
  • Web 前端与 Agent 后端通信。

这些程序可能运行在同一台机器,也可能运行在不同机器上。

传输层(Transport Layer)负责解决数据如何从一个程序传递到另一个程序的问题。

常见的传输方式有:

传输方式通信范围核心特点
HTTP本地或网络请求—响应
WebSocket本地或网络双向、持续通信
stdio本地进程通过标准输入输出通信

需要区分三个层次:

  1. 传输层:HTTP、WebSocket、stdio,解决数据怎么传递。
  2. 消息协议层:JSON-RPC,解决请求、响应和通知如何表达。
  3. 业务协议层: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.1
Host: example.com:8080
Content-Type: application/json
{
"path": "/home/user/config.yaml"
}

服务器处理后返回:

HTTP/1.1 200 OK
Content-Type: application/json
{
"content": "server:\n port: 8080"
}

2.2 HTTP 的通信过程#

Client Server
| |
|------ HTTP Request --->|
| |
| 处理请求
| |
|<----- HTTP Response ---|
| |

基本过程:

  1. Client 确定服务器地址和端口。
  2. 建立 TCP 连接(HTTPS 还涉及 TLS 握手)。
  3. 发送 HTTP 请求。
  4. Server 解析请求并执行对应业务逻辑。
  5. Server 返回 HTTP 响应。
  6. 连接可以关闭,也可以通过 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.1
Content-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.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: ...
Sec-WebSocket-Version: 13

服务器同意升级:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-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 实时输出。
  • 多轮交互。
  • 工具执行进度。
  • 双向控制消息。
  • 实时状态更新。
NOTE

WebSocket 只提供双向消息传输,并不规定 JSON-RPC 消息格式。可以在 WebSocket 上运行 JSON-RPC,也可以设计自己的消息格式。

四、stdio#

4.1 什么是 stdio?#

stdio 是 Standard Input / Output 的缩写,即标准输入输出。

在 Linux / Unix 系统中,一个普通进程通常会获得三个标准文件描述符:

名称文件描述符用途
stdin0标准输入
stdout1标准输出
stderr2标准错误输出

stdio 本身不是网络协议,而是操作系统提供给进程使用的标准输入输出接口。

两个本地程序可以通过 Pipe(管道)连接彼此的标准输入输出,实现进程间通信。

4.2 stdio 的通信原理#

假设有两个程序:

  • MCP Client
  • MCP Server

Client 创建 Server 子进程,并建立两个管道:

  1. Client 的输出连接 Server 的 stdin。
  2. Server 的 stdout 连接 Client 的输入。
MCP Client MCP Server
stdin <--------------------- stdout
stdout ---------------------> stdin

也可以理解为:

Client Server
写入请求 --------------------> stdin
读取请求
读取响应 <-------------------- stdout
写入响应

4.3 stdio 的实际通信过程#

假设 Client 启动一个 MCP Server:

Terminal window
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 用于输出日志和诊断信息。
WARNING

stdout 不能随意输出普通日志。因为 Client 会将 stdout 当作协议消息读取,额外的日志文本可能导致 JSON 解析失败。

日志应该写入 stderr。

NOTE

stdio 本质上是字节流,不能认为一次 Write 就对应一次 Read。MCP 的 stdio 传输采用一行一条 JSON 消息,以换行符作为消息分隔符。

4.5 stdio 在 Agent 系统中的应用#

例如,一个本地 Agent 需要调用文件系统 MCP Server:

Agent Host
|
| 创建子进程
v
MCP Server
|
| 读取本地文件
v
文件系统

适合:

  • 本地 MCP Server。
  • IDE 启动本地 Agent。
  • 本地开发工具集成。
  • 不需要远程访问的工具服务。

五、三种传输方式的区别#

对比HTTPWebSocketstdio
通信范围本地 / 网络本地 / 网络本地进程
通信模式请求—响应全双工通过管道双向传输
是否需要网络端口通常需要需要不需要
是否需要启动服务端进程通常需要需要通常由 Client 启动子进程
是否支持双向主动发送需要额外机制支持支持
连接形式请求连接,可复用持久连接管道
典型场景API、远程服务实时通信本地工具通信

如何选择?#

选择 HTTP:

  • 需要跨机器通信。
  • 需要提供标准 API。
  • 需要利用成熟的 HTTP 基础设施。

选择 WebSocket:

  • 需要持续双向通信。
  • 需要实时推送。
  • 需要频繁交换消息。

选择 stdio:

  • 两个程序运行在同一台机器。
  • Client 可以直接启动 Server。
  • 不需要网络访问和端口管理。

六、在 MCP、ACP、A2A 中的应用#

协议常见传输方式说明
MCPstdio、Streamable HTTP本地进程或远程服务
ACPstdioIDE 与 Agent 通过进程通信
A2AHTTP(S)、SSEAgent 之间远程任务通信
NOTE

需要注意:

  1. MCP 的 Streamable HTTP 可以使用 HTTP 请求和 SSE 流式响应,并不要求 WebSocket。
  2. ACP 常见实现采用 stdio,但不能将 ACP 与 stdio 画等号。
  3. A2A 的 HTTP 传输可以使用 SSE 提供任务状态和事件流。
  4. 传输方式与 JSON-RPC 是相互独立的概念,不同传输方式可以承载相同的消息协议。

七、核心总结#

可以用三句话记住:

  • HTTP: 客户端发起请求,服务端返回响应,适合 API 和网络服务。
  • WebSocket: 建立持久连接,双方随时发送消息,适合实时双向通信。
  • stdio: 利用操作系统的标准输入输出和管道,让本地进程直接交换数据。

整个 Agent 通信体系可以理解为:

应用层:MCP / ACP / A2A
|
消息层:JSON-RPC 2.0
|
传输层:HTTP / WebSocket / stdio
|
底层机制:TCP / Pipe / 操作系统进程接口

核心思想:传输层解决数据怎么到达对方,消息协议解决数据怎么表达,业务协议解决双方具体要做什么。

Agent 通信基础:HTTP、WebSocket 与 stdio 三种传输方式
https://blog.xqcherry.top/posts/ai/agent-transport-layer/
作者
xqcherry
发布于
2026-11-05
许可协议
CC BY-NC-SA 4.0