【Azure App Service】应用服务(Web App)里的 SNAT 端口 vs 出站连接数:到底是谁限制了谁?

简介: 本文解析 Azure App Service 出站连接中 TCP 连接数(1920/3968/8064)与 SNAT 端口(约128个)的本质区别:前者是实例级连接上限,后者是共享负载均衡器的公网源端口资源,仅对外部调用生效。二者非1:1关系,瓶颈常在 SNAT——高频访问同一目标时易耗尽。关键在于复用连接、控制并发、避免单点集中调用。

问题描述

在 Azure App Service 中进行出站访问(Outbound Connection)时,我们都会遇到一个看似矛盾的现象:

  • 官方架构文档明确写着,每个实例允许的 TCP Connections(出站连接数)上限为 1920 / 3968 / 8064(分别对应 B1/S1/P1、B2/S2/P2、B3/S3/P3)。
  • 但在排查线上问题时,Azure 工程师或诊断工具却常常指出:每个实例大约只有 128 个 SNAT 端口,很容易被耗尽。

于是产生困惑:

  1. 这两个数字到底是同一回事的两种说法,还是两个独立的限制?
  2. 既然能开 8064 个连接,为什么只有 128 个 SNAT 端口?是不是哪里算错了?
  3. 真正限制我们应用代码能并发调用多少外部服务请求的,到底是哪一个?

本文会先把 SNAT 端口的占用原理 讲清楚,再解释它和出站连接 (Outbound Connections) 的区别。

 

问题解答

1. SNAT 端口到底是怎么被占用的

App Service 的 worker 实例没有自己的公网 IP。当应用访问公网 endpoint(例如 SQL、Storage、外部 API)时,流量会先到 stamp / scale unit 里的出站负载均衡器,由它把私网源地址改写成公网源地址,这个过程就是 Source Network Address Translation(SNAT)。

从应用视角看,它只是 connect 到外部服务。但从负载均衡器视角看,它必须为这条出站流维护一条映射记录:

字段 示例值
Protocol TCP
Worker 实例 IP:port 10.0.5.60:51014
负载均衡器公网 IP:port 13.76.245.72:12481
外部 endpoint IP:port 52.189.232.180:1433


这里的 12481 就是这条 connect 在公网侧使用的 SNAT 端口。回包到达负载均衡器后,负载均衡器再根据映射表把包转回 10.0.5.60:51014。所以,SNAT 端口不是应用代码直接打开的端口,而是负载均衡器为了让回包找得到原始连接而分配的公网源端口。

 

2. SNAT 端口为什么容易被同一个后端耗尽 (非常重要)

理解 SNAT 占用,要先理解 TCP 流的唯一标识:五元组(5-tuple)

五元组字段 含义 示例
Protocol 协议 TCP
Source IP 源地址(SNAT 后 = 负载均衡器公网 IP) 13.76.2.72
Source Port 源端口(也就是 SNAT 端口) 12481
Destination IP 目的地址(外部 endpoint) 52.189.22.10
Destination Port 目的端口 1433

 

关键规则:只要五元组整体不重复,连接就是唯一的;如果五元组完全相同,负载均衡器就无法区分回包属于哪条流。

因此,SNAT 端口的占用规则可以这样理解:

  • 多条连接访问同一个目的 IP + 端口 + 协议:目的字段相同,只能靠不同的 Source Port 区分,所以 每条连接都要占一个新的 SNAT 端口
  • 多条连接访问不同目的 IP 或不同目的端口:目的字段已经不同,五元组天然不冲突,所以 可以共享同一个 SNAT 端口

下面用 同一个 SNAT 端口 12481 举例:

(此图对应原文描述:If your app creates connections to a mix of address and port combinations, you won't use up your SNAT ports. The SNAT ports are used up when you have repeated calls to the same address and port combination.

 

这就是为什么官方文档会强调:SNAT 端口限制主要影响反复连接同一个 address + port combination 的场景。典型例子包括:

  • 大量请求打到同一个 SQL Database;
  • 大量请求打到同一个 Redis / Storage endpoint;
  • Function App 被队列瞬间触发,所有实例或线程同时访问同一个外部 API。

 

3. 为什么每实例通常按 128 个 SNAT 端口估算

SNAT 端口来自负载均衡器公网 IP 的端口池,而不是单个 App Service 实例私有的无限资源:

  • 一个公网 IP 可用于 SNAT 的端口数量有限;
  • 一个典型 stamp /Scale Unit 有多个出站公网 IP,但要被 stamp/Scale Unit 内很多站点和实例共享;
  • App Service 每个实例通常会被预分配 128 个 SNAT 端口 作为安全估算值。

Azure 负载均衡器历史上有不同分配算法, 详见:SNAT with App Service -- https://4lowtherabbit.github.io/blogs/2019/10/SNAT/

 

4. SNAT 端口和 TCP Connections 的区别 (关键关键点)

回归到最初的困惑:

  1. 这两个数字到底是同一回事的两种说法,还是两个独立的限制?
  2. 既然能开 8064 个连接,为什么只有 128 个 SNAT 端口?是不是哪里算错了?
  3. 真正限制我们应用代码能并发调用多少外部服务请求的,到底是哪一个?

核心原因是:TCP ConnectionsSNAT 端口 描述的是同一条出站链路上的 不同动作、不同计数器、不同资源池。

  • TCP Connections:App Service 实例统计「当前有多少 TCP 连接」
  • SNAT 端口:只有连接需要访问外部公网 endpoint 时,才会在出站负载均衡器上消耗的公网源端口

连接发起 ----> 到TCP Connection 计数 ---->  SNAT 端口消耗计数的流程图:

TCP Connections / connect 和 SNAT 端口的区别可以概括为:

对比项 TCP Connections / connect SNAT 端口
本质 connect 是建连动作;TCP Connections 是连接计数 负载均衡器公网侧的源端口资源
发生位置 Worker 实例沙箱 Stamp 出站负载均衡器
统计对象 Worker 上的 TCP 连接数量 公网侧源端口映射数量
是否包含本地 loopback 包含 不包含
是否只影响外部公网访问 否,所有 TCP 连接都会计入 是,主要用于外部网络流量
计数方式 每条 TCP 连接都算 1 条 同目标通常 1 条连接占 1 个端口;不同目标可能共享端口
常见上限 1920 / 3968 / 8064(按规格) 每实例通常按 128 估算
谁更常先触发 连接泄漏极严重时 高频访问同一外部后端时


可以把两者关系理解成:

  • connect 成功建立后,worker 上会多一条 TCP Connection;
  • 如果这条连接只是本地 loopback 或内部本地连接,它 只影响 TCP Connections,不影响 SNAT
  • 如果这条连接要访问外部公网 endpoint,它才会进入 SNAT 流程;
  • 进入 SNAT 后,是否新增一个 SNAT 端口,取决于目的 IP、目的端口、协议这些五元组字段是否已经可以区分流量。

所以二者 不是 1:1 关系

一条 TCP 连接可能不占 SNAT;

多条访问不同目标的 TCP 连接也可能共享 SNAT 端口;

但大量访问同一目标时,SNAT 端口会近似变成 1:1 的瓶颈。

 

总结

出站连接数(1920/3968/8064)是沙箱层的硬天花板,SNAT 端口(~128)才是 stamp 共享层、并且通常先撞到的现实瓶颈。

关键不是「我能开多少连接」,而是「我有没有复用连接」。

把每实例并发出站控制在 128 以内、复用连接、加快后端,SNAT 问题基本就不会找上门。

 

参考资料

Inside the Azure App Service Architecture : https://learn.microsoft.com/en-us/archive/msdn-magazine/2017/february/azure-inside-the-azure-app-service-architecture#network-port-capacity-for-outbound-network-calls

SNAT with App Service : https://4lowtherabbit.github.io/blogs/2019/10/SNAT/


 


 

当在复杂的环境中面临问题,格物之道需:浊而静之徐清,安以动之徐生。 云中,恰是如此!

相关文章
|
15天前
|
人工智能 运维 JavaScript
新版实操手册 OpenClaw和Hermes Agent阿里云部署配置与使用详解
随着AI智能体技术不断落地,OpenClaw与Hermes Agent两款开源智能代理工具,凭借私有化部署、功能全面、拓展性强、适配国内大模型等特点,成为开发者、运维人员、办公群体的热门选择。两款工具定位各有侧重,OpenClaw偏向全场景自动化任务执行,支持文件操作、脚本运行、多平台消息联动;Hermes Agent则聚焦智能对话、多轮任务编排、长上下文交互,二者均可依托阿里云服务器实现7×24小时不间断运行。
395 3
|
15天前
|
存储 运维 监控
《告别日志排查:OpenClaw如何修复工具错误指南》
传统工具调用系统依赖预先枚举的错误码,面对异构工具的指数级参数组合和隐蔽语义错误时彻底失效,只能靠人工排查海量日志救火。本文深入拆解OpenClaw的革命性设计,它彻底抛弃被动防御思路,构建了语法校验、语义验证、目标对齐三层递进的语义自愈体系。通过异常语义化建模、工具间协同纠错、动态粒度控制和自学习闭环,将异常转化为系统进化的养分,实现95%以上常见异常的自主修复。这套机制为通用智能体的鲁棒性提供了全新技术路径,重新定义了工具调用的可靠性标准。
203 9
|
15天前
|
弹性计算 监控 Java
Maven 并行构建配置:-T 4C 提速 4 倍实战
本文深入讲解了 Maven 并行构建的核心原理和实战技巧,包含 -T 参数详解、模块并行化改造、性能监控与分析等企业级最佳实践。通过真实案例展示了如何将多模块项目的构建时间从 45 分钟缩短到 11 分钟(提升 4.1 倍),提供完整的性能测试脚本和优化检查清单。掌握这些技能,你将能够充分利用多核 CPU 加速 Maven 构建。适合 Java 开发者、架构师、DevOps 工程师阅读。
|
15天前
|
机器学习/深度学习 数据采集 人工智能
田间杂草检测数据集分享(适用于YOLO系列深度学习分类检测任务)
本数据集含4000张真实农田图像(小麦/玉米/水稻田),YOLO格式标注杂草目标,覆盖多天气、光照与视角,适用于YOLO系列等目标检测模型训练,助力智能除草与精准农业研究。(239字)
317 16
|
15天前
|
存储 人工智能 运维
阿里云 STAROps 全域智能运维平台发布!从“被动救火”到“主动自治”
阿里云以 STAROps 为起点,将 Agentic Ops 从概念推向生产级落地。
410 11
|
15天前
|
人工智能 运维 JavaScript
OpenClaw落地手册 阿里云部署流程、Token Plan设置及大模型Skill配置详解
在AI智能体技术快速普及的当下,OpenClaw凭借开源免费、私有化部署、任务自动化执行、多平台适配等优势,成为个人办公、开发运维、团队协作场景中热门的智能代理工具。很多新手在接触这款工具时,最先遇到的难题就是完整部署流程不清晰,同时不清楚如何搭配Token Plan套餐管控调用成本,也不了解大模型专属Skill技能模块的接入与配置方法,导致部署完成后无法发挥工具全部能力。
256 0
|
15天前
|
人工智能 自然语言处理 API
阿里云海外重磅发布 Qwen Cloud
Qwen Cloud,正是为AI Agent 而生的全新服务方式。
1632 52
|
15天前
|
传感器 人工智能 开发工具
Meta AI眼镜百万销量:AI硬件的iPhone时刻到了?
Meta Ray-Ban AI眼镜2026年Q1销量破百万,标志端侧多模态AI落地成熟。依托Llama 4端侧模型(4B参数)、实时多模态感知与云边协同,开启第一视角智能新范式。开发者可借SDK、数据集与硬件工具链抢占生态先机。
223 8
|
15天前
|
安全 人机交互 调度
《零基础搭建OpenClaw迁移训练环境指南》
智能体仿真完美、落地即崩的行业死结,根源从来不是仿真精度不足,而是传统Sim2Real始终困在视觉特征匹配的表层逻辑里。本文拆解OpenClaw颠覆性的虚实迁移方案,它彻底抛弃暴力域随机化的老路,构建了一套以跨感官因果认知为核心的迁移体系。通过阶梯式虚实过渡、动态经验权重调节、执行器在线自校准与虚实数据双向闭环,让智能体学习物理世界的本质规律而非表面特征。
125 6
|
15天前
|
人工智能 缓存 弹性计算
阿里云服务器2核4G5M199元解析:独享型u1实例,性能、适用场景、购买和续费规则介绍
阿里云通用算力型u1实例(ecs.u1-c1m2.large)2核4G、5M带宽、80G ESSD Entry云盘,活动特惠价仅199元/年(官网价3498.36元),企业新老用户同享,续费同价至2027年3月31日,每人限购1台。该实例采用独享型架构,搭载Intel至强可扩展处理器,内网带宽1Gbit/s、收发包30万PPS、云盘IOPS 1万,性能稳定,适合企业官网、中小Web应用、轻量数据库及开发测试等场景。