[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fgQ09IuGOWjIfifg2o8CZUi8J5eDrS0tZM70CVfpmg5c":3,"$f6pZNJVwZwcwIbs39OPIvcm2G-_1SA3y1uehtcuctarw":34},[4],{"id":5,"type":6,"title":7,"slug":8,"summary":9,"body":10,"coverUrl":11,"productScreenshots":12,"productLinks":13,"authorName":14,"authorUrl":15,"authorSubject":16,"category":17,"tags":18,"sourceLabel":17,"sourceName":17,"sourceUrl":17,"status":27,"seoTitle":17,"seoDescription":17,"canonicalUrl":17,"isFeatured":28,"sno":29,"sortOrder":30,"publishedAt":31,"updatedAt":32,"createdAt":33},"88e5ea58-d373-46ae-8ed1-ba0abf2a11b2","article","HTTP\u002F3 与 QUIC：为什么互联网要把传输层重造一遍","http3-quic-explained","地铁里信号时好时坏，视频却还能续上——一部分功劳属于 HTTP\u002F3 和它脚下的 QUIC。","你在地铁里刷视频，信号时好时坏，画面却还能勉强续上；而几年前同样的网络下，网页可能直接卡死。\n\n这背后的一部分功劳，属于一个重造了互联网传输底层的协议——HTTP\u002F3，以及它脚下那块新地基 QUIC。本文用最直白的方式，讲清它们为什么要「重造轮子」，以及带来了什么。\n\n## 老协议的「队头阻塞」\n\n先说清概念。你访问网页时，数据要经过「传输层协议」来保证可靠送达。几十年来这一层用的是 TCP。TCP 很可靠，但有个老毛病叫「队头阻塞」（head-of-line blocking）：数据被拆成一个个包按顺序传，只要中间有一个包丢了，后面的包即使已经到了，也得排队等它重传——就像一列纵队里第一个人摔倒，后面所有人都得停下。\n\n在网络不稳定（丢包多）的移动场景下，这个问题尤其致命。HTTP\u002F2 虽然能在一个连接里并行传多个请求，但它仍然跑在 TCP 上，一个包丢失会拖累这个连接上的所有请求。\n\n## QUIC：在 UDP 上重建可靠传输\n\nHTTP\u002F3 的关键，是换掉了脚下的地基：它不再用 TCP，而是用一个叫 **QUIC** 的新协议，QUIC 建立在 UDP 之上。UDP 本身不保证可靠，但 QUIC 在它上面重新实现了可靠传输，并顺手解决了老问题：\n\n- **消除队头阻塞**：QUIC 把不同的请求放进各自独立的「流」（stream），一个流丢包只影响它自己，不拖累其它流。\n- **连接建立更快**：QUIC 把加密（TLS）和连接握手合并，减少往返次数，首次连接更快，重连甚至可以「0-RTT」几乎瞬间恢复。\n- **连接迁移**：连接由一个独立的「连接 ID」标识，而不绑定你的 IP。所以你从 Wi-Fi 切到 4G，连接不会断——这正是地铁里视频能续上的原因。\n\n```mermaid\nflowchart TD\n    A[HTTP\u002F3 请求] --> B[QUIC 协议]\n    B --> C[UDP]\n    B --> D[独立的多条 Stream]\n    D --> E[某条流丢包\u003Cbr\u002F>只重传该流]\n    D --> F[其它流照常推进\u003Cbr\u002F>无队头阻塞]\n    B --> G[连接 ID 标识\u003Cbr\u002F>Wi-Fi↔4G 不断线]\n```\n\n## 该怎么用\n\n好消息是：绝大多数情况下，你几乎不用改业务代码。HTTP\u002F3 主要在「基础设施层」启用——CDN、反向代理（如 Nginx、Caddy）、云负载均衡器开启支持即可，浏览器会自动协商使用。\n\n以 Caddy 为例，它默认就支持 HTTP\u002F3，几乎零配置：\n\n```caddyfile\nexample.com {\n    reverse_proxy localhost:8080\n    # Caddy 默认自动启用 HTTP\u002F3（基于 QUIC \u002F UDP 443）\n}\n```\n\n要让它生效，记得在防火墙\u002F安全组放行 **UDP 443**（而不只是 TCP 443）——这是最常见的「开了却没生效」的坑。浏览器首次仍可能走 HTTP\u002F2，随后通过 `Alt-Svc` 响应头得知服务端支持 HTTP\u002F3，再自动升级。\n\n## 取舍与边界\n\n- **UDP 可能被拦**：部分企业网络或老旧设备会限制 UDP，此时会自动回退到 HTTP\u002F2，属正常降级。\n- **CPU 开销**：QUIC 的加密和拥塞控制在用户态实现，早期 CPU 占用偏高，近年已大幅优化，但高流量服务仍要评估。\n- **收益看场景**：在稳定的有线网络里，HTTP\u002F3 相比 HTTP\u002F2 的提升未必明显；它的优势在**弱网、高丢包、移动**场景最突出。\n- **它是传输层升级**：解决的是「怎么把数据更快更稳地送到」，不改变你的应用逻辑。\n\n## Tips\n\n- 面向移动端或全球用户的服务，优先在 CDN \u002F 反向代理层开启 HTTP\u002F3。\n- 开启后务必放行 UDP 443，否则会「配置了却回退到 HTTP\u002F2」。\n- 别期待有线稳定网络下有巨大提升，它的主场是弱网和移动场景。\n- 保留 HTTP\u002F2 作为回退，兼容那些屏蔽 UDP 的网络环境。\n- 记住三大红利：消除队头阻塞、更快建连、Wi-Fi 与蜂窝切换不断线。","https:\u002F\u002Fimages.unsplash.com\u002Fphoto-1451187580459-43490279c0fa?w=1200",[],[],"Foundit AI","https:\u002F\u002Ffoundit.cn","f39339b1-aaa6-4e86-b0c2-a6e6a21113b5",null,[19,23],{"id":20,"name":21,"slug":22},"7c76bfc2-f80f-4ee0-a95d-27bd8708b434","技术","slug",{"id":24,"name":25,"slug":26},"4c2bbea6-eab7-40a8-8447-1de478ff7749","分析","analyse","published",false,76,0,"2026-07-19T00:00:00.000Z","2026-07-20T01:08:35.440Z","2026-07-19T17:10:58.328Z",[35,61,80],{"id":36,"type":6,"title":37,"slug":38,"summary":39,"body":40,"coverUrl":41,"productScreenshots":42,"productLinks":43,"authorName":14,"authorUrl":44,"authorSubject":16,"category":45,"tags":50,"sourceLabel":17,"sourceName":17,"sourceUrl":17,"status":27,"seoTitle":17,"seoDescription":17,"canonicalUrl":17,"isFeatured":28,"sno":57,"sortOrder":30,"publishedAt":58,"updatedAt":59,"createdAt":60},"544fc658-c911-4de6-93b0-d2520087119a","MCP：AI 的「USB-C」时刻","mcp-ai-usb-c-moment","以前每个 AI 应用都要为 GitHub、数据库、日历各写一套私有连接器，这是 M×N 的集成噩梦，直到 MCP 的出现","如果你用过笔记本电脑，一定熟悉那种「每个设备一根专属线」的烦躁：鼠标一个接口、打印机另一个、硬盘又一个。2025 年之前的 AI 应用，几乎就是这种状态——想让一个助手同时读你的代码仓库、查数据库、发日历邀请，开发团队得为每一个系统写一套私有「连接器」，又脆又难维护。\n\n## 背景：每个 Agent 都曾是孤岛\n\n大模型本身只会「说话」，它要真正干活，得去调工具、读数据。在 MCP（Model Context Protocol，模型上下文协议）出现之前，这套对接是组合爆炸：假设市面上有 M 个 AI 客户端、N 个工具，开发者就要写 M×N 套集成。一个代码助手要读 Git、查 Jira、搜文档，就得维护三条互不相通的管线。\n\n更糟的是，这些连接器大多只服务某一个产品，换个助手就得重写。结果就是：每个 Agent 都困在自己的小岛上，能力被锁死在少数几个硬编码的集成里。\n\n## MCP 是什么：AI 世界的「USB-C」\n\n2024 年底，Anthropic 发布了 MCP。它的目标很朴素：给「AI 连工具」定义一个统一接口，就像 USB-C 给「设备连外设」定义统一接口一样。\n\n打个比方——如果大模型是大脑，那 MCP 就是手。大脑再聪明，没有手也打不开文件、点不了按钮、查不了数据库。MCP 让任意符合规范的「大脑」（Claude、ChatGPT、Gemini、Cursor、VS Code Copilot）都能使用任意符合规范的「手」（一个封装好的工具服务），而且不用为每个组合单独适配。\n\n2025 年 12 月，Anthropic 把 MCP 捐给了 Linux 基金会，OpenAI、Google、Microsoft 作为联合发起人。到 2026 年，它的 SDK 月下载量超过 9700 万次，ChatGPT、Claude、Gemini 都支持同一个协议——某种意义上，这场标准之战已经赢了。\n\n## 它是怎么运作的：三层结构\n\nMCP 把「连工具」拆成三个角色，理解这三层就理解了全部：\n\n- **Host（宿主）**：你直接使用的应用，比如 Claude 桌面端、VS Code、一个自定义聊天机器人。\n- **Client（客户端）**：住在 Host 内部、专门负责管理 MCP 连接的小组件。\n- **Server（服务端）**：一个轻量程序，把某个能力「暴露」出来，比如一个 GitHub 服务、一个数据库查询服务。\n\n每个 Server 通过三种「原语」提供能力：`Tools`（AI 可以调用的可执行函数，如 `create_issue`）、`Resources`（AI 可以读取的数据，如文件内容、数据库表结构）、`Prompts`（可复用的提示词模板）。它们底层用 **JSON-RPC**（一种简单的远程调用格式）通信，远程服务走 HTTP 传输，本地服务走标准输入输出。\n\n整个调用流程是这样的：\n\n```mermaid\nflowchart LR\n    U[用户] --> H[Host 应用\u003Cbr\u002F>Claude \u002F Cursor \u002F VS Code]\n    H --> C[MCP Client\u003Cbr\u002F>连接管理器]\n    C -->|JSON-RPC| S1[MCP Server: GitHub]\n    C -->|JSON-RPC| S2[MCP Server: 数据库]\n    C -->|JSON-RPC| S3[MCP Server: 天气 API]\n    S1 --> D1[(代码仓库)]\n    S2 --> D2[(业务数据)]\n    S3 --> D3[(外部 API)]\n```\n\n关键点在于：Host 只要实现一次 Client 协议，Server 只要实现一次 Server 协议，从此任意 Host 能连任意 Server。集成成本从 M×N 降到了 M+N。\n\n## 一个最小可运行的例子\n\n下面用官方 Python SDK 写一个「天气查询」MCP 服务，只暴露一个工具：\n\n```python\nfrom mcp.server.fastmcp import FastMCP\n\nmcp = FastMCP(\"weather\")  # 服务名叫 weather\n\n@mcp.tool()\ndef get_weather(city: str) -> str:\n    \"\"\"查询某城市的天气（示例返回静态数据）\"\"\"\n    return f\"{city} 今天晴，25°C。\"\n\nif __name__ == \"__main__\":\n    mcp.run()  # 默认以 stdio 方式启动，等待 Host 来连\n```\n\n运行前只需 `pip install mcp`，然后用任意支持 MCP 的客户端（Claude 桌面端、Cursor 等）配置这个服务路径即可。AI 在对话里说「查下北京天气」，客户端就会通过 MCP 调用 `get_weather(\"北京\")`，拿到结果再组织成自然语言回答你。注意：这只是最小骨架，真实服务里要把静态返回值换成真正的天气 API 调用。\n\n## 取舍与边界：它解决了什么，没解决什么\n\nMCP 解决的是「连接标准」问题，但它不是银弹：\n\n- **它让集成变简单，但不保证工具安全。** 一个 MCP Server 可以是任何人所写，工具描述会直接喂给模型。如果 Server 既能读私有数据、又能访问不可信内容、还能对外发消息，就构成了安全风险（业界称之为「致命三件套」）。企业通常会加一层 **Gateway（网关）** 来做鉴权和审计——Uber、Amazon 都用了这种「网关 + 注册表」的控制平面。\n- **上下文膨胀是个真问题。** 接的 Server 一多，工具定义会塞满模型的上下文窗口。2026 年的常见解法是「按需加载」：只把当前 Agent 真正需要的工具暴露出来，而不是一次全塞进去。\n- **它定义「怎么连」，不定义「连上去说什么」。** 多 Agent 之间的协作语义，由另一套协议 A2A（Agent-to-Agent）负责——MCP 接工具，A2A 连同伴。\n\n## Tips\n\n- 下次看到「AI 连不上我的系统」，先问：有没有现成的 MCP Server？多数数据库、SaaS、开发工具都已有官方或社区实现。\n- 想自己动手：用官方 SDK（Python\u002FTypeScript 等）把内部的一个 API 包成 MCP Server，比写一套专属集成快得多。\n- 评估风险时记住三件事：私有数据、不可信输入、对外通信，三者叠加要格外小心，尽量放进网关管控。\n- 分清两层协议：接工具看 MCP，多 Agent 协作看 A2A，别混为一谈。\n- 把 MCP 当「基础设施」而非「功能」：它赢是因为无聊、通用、可复用，这正是它值得长期投入的原因。","https:\u002F\u002Foxqtewbrpuiouqqjrvdv.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fpublic-media\u002F2026-07-19\u002Fc3c06d99-a0ac-40ac-a283-7e77aabb4c4c.jpg",[],[],"https:\u002F\u002Ffoundit.cn\u002Fabout",{"id":46,"name":47,"slug":48,"description":49},"6179d3b6-dc34-4483-9ded-3cd9f1b37a47","科普","abbreviation","介绍各领域新兴概念",[51,55,56],{"id":52,"name":53,"slug":54},"a202d639-99a6-488a-a712-4d4c6ffd7e15","开发","dev",{"id":20,"name":21,"slug":22},{"id":24,"name":25,"slug":26},46,"2026-07-20T00:00:00.000Z","2026-07-19T17:39:20.060Z","2026-07-19T16:13:40.316Z",{"id":62,"type":6,"title":63,"slug":64,"summary":65,"body":66,"coverUrl":67,"productScreenshots":68,"productLinks":69,"authorName":14,"authorUrl":15,"authorSubject":16,"category":70,"tags":71,"sourceLabel":75,"sourceName":17,"sourceUrl":17,"status":27,"seoTitle":17,"seoDescription":17,"canonicalUrl":17,"isFeatured":28,"sno":76,"sortOrder":30,"publishedAt":77,"updatedAt":78,"createdAt":79},"74dedc2e-6a66-4481-aef2-5cffc3ba338d","嵌入模型（Embeddings）：向量数据库能搜「意思」，全靠它","embedding-models-vector-search","向量库怎么懂「意思相近」？靠嵌入模型把文字变成向量。本文讲清它的工作原理、余弦相似度检索，给出 sentence-transformers 最小示例，以及模型选型、维度统一、中英差异等取舍。","你让向量库「找意思相近的句子」，它怎么懂「意思」？靠嵌入模型（Embeddings）：把文字变成一串数字（向量），意思越近，数字越近。它是语义搜索和 RAG 真正的地基——没有它，模型只能靠关键词硬匹配。\n\n## 为什么需要嵌入\n\n传统搜索靠关键词匹配，搜「怎么给猫降温」找不到「猫咪中暑怎么办」。嵌入把文本映射到向量空间，把相近语义聚在一起，才能按「意思」而不是「字面」检索。\n\n## 它是怎么工作的\n\n嵌入模型（如 BGE、OpenAI text-embedding）是个神经网络，把变长文本压成定长向量（常见 768 或 1536 维）。训练目标是「语义相近的文本，向量距离小」。检索时把 query 也编码，算余弦相似度，找最近的那些。\n\n```mermaid\nflowchart LR\n    A[文本] --> B[嵌入模型]\n    B --> C[向量]\n    C --> D[存入向量库]\n    E[查询] --> B\n    D --> F[相似度检索]\n    B --> F\n    F --> G[返回相近文本]\n```\n\n## 取舍与边界\n\n- **模型要选对**：通用嵌入未必适合你的领域（法律、医疗），必要时用领域数据微调。\n- **维度与成本权衡**：维度越高通常越准，但存储、检索都更贵更慢，按场景取舍。\n- **中英文差异**：混用中英文语料要选多语言模型，否则跨语言检索会崩。\n- **维度必须统一**：检索和入库一定要用同一个模型、同一维度，否则向量不可比，检索全乱。\n\n## Tips\n\n- 任何「按意思搜」的需求，第一步就是选好嵌入模型。\n- 中文场景优先试 BGE、m3e 等多语言\u002F中文模型，别直接套英文默认。\n- 入库和检索用同一模型同一维度，这是铁律。\n- 领域强相关的语料，用该领域样本微调嵌入，召回率提升明显。\n- 嵌入质量直接决定 RAG 上限，值得在它上面多花时间。","https:\u002F\u002Foxqtewbrpuiouqqjrvdv.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fpublic-media\u002F2026-07-22\u002Facd40af8-276a-48bc-8d62-dcd52c124590.jpg",[],[],{"id":46,"name":47,"slug":48,"description":49},[72,73,74],{"id":24,"name":25,"slug":26},{"id":20,"name":21,"slug":22},{"id":52,"name":53,"slug":54},"资料来源",68,"2026-07-22T00:00:00.000Z","2026-07-23T01:16:32.032Z","2026-07-20T10:23:37.966Z",{"id":81,"type":6,"title":82,"slug":83,"summary":84,"body":85,"coverUrl":86,"productScreenshots":87,"productLinks":88,"authorName":14,"authorUrl":15,"authorSubject":16,"category":89,"tags":90,"sourceLabel":75,"sourceName":17,"sourceUrl":17,"status":27,"seoTitle":17,"seoDescription":17,"canonicalUrl":17,"isFeatured":28,"sno":94,"sortOrder":30,"publishedAt":77,"updatedAt":95,"createdAt":96},"8f7ce6a9-492b-4b45-afa4-d16905cc3b65","边缘函数：把代码跑在全球服务器","edge-functions","不想租服务器管运维？边缘函数把代码自动部署到全球几百个节点，毫秒级就近执行。","传统后端要你租服务器、装环境、管扩容、防宕机，一件小事背后是一整套运维。边缘函数（Edge Functions）把这件事彻底简化：你只写一段代码，平台把它自动部署到全球几百个节点，用户请求落到离他最近的那个，毫秒级响应，没有常驻服务器，也不用你管。Cloudflare Workers、Deno Deploy 是其中的代表。\n\n## 背景：为什么需要「边缘」\n\n用户在上海，服务器在美东，一次请求要跨半个地球来回，延迟动辄几百毫秒。把计算挪到离用户近的地方，是提速最直接的一招。边缘函数的思路是：不让你管服务器，而是把函数代码分发到全球边缘节点，在每个节点上按需、瞬时执行。\n\n## 它长什么样\n\n以 Cloudflare Workers 为例，一个函数就是一个 `fetch` 事件处理器，部署后立刻获得一个全球 URL：\n\n```javascript\nexport default {\n  async fetch(request) {\n    const url = new URL(request.url);\n    if (url.pathname === \"\u002Fhello\") {\n      return new Response(\"来自边缘的问候\");\n    }\n    return new Response(\"Not found\", { status: 404 });\n  }\n}\n```\n\n你 `deploy` 一下，这段代码就跑在了全球几百个数据中心，谁访问谁就近执行。\n\n## 一次请求怎么走\n\n```mermaid\nflowchart LR\n    A[用户 上海] --> B[最近边缘节点]\n    C[用户 纽约] --> D[最近边缘节点]\n    B --> E[你的函数代码 就近执行]\n    D --> E\n    E --> F[返回结果 毫秒级]\n```\n\n## 取舍与边界\n\n- **冷启动极快**：边缘函数通常是轻量隔离（如 V8 Isolate），启动以毫秒计，远快于传统容器。\n- **运行时受限**：为了快和轻，边缘环境不是完整 Node.js，部分 API（如某些文件系统、原生模块）不可用，写代码要适配。\n- **有状态数据要外置**：函数本身无状态、可能随时在哪个节点跑，数据库\u002F缓存要走外部服务（如边缘 KV）。\n- **适合「薄」逻辑**：鉴权、改写、A\u002FB、转发、轻计算最合适；重 CPU 或长任务仍交给中心化服务。\n\n## Tips\n\n- 入门只要写一个 `fetch` 处理器，二十行代码就能上线一个全球接口。\n- 适合做鉴权中间件、请求改写、A\u002FB 分流、轻量 API 网关。\n- 有状态数据（会话、计数）用平台提供的边缘 KV，别指望函数本地存。\n- 注意运行时差异：别用边缘不支持的 Node API，部署前本地跑一遍。\n- 重活（大模型推理、大计算）留给中心服务，边缘只做「快而薄」的那一层。","https:\u002F\u002Foxqtewbrpuiouqqjrvdv.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fpublic-media\u002F2026-07-22\u002F4e66dabf-7f69-4ba0-b66d-12774273f763.jpg",[],[],{"id":46,"name":47,"slug":48,"description":49},[91,92,93],{"id":20,"name":21,"slug":22},{"id":52,"name":53,"slug":54},{"id":24,"name":25,"slug":26},69,"2026-07-22T06:38:22.660Z","2026-07-20T01:11:48.654Z"]