首页 › deep-tech › SMF遥控UPF:PFCP原理

凌晨一点的投诉工单写着:“手机信号满格、能注册、拿到了IP地址,就是刷不开任何网页”。核心网侧看信令,AMF、SMF的注册流程一片绿色;无线侧看覆盖,RSRP优良。最后有人在SMF与UPF之间的接口上抓了个包,才发现UPF上根本没装上转发规则——手机寄出的“包裹”,到了分拣中心却没人告诉分拣员往哪儿送。

这个故事的主角,就是本文要讲清楚的协议:PFCP(Packet Forwarding Control Protocol,包转发控制协议)。它是5G核心网里SMF“遥控”UPF的专属语言,也是很多“信令正常但用户面不通”类故障的案发现场。

一、从“前店后厂”说起:为什么要拆开控制面和用户面

要理解PFCP,先要理解它为什么会被发明出来。

4G早期,服务网关和分组数据网关通常是“一体化网关”:一台设备既负责会话管理决策(建立/修改/删除承载),又负责真正转发用户的每一个IP包。这就像一家餐厅,老板既在后台定菜单、算成本、管质检,又亲自在前店颠勺炒菜。小店没问题,开连锁就崩了:

两件事绑死在一台设备上,就只能互相迁就:想把用户面下沉,就得在每个下沉点复制一套昂贵的控制逻辑;想把控制面集中,用户流量就得绕远路回传。

于是行业在4G的中后期演进中引入了“控制面与用户面分离”(CUPS)思想,并在5G里把它做成了原生架构:控制逻辑收敛到SMF(会话管理功能),转发执行独立成UPF(用户面功能),两者之间用一条标准接口连接——这就是N4接口,上面跑的协议就是PFCP。

flowchart TD
    UE["手机"] --> gNB["5G基站"]
    gNB -->|N2信令| AMF["AMF"]
    AMF -->|N11| SMF["SMF 会话大脑"]
    gNB -->|N3 GTP-U| UPFe["边缘UPF"]
    subgraph CP["中心机房控制面池"]
      SMF
      AMF
    end
    subgraph UP["用户面可下沉到地市与园区"]
      UPFe
      UPFc["核心UPF"]
    end
    SMF -->|N4 PFCP遥控| UPFe
    SMF -->|N4 PFCP遥控| UPFc
    UPFe -->|N6| NET["互联网"]
    UPFc -->|N6| NET

用一句话概括这张图:SMF是坐在中心机房的大脑,UPF是散布在城市各个角落的手脚,PFCP就是大脑指挥手脚的神经信号。大脑不必跟着手脚搬家,手脚也不必等大脑出菜——这是整个5G核心网灵活性的基石,边缘计算(MEC)能落地,前提正是“转发能力可以先于控制能力部署到边缘”。

二、PFCP的自我修养:为什么跑在UDP上

先给PFCP一个技术定义:它是SMF与UPF之间传递转发控制指令的应用层协议,承载在UDP之上,标准注册端口是8805。

第一个容易产生的疑问是:控制指令这么重要,为什么不用TCP这种可靠传输,反而用UDP?

这里有个工程上的经典权衡。TCP的“可靠”是有代价的:连接状态、重传机制、拥塞控制的队头阻塞——一个包丢了,后面所有数据都得排队等它。对于旁边就是海量用户流量的控制接口来说,TCP的这些机制在故障场景下反而会放大问题(比如网络抖动时控制消息被队头阻塞卡住,故障恢复变得更慢)。所以电信控制面协议有一贯的传统:自己管可靠性,不麻烦TCP。老一代的GTP-C如此,PFCP也如此。

PFCP的可靠性方案很朴素:

$$T_{detect} = T_{timer} \times N_{retry}$$

其中 $T_{timer}$ 是重传定时器时长,$N_{retry}$ 是重传次数上限。这两个参数各家实现可配置,调试时若发现控制面动作“发得出去但收不回”,往往要在抓包里确认是重传多次后放弃,还是对端根本没收到。

第二个设计亮点是编码方式。PFCP的消息由一个个信息元素(IE)拼接而成,每个IE都是“类型-长度-值”的三段结构,像快递面单上一个个独立的字段:收件人、地址、备注,各占一块,互不干扰。这样做的好处是向后兼容——新版本UPF收到了老版本SMF不认识的新IE类型,跳过即可,不会导致整个消息解析失败。升级混部期间新旧设备能共存,靠的就是这个设计。

三、两类消息:先加好友,再派单

PFCP的消息分成泾渭分明的两大类,理解这个分类,排查问题时的思路会清晰很多:

类别 代表消息 作用 数量关系
节点类 关联建立/更新/释放、心跳、节点报告 先“互加好友”,确认对方存在且可用 一个SMF对一个UPF只建一条关联
会话类 会话建立/修改/删除、会话报告 派单与回执,安装/更新/拆除转发规则 一条关联上可挂载数以万计的会话

节点类消息里最重要的叫关联建立:SMF上新接入一个UPF,或者UPF上线后主动找SMF报到,双方要先交换各自的能力信息(比如支持哪些特性、能处理哪些转发功能),协商通过后这条“关联”才算建立。可以理解为两个人先互加微信,之后才能派单。

关联是会话的前提,也是会话的命门:关联一旦断开,挂在它下面的所有会话规则都视为失效。这就是为什么一次UPF与SMF之间的连接抖动,可能造成成片用户掉线——故障面是“关联级”的,不是“会话级”的。

四、转发规则五件套:PDR/FAR/QER/URR/BAR

SMF通过PFCP“遥控”UPF的核心手段,是给UPF安装一组转发规则。这套规则体系一共五个角色,用一个快递分拣中心就能全部类比到位:

规则 全称 干什么 分拣中心类比 典型内容
PDR 包检测规则 识别“哪些包归我管” 扫码识别件 源接口、隧道端点标识、UE IP、业务过滤器、匹配优先级
FAR 转发动作规则 决定包的去向 分拣方向单 转发/复制/缓存/丢弃,外层封装参数
QER QoS执行规则 限速与门控 通道限重与闸门 最大/保障比特率、门控开关
URR 用量上报规则 计量与上报 称重计费 流量/时长/事件阈值,上报触发条件
BAR 缓存动作规则 下行缓存建议 暂存柜 用户暂时不可达时先存着包

其中PDR是最关键的一环。一个UPF上同时有成千上万用户的流量进出,靠什么分清哪个包属于谁、该按哪套策略处理?靠的就是一批带优先级的PDR:每个PDR描述一种“包的样子”(专业上叫包检测信息,例如来自哪个隧道端点、目的IP是多少、属于哪条业务流),并指定一个优先级。数据包到达时按优先级逐条比对,命中第一条即停,后续不再匹配。

命中PDR之后,UPF顺着它找到绑定的FAR执行动作,同时QER做限速检查、URR做计量累加。整个过程像流水线:

flowchart TB
    A["数据包到达UPF"] --> B["按优先级逐条匹配PDR"]
    B --> C{"是否命中某条PDR"}
    C -->|是| D["取出绑定的FAR"]
    C -->|否| E["丢弃或走默认处理"]
    D --> F{"FAR指定的动作"}
    F -->|转发| G["封装外层隧道头发往对端"]
    F -->|缓存| H["暂存报文并通知SMF触发寻呼"]
    F -->|丢弃| I["静默丢弃"]
    D --> J["URR计数器累加流量与时长"]
    J --> K{"是否达到上报阈值"}
    K -->|是| L["会话报告上送SMF用于计费出话单"]

这张图里有两个值得品味的细节:

第一,“缓存”动作是寻呼机制的另一半。手机待机时无线侧通道是释放的,这时如果有别人的微信打进来,下行数据先到UPF。UPF按FAR的指示把包暂存起来,同时通过PFCP会话报告通知SMF,SMF再去协调寻呼流程叫醒手机。没有这条规则,被叫场景下的第一个数据包就会凭空丢失。

第二,你的话单是UPF“称”出来的。计费系统并不直接盯着每一个IP包,URR规则告诉UPF“这位用户流量每累计到某个阈值,或每过一个时间周期,就上报一次用量”,SMF据此生成话单记录。URR的阈值和触发条件配错了,用户投诉“话单流量对不上”就是这么来的。

五、一次会话建立:遥控指令的下发现场

把前面的概念串起来,看手机开机后一条PDU会话是怎么借助PFCP建立起来的:

sequenceDiagram
    participant UE as 手机
    participant RAN as 基站
    participant AMF as AMF
    participant SMF as SMF
    participant UPF as UPF
    UE->>RAN: 请求建立PDU会话
    RAN->>AMF: N2消息透传会话请求
    AMF->>SMF: 请为该用户创建会话
    SMF->>UPF: PFCP会话建立请求 携带PDR/FAR/QER/URR
    UPF-->>SMF: 建立响应 返回本端隧道端点标识
    SMF->>RAN: 经AMF下发UPF侧的N3隧道信息
    RAN-->>UE: 无线承载与IP配置完成
    Note over SMF,UPF: 规则安装完毕 用户面通路打通

流程里最容易被忽视、却最常出问题的,是隧道端点标识(TEID)的交换:

也就是说,PDR里登记的“对端身份”,和空口对端实际使用的身份,分别来自两次不同的分配。任何一次配置、选择、传递出了岔子——比如UPF上装的TEID和基站实际使用的对不上——就会出现教科书级的经典故障:单通或完全不通,而控制面信令看起来一切正常。回看开头那个凌晨工单,正是会话建立阶段UPF侧规则安装失败,用户拿到了IP却没有转发规则可用。

顺带一提,当流量需要经过多个UPF串联(例如漫游场景或边缘分流场景)时,SMF只是照同样的办法在每一段隧道两端各装一组规则,把UPF像水管一样一段段接起来——理解了“一段隧道、两组规则”这个基本单元,再复杂的转发链路也只是它的重复。

六、心跳与恢复时间戳:UPF还活着吗

关联建好后,SMF和UPF靠心跳(Heartbeat)维持“我还活着”的存在感:一方周期性发出心跳请求,对方回心跳响应,消息里带着序列号和一个叫恢复时间戳的字段。若连续失败次数达到阈值,发起方判定关联失效,执行断开。故障检测的时间底线可以估算:

$$T_{fail} = T_{hb} \times N_{fail}$$

其中 $T_{hb}$ 是心跳周期(工程上常见为几十秒量级,可配置),$N_{fail}$ 是连续失败阈值。

sequenceDiagram
    participant SMF as SMF
    participant UPF as UPF
    loop 周期数十秒级 可配置
        SMF->>UPF: 心跳请求 序列号N
        UPF-->>SMF: 心跳响应 恢复时间戳
    end
    Note over SMF,UPF: 连续失败达阈值即断开关联

恢复时间戳是个精巧的设计:它记录的是对端进程本次启动的时刻。SMF发现响应里的时间戳突然变了,立刻明白“对端重启过了”,于是本地缓存的所有会话状态都不可信,需要重新同步或重建——而不是傻等那些永远不会到来的响应。

这里藏着一个现网高频痛点:心跳是被中间设备“误杀”的。PFCP基于UDP,是一条“安静”的流,很多防火墙对UDP会话设有老化时间,长时间没有匹配流量的表项会被悄悄删除。删除之后,后续心跳包因为找不到会话表项而被丢弃,SMF连续收不到响应,判定UPF失联,关联断开,成千上万的会话规则瞬间失效——而UPF本身毫发无损。故障现象是“UPF反复掉线又自动恢复”,根因却在通信路径上的安全设备。抓包时的心法是:看心跳是双向都有还是单向丢失,单向丢失基本可以锁定中间设备。

七、实战:盯住8805端口,这些故障一眼看穿

把前面的原理落到调试动作上,先记住一个数字:PFCP抓包过滤条件就是 udp.port == 8805(Wireshark可直接解码PFCP)。然后按“先节点、后会话”的顺序看:关联是否健在?心跳是否正常?再深入单条会话的建立与修改。常见的故障模式整理如下:

症状 高概率根因 抓包与排查点
UE拿到IP但上不了网 会话建立失败,或PDR里登记的隧道端点与对端实际使用值不匹配 看 establishments 响应中的原因值;核对上下行TEID三处一致性
UPF频繁掉线又自动恢复 中间防火墙UDP会话老化踢掉了心跳 确认心跳是否单向丢失;核查路径上设备的UDP超时设置
一次UPF重启后大面积断线 恢复时间戳突变,触发会话批量重建 对比重启前后心跳中的恢复时间戳
能ping通小包,大包必丢 隧道封装撑大了报文,触发分片丢包 按下述公式核查内层MTU配置
话单流量与实际使用不符 URR阈值或上报触发条件配置不当 检查会话修改时下发的URR参数

大包丢失值得单独展开。GTP-U封装给每个报文套了一层“外衣”,外层IP头部20字节、UDP头部8字节、GTP-U头部至少8字节,内层有效载荷因此被压小:

$$MTU_{inner} = MTU_{link} - 36$$

链路MTU为1500时,内层有效MTU约1464字节(工程上常按更保守的余量配置)。内层MTU没跟着调小,用户发出的满尺寸报文封装后超链路上限,被分片或丢弃——症状就是“小包通、大包丢”,网页打不开但能ping通。这是隧道类网络永恒的经典题,PFCP只是让这道题从承载网搬到了核心网。

八、写在最后

回顾PFCP的设计,你会发现它处处体现同一种思路:控制逻辑与转发执行解耦,再用一条足够简单的协议把它们缝合起来。用UDP而自带可靠性,是为了不拖累旁边的海量流量;用TLV的IE编码,是为了新旧设备和平共处;用优先级匹配的PDR,是为了在十万条规则里一次命中;用心跳加恢复时间戳,是为了在UDP之上重建“活着”的判断。

理解了PFCP,你就理解了5G核心网灵活性的来源:SMF集中部署在任何方便的地方,UPF想下沉到地市、园区甚至工厂车间都可以——大脑和手脚分开,网络才第一次拥有了“哪里需要计算,就把转发能力搬到哪里”的自由。下次再遇到“信令全绿但用户没网”的工单,你会知道该去哪里抓包。

常见问题

Q1: PFCP和GTP-U是什么关系? A: 分工完全不同。PFCP是控制面协议,负责SMF向UPF“安装/修改/删除转发规则”,跑在N4接口;GTP-U是用户面封装协议,负责把用户的IP报文套上隧道头在UPF与基站之间搬运,跑在N3/N9接口。可以记成:PFCP是调度员的对讲机,GTP-U是传送带本身。

Q2: 为什么PFCP用UDP而不是TCP? A: 控制面协议的传统选择。TCP的队头阻塞和连接开销在故障场景下会放大问题,PFCP选择UDP承载,用自己的序列号、确认和重传机制实现可靠,行为完全可控、可预测,也避免了TCP状态机在网络抖动时的额外震荡。

Q3: 心跳失败和用户掉线是什么关系? A: 关联是会话的载体。心跳连续失败导致关联断开时,挂在关联下的所有会话规则一并失效,属于“关联级”故障,波及该SMF-UPF对上的全部用户。所以个别用户掉线查会话,成片用户掉线先查关联和心跳。

Q4: N4接口和PFCP是不是5G才有的新东西? A: PFCP作为协议确实诞生于4G后期的CUPS增强(2017年前后冻结),最初用于分离增强型4G网关的控制与用户面;5G沿用并发展了这套协议。可以理解为“4G试验田里长出、5G全面推广”的技术。

Q5: PDR优先级冲突时会发生什么? A: UPF按优先级从小到大逐条匹配,命中第一条即停止,后面的规则不再检查。如果两条PDR的检测信息有重叠,优先级高的那条“赢者通吃”。配置规则时故意利用优先级实现细分业务单独处理,是常见做法;配置失误导致高优先级规则“截胡”,则是业务分流不生效的常见根因。

参考来源

  1. Wireshark Wiki – PFCP — PFCP抓包解码参考,调试时过滤条件的依据

(注:若个别链接访问失效,可按标题在对应站点内搜索关键词获取。)


本文由「51学通信」技术团队出品。51学通信由通信行业18年老兵爱卫生(微信ID: gprshome201101)维护,聚焦5G/6G核心网、3GPP标准解读、通信前沿技术深度分析。 出版作品有《5G核心网原理与实践》《IMS原理与实践》等4本通信专业书籍。知识星球「51学通信」提供深度技术答疑和行业洞察。

[!tip] 51学通信知识星球 星主:爱卫生(微信:gprshome201101)——公众号「51学通信」创办者,19 年通信行业运维与讲师经验,著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书(各大电商平台有售)。 星球定位:深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域,主打运维岗位与信令分析。 当前规模:5200 篇主题 / 990 个回答,198 元/年。 加入福利:加入星球后请加爱卫生微信,拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题,另有群内分享。 AI 加持:51学通信知识星球已作为 skill 接入 WorkBuddy,使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例,做总结、找文档和 PPT 等场景全覆盖。

51学通信知识星球海报-扫码加入