聊聊MCP三种通信机制 —— 一场技术面试实录


1. 第一回合:MCP协议与通信机制概述

秋风:小哈,我看你简历上写了MCP Server开发经验,聊聊你对MCP的理解?

小哈:MCP就是一套给AI用的通信协议,主要解决以前AI想使用工具很困难的问题,之前AI想对接工具,不同的模型就得加不同的适配器,类似那个Function Calling,MCP出现后,就只需要按照MCP的方式将外部工具,数据源等封装好,各种大模型就能直接使用

秋风:那你说说MCP和大模型有哪几种通信协议?

小哈:(想了想)传输层目前有三种——stdio用于本地、HTTP+SSE用于远程、还有Streamable HTTP,不过SSE的方式已经要废弃了。

秋风:为什么要搞这么多种?

小哈:应用的场景不一样。比如你本地测试,在IDE插件跑在本地,用stdio最简单,部署更新都很方便;服务器或者云端部署就得走HTTP。这跟数据库连接似的,本地用socket、远程用TCP,原理差不多。


2. 第二回合:stdio机制深度剖析

秋风:那就从stdio开始,讲讲它的实现原理。

小哈:stdio本质上是进程间通信。Host把MCP Server当子进程启动,通过管道传数据。

秋风:数据流向呢?

小哈:Server从stdin读请求,往stdout写响应。 请求路径大致这样的:Host → Server进程的 stdin → Server(读取并处理) 响应路径:Server → Server进程的 stdout → Host(读取并解析)

秋风:遇到过什么典型问题没有?

小哈:有,估计使用过的人都有过,我之前调试的时候往stdout打了个debug日志,结果整个Server直接崩了。调查后发现,所有日志必须走stderr,stdout只能有JSON消息,任何其它格式数据都不支持。


3. 第三回合:SSE废弃与Streamable HTTP革新

秋风:你之前说过三种方式,还提到了SSE被废弃了,那说说你对SSE被废弃的理解吧。

小哈:SSE长连接会中断,这是它的硬伤。我们知道SSE是三次握手连接的,也就是双通道架构的设计。为啥会中断呢? 比如我们的客户端发送POST请求到/messages,服务器接收请求后,通过SSE长连接持续推结果。问题是,一但超时,例如请求设置的超时、公司防火墙超时等,动不动就断。 其它问题还有资源效率低下高并发情况内存占用过高

秋风:那换成Streamable HTTP的好处是什么?

小哈:Streamable HTTP,它对外宣传的核心思想:“一个连接,一个请求,按需流式”。

秋风:具体说说看

小哈一个连接指的它废弃了双通道,每个MCP工具调用都使用一个独立的、短暂的TCP/HTTP连接 一个请求则是它能同时处理GET和POST,所有通信——无论是普通请求、流式响应还是服务器通知——都合并到单个端点(如 /mcp),简单来说,以前的“一发一收”是两个HTTP交互,现在同时处理后就变成了“一发一收”一个HTTP交互。 按需流式则是服务器返回时,会一次次的返回流式响应,数据会一块一块的按需发送过来。按需还有一层还是,就是智能决定返回内容,如果生成数据量小则一次发送,否则流式持续发送。

秋风:相较于SSE还有什么好处吗?

小哈:效率差距也很大。延迟和内存方面都有优势、还支持断线重连,是通过Last-Event-ID实现的。


4. 收尾:消息格式与错误处理机制

秋风:前面聊了三种传输方式的原理,最后在深入一点,讲讲消息的传输机制吧。

小哈:好的,它们通信的"语法"都是JSON-RPC 2.0协议。不过要它们在传输时数据“打包”方式不一样。stdio采用换行分隔,一行一个完整JSON;

秋风:那Streamable HTTP的流式响应呢?

小哈:流式的时候Content-Type变成text/event-stream,每个事件用data:前缀,双换行分隔。

秋风:连接异常怎么处理?

小哈:stdio要监听子进程的exit事件,挂了就重启。Streamable HTTP相对好处理,HTTP本身就是无状态的,断了重连就行,通过Mcp-Session-Id能恢复会话上下文。

秋风:本地调试的时候有什么技巧?

小哈:stdio我一般用MCP Inspector,能抓到stdin/stdout的原始报文。Streamable HTTP就用普通的抓包工具,我用的是Fiddler。还有个小技巧,开发时把日志级别调到debug,把完整的JSON-RPC消息打出来,排查问题快很多。

秋风:行,基础扎实,这些细节也清楚。今天就到这儿。

小哈:谢谢秋风哥。


5. 总结

三种通信机制对比

三种选型

  • 本地场景 → 选stdio,零网络开销,调试方便

  • 远程场景 → 选Streamable HTTP,延迟低(~7.5ms),防火墙友好

  • 存量SSE系统 → 用mcp-remote适配器过渡,尽快迁移

内容要点

  1. 消息格式:统一JSON-RPC 2.0,HTTP用标准Body

  2. 日志规范:stdio模式下,日志必须走stderr,stdout只放JSON-RPC消息

  3. 连接管理:stdio监听进程退出重启,Streamable HTTP通过“Mcp-Session-Id”自动重连

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐