目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构概述
  5. 详细组件分析
  6. 依赖分析
  7. 性能考虑
  8. 故障排除指南
  9. 结论

简介

本文档系统化地记录了Streamable HTTP协议的会话与连接管理功能。详细说明了MCP_SESSION_ID_HEADER在会话标识中的作用,以及服务端如何通过该头信息进行会话验证和路由。解析了DELETE请求用于显式会话终止的实现机制,包括404状态码在会话过期后的应用。阐述了客户端StreamableHTTPTransport如何维护和更新会话ID,并在后续请求中自动注入。通过交互时序图展示了完整的会话生命周期:从初始化请求建立会话,到GET/POST请求维持连接,最终通过DELETE请求终止会话。提供了会话管理的最佳实践,包括会话超时处理和错误恢复策略。

项目结构

本项目采用分层架构设计,主要分为客户端、服务端和共享模块三个部分。客户端模块位于src\mcp\client目录下,包含streamable_http.py等文件,负责实现客户端的会话管理功能。服务端模块位于src\mcp\server目录下,包含streamable_http.py等文件,负责处理会话验证、路由和终止等操作。共享模块位于src\mcp\shared目录下,包含session.py等文件,提供跨客户端和服务端的会话管理基础功能。示例服务器位于examples\servers\simple-streamablehttp目录下,用于演示会话管理的实际应用。

共享模块
服务端
客户端
BaseSession
StreamableHTTPServerTransport
StreamableHTTPTransport

图示来源

章节来源

核心组件

系统的核心组件包括客户端的StreamableHTTPTransport、服务端的StreamableHTTPServerTransport和共享的BaseSession。StreamableHTTPTransport负责客户端的会话管理,包括会话ID的维护和在请求中自动注入。StreamableHTTPServerTransport负责服务端的会话验证、路由和终止,通过MCP_SESSION_ID_HEADER进行会话标识。BaseSession提供跨客户端和服务端的会话管理基础功能,包括请求/响应链接、通知和进度跟踪。

章节来源

架构概述

系统采用客户端-服务端架构,通过HTTP协议进行通信。客户端使用StreamableHTTPTransport管理会话,服务端使用StreamableHTTPServerTransport处理会话相关操作。会话管理基于HTTP头信息,特别是MCP_SESSION_ID_HEADER和MCP_PROTOCOL_VERSION_HEADER。会话生命周期包括初始化、维持和终止三个阶段,通过POST、GET和DELETE请求分别实现。

"客户端" "服务端" POST /mcp (初始化) 200 OK + MCP_SESSION_ID_HEADER GET /mcp (维持连接) SSE流 DELETE /mcp (终止会话) 200 OK "客户端" "服务端"

图示来源

详细组件分析

客户端会话管理分析

客户端通过StreamableHTTPTransport类管理会话。该类维护一个会话ID,并在每次请求中自动注入MCP_SESSION_ID_HEADER头信息。会话ID在初始化请求的响应中获取,并在后续请求中使用。

客户端会话管理类图
"使用"
StreamableHTTPTransport
+str session_id
+str protocol_version
+__init__(url : str, headers : dict[str, str] | None, timeout : float | timedelta, sse_read_timeout : float | timedelta, auth : httpx.Auth | None) : None
+_prepare_request_headers(base_headers : dict[str, str])
+_maybe_extract_session_id_from_response(response : httpx.Response) : None
+get_session_id()
+terminate_session(client : httpx.AsyncClient) : None
RequestContext
+httpx.AsyncClient client
+dict[str, str] headers
+str | None session_id
+SessionMessage session_message
+ClientMessageMetadata | None metadata
+StreamWriter read_stream_writer
+float sse_read_timeout

图示来源

服务端会话管理分析

服务端通过StreamableHTTPServerTransport类管理会话。该类负责验证会话ID、处理会话终止请求,并在会话过期后返回404状态码。

服务端会话管理类图
"使用"
StreamableHTTPServerTransport
+str | None mcp_session_id
+bool is_json_response_enabled
+EventStore | None _event_store
+__init__(mcp_session_id : str | None, is_json_response_enabled : bool, event_store : EventStore | None, security_settings : TransportSecuritySettings | None) : None
+_get_session_id(request : Request)
+_validate_session(request : Request, send : Send) : bool
+_handle_delete_request(request : Request, send : Send) : None
+terminate() : None
EventStore
+store_event(stream_id : StreamId, message : JSONRPCMessage) : EventId
+replay_events_after(last_event_id : EventId, send_callback : EventCallback)

图示来源

会话生命周期时序图

"客户端" "服务端" POST /mcp (初始化请求) 200 OK + MCP_SESSION_ID_HEADER 会话建立 GET /mcp (建立SSE连接) SSE流 (服务器发起的消息) 连接维持 POST /mcp (后续请求) 响应 (通过SSE或JSON) DELETE /mcp (终止会话) 200 OK 会话终止 POST /mcp (使用已终止的会话ID) 404 Not Found 会话过期 "客户端" "服务端"

图示来源

章节来源

依赖分析

系统的主要依赖关系如下:客户端的StreamableHTTPTransport依赖于共享的BaseSession进行会话管理;服务端的StreamableHTTPServerTransport也依赖于BaseSession;客户端和服务端都依赖于HTTPX库进行HTTP通信。测试代码依赖于requests库进行集成测试。

StreamableHTTPTransport
BaseSession
StreamableHTTPServerTransport
HTTPX
测试代码
requests

图示来源

章节来源

性能考虑

会话管理对系统性能有重要影响。客户端需要维护会话ID并在每次请求中注入,增加了少量开销。服务端需要验证会话ID,这涉及到字符串比较操作。SSE流的维持需要保持连接打开,可能会消耗服务器资源。建议合理设置会话超时时间,及时清理无效会话,以优化资源使用。

故障排除指南

常见问题包括会话ID无效、协议版本不匹配和连接超时。对于会话ID无效问题,检查客户端是否正确维护和注入会话ID。对于协议版本不匹配,确保客户端和服务端使用兼容的协议版本。对于连接超时,检查网络状况和服务器负载。测试代码中包含多个测试用例,可用于验证会话管理功能的正确性。

章节来源

结论

本文档详细记录了Streamable HTTP协议的会话与连接管理功能。通过分析客户端、服务端和共享模块的实现,阐述了会话ID的管理、验证和终止机制。提供了完整的会话生命周期时序图,帮助理解各组件的交互过程。建议在实际应用中遵循最佳实践,合理管理会话生命周期,以确保系统的稳定性和性能。

Logo

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

更多推荐