<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Anycast on </title>
    <link>/tags/anycast/</link>
    <description>Recent content in Anycast on </description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <lastBuildDate>Mon, 09 Mar 2026 08:00:00 +0800</lastBuildDate><atom:link href="/tags/anycast/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Homelab 实践笔记：聊聊 Cloudflare 这些能力背后的原理</title>
      <link>/posts/cloudflare-anycast-edge-protection-deep-dive/</link>
      <pubDate>Mon, 09 Mar 2026 08:00:00 +0800</pubDate>
      
      <guid>/posts/cloudflare-anycast-edge-protection-deep-dive/</guid>
      <description>引言 我在折腾 Homelab 时，经常会接触到 Cloudflare 这类边缘网络能力：动态公网 IP、源站暴露面、回源带宽压力，这些问题多少都会碰到。
这篇更像是一次学习笔记：结合公开资料和 Homelab 场景，梳理一下 Anycast、分层缓存、请求合并这些能力大致是怎么配合工作的。
第一关：流量是怎么“听话”地找到我家机房的？ Q1: Anycast 到底是怎么工作的？ A: 按 RFC 4786 的定义，Anycast（任播） 可以理解为：多个不同位置的节点对外提供同一个服务地址，流量由路由系统带到当前更“近”或更可达的那个节点。
PoP (Point of Presence) 可以理解成边缘接入点。当用户发起请求时，BGP 会根据当时的路由状态，把流量送到一个合适的 PoP。这里的“近”更多是路由意义上的近，不一定等同于地理距离最近。
Q2: 如果某个节点（PoP）突然“罢工”了怎么办？ A: 如果某个 PoP 不再对外宣告相关前缀，流量通常会重新收敛到其他仍然可达的节点。这也是 Anycast 常被用于提升可用性的原因之一。
不过这里也不宜说得太绝对：实际切换体验会受到上游网络、BGP 收敛和客户端所在网络环境影响，不同地区的感知可能并不完全一样。
第二关：面对 DDoS 这种“洪水”，它怎么玩“化骨绵掌”？ Q3: 面对大流量攻击，Anycast 的价值主要体现在哪？ A: 如果所有流量都直接打到家里的单个出口，风险会非常集中。Anycast 的一个核心价值，是把来自不同地区的流量先吸收到多个边缘节点，再结合边缘侧的过滤、限速和缓存能力，尽量减少单点承压。
我更愿意把它理解成“分散入口压力”的基础设施能力，而不是一句简单的“自动抗住所有攻击”。真正的防护效果仍然要看攻击类型、边缘策略和源站本身的承压方式。
第三关：为了保住我脆弱的小服务器，CF 操了多少心？ Q4: 流量进了机房，如果都往我家跑，我那点家宽上传也顶不住啊？ A: 如果边缘节点都直接回源，源站连接数和带宽压力会更高。分层缓存 (Tiered Cache) 的思路，是让下层节点优先向上层节点取内容，只有上层节点也没有缓存时，才真正回源。
从 Cloudflare 文档的描述看，这种方式可以减少能够直接访问源站的数据中心数量，也会减少源站需要维护的连接数。对于带宽和连接都比较紧张的 Homelab，这个思路是有参考价值的。
参考：Tiered Cache 官方文档 Q5: 遇到“瞬间洪峰”怎么办？比如我发个朋友圈突然火了？ A: 这类场景常被叫做缓存击穿：很多并发请求在同一时间发现缓存缺失，于是一起回源。
Cloudflare 文档里提到的 请求合并 (Request Collapsing)，可以理解为：在满足缓存条件时，把同一资源的并发请求尽量折叠起来，减少同时回源的数量。这里也需要注意边界：它不是对所有请求都生效，仍然受缓存头、请求方法和资源类型等条件影响。</description>
    </item>
    
  </channel>
</rss>
