我家楼下有家火锅店,生意一直火爆,直到某天出了怪事:正赶饭点,呼啦啦涌进来一群人,不点菜、不喝水,占着座位刷手机,还有人故意堵在门口排队。真正的顾客被挡在外面进不来,后厨的菜一盘盘炒好却送不出去,店长急得直跺脚。更诡异的是,这些人像约好了似的,分拨从不同方向涌来,查不出谁是领头。这种“挤店”攻击,就是互联网世界的 DDoS(分布式拒绝服务攻击):攻击者操纵成千上万台被植入木马的“肉鸡”电脑,同时向一家网站发起请求,把它的带宽、连接、处理器资源全部耗尽,让正常用户无法访问。好消息是,对付“挤店”有一套成熟的四件套:门口加保安(流量清洗)识别坏人、限时放行(速率限制)控制进门速度、多开分店(Anycast 分流)摊薄人流、生意太好就扩张后厨(弹性扩容)提升容量。这篇文章就用这套“防挤店”方法论,带你把 DDoS 的常见手法、检测手段和层层防御的部署思路拆个明明白白。
对 AI 从业者而言,理解 DDoS 防御是保障模型推理服务与训练集群高可用的基本功;掌握流量清洗、速率限制与弹性扩容的协同设计,能显著提升生产系统的鲁棒性与稳定性。
目录
可视化演示
演示DDoS攻击分类、多层防御架构和流量清洗过程,三种模式交互切换。
本节配有交互动效(进入视口后自动加载,约 3KB)。
DDoS三大攻击类型 流量型:UDP洪泛+DNS放大,耗尽带宽 协议型:SYN洪泛,耗尽半连接队列 应用层:HTTP洪泛+Slowloris,耗尽资源 三类攻击分别针对带宽、协议栈和应用资源
攻击原理:为什么“挤店”能搞垮一家店
恶意顾客的手法其实很简单:不点菜、不结账,就是占着座位和过道,让真正的食客没地方坐。他们的可怕之处不在个人,而在“量大”——一个人来无所谓,一万个人同时挤进来,店就瘫了。DDoS 攻击的底层逻辑与此完全一致:攻击者预先控制大量“肉鸡”(被植入木马的联网设备),在约定时刻让它们同时向目标服务器发起请求。这些请求不是来“消费”的,而是来占坑的。
从技术视角看,任何服务都有容量上限 C:带宽(门口马路的宽度)、半连接队列(服务员手里的等位本)、CPU 与内存(后厨的炉灶)。攻击流量 V_attack 叠加在正常流量 V_normal 之上,一旦总量逼近甚至超过 C,服务就进入“饱和”状态,新请求被拒之门外,老请求也被拖得极慢。
这样再看“挤店”就清晰了:它本质不是入侵(没有破门盗取),而是耗尽——把容量 C 撑满,让系统在机制上主动拒绝所有来客,包括真正的顾客。带宽、连接、处理器,三样里只要有一项被打满,整条服务链都会跟着瘫痪,这正是 DDoS 最阴险的地方。
- 分子总流量:将正常流量与攻击流量相加,得到单位时间进入系统的全部请求量
- 分母系统容量:C 是系统能承载的最大请求量,超过它就会出现排队与丢弃
- 比值判定过载S 大于 1 表示需求超过供给,系统进入饱和状态,服务不可用
常见手法:恶意顾客的三种“配方”
挤店也有不同流派:有人堵门(打带宽),有人缠着服务员聊天不点菜(占连接),还有人把菜单翻来覆去却不下单(耗应用逻辑)。对应到 DDoS 世界,就是三类招牌手法。第一种是 SYN 洪泛:攻击者伪造海量“握手请求”发给服务器,只发 SYN 包却从不完成三次握手,服务器的半连接队列(等位本)被占满,正常用户握不上手,只能干等。第二种是放大攻击:攻击者把源 IP 伪造成受害者的地址,向 DNS、NTP 等公共服务器发送很小的查询,这些服务器会把大得多的响应包“反射”到受害者头上,小流量瞬间被放大几十上百倍。
第三种是 HTTP 洪泛,专打应用层:攻击者发送大量看似正常的 GET/POST 请求,或者把请求速度压到极慢,占住后端的连接线程不放,让 Web 服务器疲于应付。放大攻击的“威力”可以用公式估算:
知道“配方”才好对症下药:SYN 洪泛靠清洗层的连接代理与 SYN Cookie 化解,放大攻击靠关闭开放解析器与近源过滤抑制,HTTP 洪泛靠限流与挑战应答拦截。如同老中医先辨证再开方,防御 DDoS 的第一步永远是识别对方用的是哪一路“挤店拳法”。
- 反射器数量n 表示攻击者可利用的开放反射服务器总数,例如开放的 DNS 解析器
- 单台放大倍数每台反射器对查询的响应放大倍数 A_i,DNS 可达几十倍
- 累加求和把所有反射器贡献的放大流量加总,得到汇聚到受害者的总攻击带宽
检测识别:从嘈杂人声中认出“挤店团伙”
火锅店的老保安有个绝活:干了十年,眼睛一瞟就知道今天人流正不正常——平时饭点排队二十桌,今天突然排到路口拐角,那一定有问题。DDoS 检测也是一样的思路,只不过把保安的“经验直觉”换成了可量化的统计学指标。核心概念叫流量基线:系统持续记录历史流量,算出平均值 μ 和波动幅度 σ,这两个数字就相当于“平时这个点应该有几十人、波动不超过几个人”的经验值。
一旦当前流量 x 明显偏离基线,检测系统就拉响告警。最常用的度量是 Z 分数,它表示“当前值比平均值高出了几个标准波动”:
检测的意义在于“抢时间”。攻击流量从发起到达峰往往只有几十秒,早一分钟发现,清洗和限流就能早一分钟生效。保安的直觉被量化成 Z 分数和 DPI 规则后,就能交给机器 7×24 小时盯着大门口,一有异动立刻喊人。
- 偏离量计算用当前观测值减去基线均值,得到“多了多少”的绝对偏离
- 按波动归一化除以标准差 σ,把绝对偏离换算成“几个正常波动”的相对量
- 阈值判定Z 超过 3 触发异常告警;配合深度包检测(DPI)检查数据包载荷特征,可进一步确认是不是攻击流
流量清洗:保安的“逐客令”
检测出异常后,火锅店的应对是“安检逐客”:保安在门口核对名单、查验身份,确认可疑的人带到旁边小黑屋,绝不放进就餐区。流量清洗(Traffic Scrubbing)就是这个动作的工程化版本。由于攻击流量直接打到源站时已无法招架,常见做法是用 BGP 路由协议把流量“牵引”到专门的清洗中心,而不是让它们直达源站——就像把疑似客人都先引到安检通道。
清洗中心内部有几样工具:黑洞路由(Blackhole Routing)是极端情况下的“壮士断腕”,把所有流量(包括正常流量)直接丢进黑洞,宁可错杀也不让服务崩溃;指纹识别根据数据包大小、协议行为、TLS 指纹等特征区分人还是机器;DPI 则深入检查报文内容,识别应用层攻击特征。清洗的终极难题是“误杀”——误把正常用户当攻击者。衡量清洗质量用精确率:
对保安而言,最忌讳的是把整条街的人都当坏人。清洗策略必须在召回率与精确率之间反复调优:阈值设严了误杀多,设松了漏洞大。这也是为什么流量清洗总要配合机器学习——让模型在海量流量中学习“好人”与“坏人”的细微差别。
- 正确拦截数TP 是真正被识别并丢弃的攻击性请求,这是清洗的核心成果
- 误伤计数FP 是长得很像攻击、实际是正常用户的请求,被误杀就会造成业务损失
- 计算精确率被拦截的流量中真正是攻击的比例越高,清洗越精准
速率限制:给店门装上“限流护栏”
商场每逢大促销都会在门口设围栏,顾客排成一队,每隔几秒放进去一批。为什么要限流?因为店内空间有限,一次性涌进太多人,收银台、货架、过道全都超载,体验反而更差。速率限制(Rate Limiting)就是网络世界的“分批放人”:它不区分请求是好人还是坏人,只规定每秒钟最多放行多少个请求,超出的先排队、排队太长就丢弃。
实现限流最经典的算法是令牌桶:系统以固定速率 ρ 往桶里放“令牌”,每个请求必须取走一枚令牌才能通过;桶的容量 B 决定了瞬时能容忍的突发量。时间 Δt 内最多放行的请求数为:
除了令牌桶,还有漏桶(恒定速率流出,像漏水的桶)、黑白名单(直接封禁已知恶意 IP)和挑战应答(CAPTCHA 验证码、滑块验证,把机器人挡在门外)。限流是“防挤店”的缓冲带——宁可让顾客多等一下,也不能让店先垮掉。它和清洗互补:清洗负责把坏人揪出来,限流负责在坏人还没被揪完时,保证店不被冲垮。
- 新增令牌ρΔt 表示在 Δt 时间内按速率 ρ 向桶中补充的令牌数
- 桶容量封顶桶最多存 B 个令牌,多出来的令牌直接丢弃,防止积压
- 放行上限取两者较小值,就是该时间段内最多允许通过的请求数
弹性扩容:开分店与“加后厨”
如果恶意顾客实在太多,门口保安和限流护栏都挡不过来,火锅店还有最后一招:开分店,把客流摊到多个门店去。DDoS 防御中的 Anycast 就是这个思路——让多个数据中心共享同一个 IP 地址,互联网路由协议会根据用户所在位置,自动把请求引导到“最近”的那个节点。攻击流量原本集中在一点,现在被天然散开到几十个节点上,每个节点各自消化一小部分,谁也挤不爆。
Anycast 效果可以用简单公式描述:总流量 L_total 被分散到 N 个节点后,每个节点平均承担:
弹性扩容并不仅仅是“多买几台服务器”,还包括:云清洗中心按需扩容清洗能力、CDN 把静态资源分发到边缘节点、Kubernetes 根据 CPU 和流量指标自动扩展 Pod 数量。开分店、加后厨、临时招人,核心是让容量 C 跟着流量动态变大——挤店的人再多,店越开越多,也就永远挤不爆了。
- 总流量L_total 是攻击流量与正常流量之和,也就是所有顾客的总量
- 节点数量N 是参与 Anycast 的机房或清洗节点数目,分店越多分摊越薄
- 平均负载每节点平均承载 L_total 除以 N 的流量,节点数翻倍则单点压力减半
部署策略:一套完整的“防挤店”预案
单靠任何一招都撑不了一场大型 DDoS 攻击,真正的防线是组合拳。想象火锅店的终极预案:门口保安查证(清洗)、护栏限流(限速)、全城分店联动(Anycast 扩容)、监控室 7×24 值班(检测),一旦触发警报,所有机制同步启动。网络侧的纵深防御也是这样层层设卡。
第一层是近源防护:在靠近攻击源头的 ISP 骨干网或运营商侧部署清洗设备,让攻击流量在源头附近就被丢弃,避免拥堵骨干链路。第二层是云清洗中心协同:当本地设备扛不住时,通过 BGP 把流量牵引到云端的超大带宽清洗集群,洗完后只把干净流量回注源站。第三层是本地限流与业务降级:应用层实施令牌桶、挑战应答,必要时关闭非核心功能,保障核心交易链路。每一层都有各自的拦截率,构筑起层层递进的纵深防御:
除了技术防线,还要有应急预案:明确谁来值守告警、谁来操作 BGP 牵引、业务降级到什么程度、何时联系云服务商。DDoS 防御不是买一个产品就结束,而是一套持续演练的运营体系——就像火锅店的消防演习,平时多流汗,战时才能不流血。
- 单层漏防率每层防线拦截率 d_i,则这一层放跑攻击的概率为 (1-d_i)
- 全层连乘所有防线都失效的概率是各层漏防率的连乘,层数越多值越小
- 总防御率用 1 减去“全部漏防”的概率,得到至少有一层拦住的综合防御率
AI 应用场景
场景一:云清洗中心流量调度
阶段:流量清洗与 BGP 牵引
解决的问题:攻击流量直达源站导致业务中断。传统做法靠人工切换路由,动辄数分钟,攻击每秒都在烧钱;AI 自动清洗平台通过实时流量分析识别攻击特征,分钟级完成 BGP 牵引、清洗、回注全流程,把“手工救火”变成“自动防汛”。
具体案例:某电商大促期间遭遇 300Gbps UDP 放大攻击,运维团队启用 Anycast 高防 IP,将流量分散到华北、华东、华南三个清洗节点,各节点自动过滤后仅 20Gbps 到达源站,支付链路全程可用,零订单丢失。
场景二:游戏网关防 SYN/HTTP 洪泛
阶段:检测识别与速率限制
解决的问题:开服瞬间海量连接请求涌入,半连接队列溢出,正常玩家登录超时。传统方案是盲目扩容,成本高且见效慢;现在在网关上用 Z 分数检测 + 令牌桶限流 + 可疑 IP 挑战应答,先识别机器人再放行。
具体案例:某手游发布新版本,登录网关监测到 Z 分数超过 6 的请求峰值,自动触发限流策略:单 IP 每秒最多 3 次登录尝试,超限弹出滑块验证。恶意流量被挡在业务之外,正常玩家登录成功率保持在 99.5%。
场景三:金融核心系统防 DNS 放大攻击
阶段:弹性扩容与近源防护
解决的问题:DNS 放大攻击动辄数百 Gbps,且难以溯源。金融企业通常在 ISP 近源侧部署清洗设备,同时将权威 DNS 托管到多个云节点(Anycast),攻击流量在源头附近即被丢弃,核心交易系统无感。
具体案例:某银行将域名解析服务接入“三地四中心”的 Anycast 集群,某线路遭受 400Gbps DNS 放大攻击时,路由自动将解析请求分散到其余节点,业务连续率 100%,监管零通报。
Python 演示
import timeimport randomfrom collections import deque class TokenBucket: """令牌桶限流器:控制每秒放行的请求数""" def __init__(self, rate, capacity): self.rate = rate # 令牌补充速率(个/秒) self.capacity = capacity # 桶容量(最大突发) self.tokens = capacity self.last = time.time() def allow(self): now = time.time() self.tokens = min(self.capacity, self.tokens + (now - self.last) * self.rate) self.last = now if self.tokens >= 1: self.tokens -= 1 return True return False class DDoSGuard: """DDoS 防御:基线检测 + 流量清洗 + 限流""" def __init__(self, base_rate=100, bucket_rate=120, bucket_cap=200): self.base_rate = base_rate self.history = deque(maxlen=60) # 最近 60 秒流量窗口 self.bucket = TokenBucket(bucket_rate, bucket_cap) def zscore(self, x): n = len(self.history) if n < 10: return 0.0 mean = sum(self.history) / n var = sum((v - mean) ** 2 for v in self.history) / n std = var ** 0.5 return (x - mean) / std if std > 0 else 0.0 def detect(self, rps): """返回是否处于攻击状态(Z 分数超过 3)""" return self.zscore(rps) > 3.0 def clean(self, src_ip): """流量清洗:黑名单中的地址直接丢弃""" return src_ip.startswith('192.0.2.') # 假定的攻击 IP 段 def handle(self, src_ip): if self.clean(src_ip): return False # 被清洗丢弃 return self.bucket.allow() def simulate(seconds=30): guard = DDoSGuard() random.seed(42) attack_ips = ['192.0.2.%d' % i for i in range(1, 11)] for t in range(seconds): # 构造流量:前 10 秒建立正常基线,之后攻击流量暴涨 rps = guard.base_rate + random.randint(-10, 10) if t >= 10: rps += 800 # 攻击流量瞬间涌入 if t < 10: guard.history.append(rps) # 冻结基线,便于演示稳定告警 attacked = guard.detect(rps) # 模拟每个请求 if attacked: src = random.choice(attack_ips) else: src = '203.0.113.%d' % random.randint(1, 254) passed = guard.handle(src) status = '攻击!' if attacked else '正常 ' result = '放行' if passed else '丢弃' print('t=%2d rps=%4d %s 清洗+限流: %s' % (t, rps, status, result)) if __name__ == '__main__': simulate()
self.tokens = min(self.capacity, self.tokens + (now - self.last) * self.rate)令牌按速率补充,但桶容量封顶,防止突发令牌积压guard.history.append(rps)前 10 秒持续把流量写入滑动窗口,建立“平时客流”基线def zscore(self, x)用 Z 分数衡量当前流量偏离基线的标准差倍数,是检测告警的核心if t >= 10: rps += 800模拟攻击流量瞬间暴涨,如同恶意顾客同时涌向店门guard.handle(src)先过清洗黑名单(丢弃恶意 IP),再进令牌桶(限速),两层联动random.seed(42)固定随机种子,让每次运行结果一致,方便排查与教学
常见误区
误区以为防火墙或安全组能直接挡住 DDoS,加几条规则就万事大吉,不需要其他防护。
正解防火墙是有状态会话检查,它必须逐包维护连接状态,面对海量流量时自身就会成为瓶颈。DDoS 的目标是带宽与资源耗尽——带宽被打满时,数据包根本到不了防火墙;半连接队列被打满时,防火墙也无力回天。真正有效的方案是流量清洗、速率限制、弹性扩容多层配合,防火墙只是其中一环。类比火锅店:门口保安再厉害,也挡不住整条街的人流涌过来。
为何常见:防火墙是最常见的边界安全设备,人们容易把所有外网攻击都默认交给它处理,忽略了 DDoS 是“量级碾压”而非“漏洞利用”。
误区把带宽从 1G 升级到 100G,攻击就打不垮我了。
正解带宽只是“马路宽度”,SYN/HTTP 洪泛消耗的是连接表、CPU、应用线程等计算资源,带宽再宽也无济于事。放大攻击还能把 1Mbps 的查询放大成 100Mbps 的响应,任何单链路带宽都可能被瞬间打满。路再宽,红绿灯(连接与计算资源)也能被堵死。
为何常见:从直觉上“攻击 = 堵路”,让人误以为加宽道路就能解决,忽略了资源类型的多样性。
误区清洗和限流都是“丢包”,没啥区别,用一个就行。
正解清洗的核心是“识别恶意并丢弃”,重视区分,依赖 DPI、指纹、基线检测来判断谁是坏人;速率限制的核心是“统一约束总量”,不区分善恶,只保证每秒放行数不超过阈值。一个像保安逐个查证,一个像商场门口分批放人,是两道完全不同的工序。实际防御中两者缺一不可:清洗提高精度,限流兜住总量。
为何常见:从外部视角看,两者都是“拦下了一些包”,底层机制和目标却大不相同,容易混为一谈。
误区买了高防 IP 或云清洗服务,防御就结束了,源站不用再做任何保护。
正解高防 IP 通常只清洗被牵引到它的流量,一旦源站 IP 泄露(例如绕过 CDN 直接解析到源站),攻击者就能绕过防护直捣黄龙。还需要做好源站 IP 隐藏、业务层限流、监控告警和应急预案。好比给火锅店换了防爆大门,后门窗户不锁,恶意顾客照样能溜进来。
为何常见:厂商宣传“一键接入、自动防御”给用户造成了部署即终点的错觉,忽视了攻击者会寻找防御盲区。
面试题
Q1. DDoS 攻击的核心目标是什么?
- A.窃取服务器上的敏感数据
- B.耗尽目标系统资源使其不可用← 正确答案
- C.篡改网站页面内容
- D.在服务器上安装后门程序
答案:B。DDoS 是“分布式拒绝服务”,核心是让服务不可用,而不是窃取或篡改。类比火锅店被挤爆门槛,目的是让顾客进不来,而不是偷菜。A、C、D 分别属于数据窃取、内容篡改、权限维持类攻击,与 DDoS 的“资源耗尽”本质不同。
Q2. SYN 洪泛攻击主要消耗服务器的什么资源?
- A.磁盘存储空间
- B.CPU 的一级缓存
- C.半连接队列(内存中的连接表)← 正确答案
- D.网卡的物理带宽
答案:C。SYN 洪泛发送大量握手请求但不完成三次握手,半连接队列被占满后,正常连接无法建立,这是典型的“连接资源耗尽”。类比恶意顾客只喊“我要点菜”却不真下单,占着服务员的注意力。磁盘、缓存、带宽都不是 SYN 洪泛的首选打击目标。
Q3. 流量基线检测中,Z 分数表示什么?
- A.当前流量与基线均值的偏离程度(以标准差为单位)← 正确答案
- B.攻击流量的绝对大小
- C.服务器当前的 CPU 使用率
- D.单个数据包的字节长度
答案:A。Z 分数 Z=(x-μ)/σ 衡量当前观测值偏离历史均值的标准差倍数,Z>3 判定异常。类比保安发现今天门口排队人数比平时均值高出好几个“正常波动幅度”。B、C、D 描述的是绝对量或资源指标,与 Z 分数的统计意义不符。
Q4. 下列哪项是流量清洗阶段常用的引流技术?
- A.BGP 路由牵引← 正确答案
- B.令牌桶算法
- C.CAPTCHA 验证码
- D.CDN 缓存预热
答案:A。BGP 牵引把原本直达源站的流量改道送入清洗中心,清洗后再回注干净流量,是清洗的“入口”环节。令牌桶属于速率限制,CAPTCHA 属于应用层人机识别,缓存预热属于性能优化,都与“引流到清洗中心”无关。
Q5. 关于 Anycast 抗 DDoS 的原理,正确的说法是?
- A.它会把攻击流量反弹给攻击者
- B.多个节点共享同一 IP,流量按路由分散到多个节点,单点压力被摊薄← 正确答案
- C.它加密所有流量,使攻击者无法解析
- D.它自动封禁所有发起连接的 IP
答案:B。Anycast 让多个机房广播同一 IP,路由协议把请求送到“最近”节点,攻击流量被天然分散。类比开分店,恶意顾客被拆散到各家门店,每家都不至于挤爆。反弹流量、加密、自动封禁都不是 Anycast 的能力。
Q6. 令牌桶算法中,桶容量 B 主要决定什么?
- A.请求的平均处理耗时
- B.允许的最大突发流量← 正确答案
- C.服务器的总出口带宽
- D.黑名单的条目上限
答案:B。令牌桶以固定速率补充令牌,桶容量限制了瞬时突发能取走的令牌总数,B 越大越能容忍突发。类比商场入口大厅能临时容纳的人数。平均耗时、出口带宽、黑名单长度都与桶容量无直接关系。
Q7. 为什么 DDoS 流量清洗很难完全避免“误杀”?
- A.因为清洗设备处理速度一定比攻击流量慢
- B.因为攻击者常模拟正常行为,特征与正常流量重叠,严格分类会误伤正常用户← 正确答案
- C.因为清洗中心必须把所有流量都丢弃才能安全
- D.因为网络协议本身不允许选择性丢弃数据包
答案:B。攻击者会伪装成正常用户(如慢速 HTTP 请求、随机 UA),统计特征与真实用户高度重叠,拦截阈值设严就误伤正常用户,设松就漏放攻击,只能靠精确率 P=TP/(TP+FP) 权衡。类比保安在人群中找可疑分子,动作太大会误拦普通顾客。A、C、D 均不符合实际机制。
Q8. 以下哪些属于常见的 DDoS 攻击手法?
- A.SYN 洪泛← 正确答案
- B.DNS 放大攻击← 正确答案
- C.SQL 注入
- D.HTTP 洪泛← 正确答案
答案:ABD。SYN 洪泛消耗半连接队列,DNS 放大利用开放解析器反射放大流量,HTTP 洪泛打满应用层资源,都是典型 DDoS 手法。SQL 注入属于数据层注入攻击,目标是窃取或篡改数据,不属于拒绝服务类攻击。
Q9. 构建多层 DDoS 防御体系时,正确的做法包括?
- A.在近源侧部署清洗设备,尽早丢弃攻击流量← 正确答案
- B.只依赖单一云清洗服务商,简化运维
- C.云清洗中心 + 本地限流 + Anycast 分流协同配合← 正确答案
- D.攻击发生时人工逐条封禁 IP 地址
答案:AC。近源防护能在源头附近拦截,云清洗、本地限流、Anycast 构成纵深防御,是生产环境的主流组合。单一依赖没有冗余,人工逐条封禁应对海量伪造 IP 也不现实。类比防挤店不能只靠一个保安,要门口、护栏、分店层层设卡。
Q10. 某游戏公司遭遇 HTTP 洪泛攻击,现有防护手段包括 CDN 缓存、令牌桶限流、CAPTCHA 验证码、WAF 规则。以下处置合理的有?
- A.开启 CDN 缓存静态资源,缓解源站压力← 正确答案
- B.用令牌桶对单 IP 请求限速← 正确答案
- C.对可疑请求弹出 CAPTCHA 人机验证← 正确答案
- D.关闭所有动态接口,业务完全静态化
答案:ABC。CDN 缓存可挡静态洪泛,令牌桶限制单 IP 速率,CAPTCHA 区分人机,都是应对应用层洪泛的合理手段。关闭所有动态接口会让正常用户也无法登录、下单,属于“自损一千”的错误做法。类比火锅店在门口查预约码,而不是把店门直接关了。