☰
5G网络仿真中的NFV落地:从容器化VNF到Open5GS实操指南
2026/9/29 16:39:01 网站建设 项目流程

做了这么多年无线网络仿真,我越来越觉得“网络功能虚拟化”不是个只挂在PPT上的概念,而是5G网络仿真里必须正视的地基。以前做系统级仿真,把基站当黑盒,把核心网当流量发生器,但5G引入服务化架构后,AMF、SMF、UPF这些网元全部软件化,跑在通用计算平台上,仿真模型如果不能体现NFV的资源调度、弹性伸缩、切片隔离,那结果基本就是自欺欺人。这篇内容就是写给正在做5G网络仿真、或者想把核心网虚拟化真正落进实验环境的人,聊一聊NFV在仿真里到底扮演什么角色、怎么拆解、怎么选工具、怎么搭一套能跑通的容器化5G核心网仿真环境,以及我在实际调试中踩过的坑。

1. 5G网络仿真中的NFV:不是锦上添花,而是地基

1.1 从专用硬件到通用服务器:NFV到底干了什么

传统无线网络的仿真,大家习惯把核心网设备当成一个固定时延、固定吞吐的“黑盒节点”,网元和硬件绑定,一个PGW就是一个机框,扩容就是加板卡。这种模型在4G时代勉强够用,因为业务模型简单,信令流程固定。但5G核心网变成了服务化架构,网元拆分得更细,接口变成了HTTP/RESTful风格,信令交互更多,动态性更强。如果还是用固定参数的黑盒模型去仿真,根本体现不出“网络功能虚拟化”带来的弹性特征。

NFV的核心思路很朴素:把网络功能从专用硬件里解放出来,变成跑在通用服务器上的软件实例,也就是常说的VNF(Virtual Network Function)。在仿真里,这个“解放”意味着你不再需要给每个网元单独建模一套专用设备的排队服务模型,而是可以把计算资源、内存资源、网络资源统一抽象成资源池,再让网元以软件进程或容器的方式跑在资源池上。这样一来,仿真就不再只是关注“这条链路时延多少”,而是要关注“网元在负载变化时会不会扩容”“资源竞争会不会导致处理时延抖动”“切片之间怎么隔离”。

1.2 为什么仿真阶段就必须引入NFV

很多人觉得NFV是部署阶段的事情,仿真阶段拿一个简化模型凑合就行。我在实际项目里吃过亏,当时只建模了5G接入网的空口传输,核心网用一个固定处理时延的模块替代,结果跑负载均衡算法时,系统显示核心网永远不成为瓶颈。可一旦把核心网细化成多个VNF,并让它们共享同一台物理主机的CPU资源,问题立刻暴露出来:当一个切片内的信令风暴消耗大量CPU时,另一个切片的用户面转发时延明显上升,甚至出现丢包。这种跨切片的资源抢占效应,只在NFV化的仿真模型里才能看见。

所以,5G网络仿真正正需要关注的不只是“无线信道怎么样”,还有“虚拟化基础设施上的网元表现怎么样”。NFV让核心网的“软件属性”被放大:启动时间、弹性伸缩、资源隔离、故障恢复,这些全部成为影响端到端指标的因素。如果仿真里不把这些机制建模进去,那仿的就是一个被美化过的理想网络,而不是真实可部署的5G网络。

2. 仿真里的NFV核心构件:网元、编排器和基础设施

2.1 VNF和网元拆解:AMF、SMF、UPF都是谁

在做5G核心网仿真时,第一步要明确你要仿真哪些VNF,以及每个VNF在信令面和用户面的分工。

  • AMF(接入和移动性管理功能):负责终端注册、接入控制、移动性管理。在仿真里它是最核心的信令节点,所有终端初始附着都要先经过它,所以仿真AMF的处理能力直接影响终端接入成功率。
  • SMF(会话管理功能):负责PDU会话的建立、修改、释放,还有IP地址分配、UPF选择。仿真SMF时重点要关注会话生命周期状态机,以及和AMF、UPF之间的接口交互。
  • UPF(用户面功能):负责数据包转发、QoS执行、流量统计。在仿真里UPF是最容易出现性能瓶颈的网元,因为它处理的是实实在在的业务数据,而不是轻量级信令。
  • UDM/AUSF/PCF等:这些网元多为数据库或策略判断功能,在仿真中可以相对简化,但必须保留接口行为,因为它们会影响注册鉴权和策略下发流程。

把这几个VNF放在仿真拓扑里,它们之间的连接关系就构成了核心网服务化架构的骨架。你不需要在一开始就把所有网络切片子网都建出来,而是先理解每个VNF的输入输出、资源消耗特征、以及它在完整信令流程中的位置。

2.2 MANO三层架构在仿真中的落地

NFV架构里有一个常被忽略但极其重要的部分:MANO(管理与编排)。它分为NFVO、VNFM、VIM三层。在真实系统里,NFVO负责跨网元的业务编排,比如实例化一个完整的端到端切片;VNFM负责单个VNF的生命周期管理,比如扩容、缩容、终止;VIM负责基础设施资源调度,比如虚拟机或容器的创建与释放。

在仿真环境里,很多人只仿真VNF数据面,把MANO完全省略,理由是“我只关心业务性能”。但如果你要仿真的是“5G网络切片调度”或者“边缘计算动态部署”,MANO恰恰是整个实验的核心。我在做边缘UPF按流量调度仿真时,就搭建了一个简化MANO模型:VIM用一个资源监控器模拟,当某个UPF的CPU使用率超过阈值时,VNFM触发新的UPF容器创建,NFVO更新数据转发路径。这个模型虽然比真实MANO简化很多,但已经足以验证“动态扩容对端到端时延的影响”。

2.3 基础设施层怎么仿真才靠谱

NFVI(网络功能虚拟化基础设施)是VNF运行的底座,包括计算、存储、网络资源。在仿真中,NFVI的建模精度决定了结果的可信度。常用做法有两种:一种是纯抽象建模,在离散事件仿真器里为每个VNF配置CPU配额、内存大小、处理速率,用排队论模拟资源竞争;另一种是容器化仿真,直接把VNF做成Docker容器跑在真实Linux主机上,通过Docker资源限制模拟虚拟化隔离。

我建议根据实验目的分层处理:如果关注的是信令流程和协议交互,纯抽象建模够用;如果关注的是性能瓶颈和资源调度,容器化仿真更有说服力。比如你想知道“UPF实例从1个扩展到3个,对端到端时延的改善有多少”,用Docker容器模拟就非常直观,因为你可以用docker stats实时观察CPU和内存占用,而这在纯离散事件仿真里是很难做到的。

3. 工具链选型与场景设计:从NS-3到Kubernetes

3.1 纯仿真器派:NS-3 / OMNeT++ 怎么建模NFV

先说纯仿真器这条路。NS-3是目前学术圈用得最多的网络仿真器,它对LTE/NR有一定支持,也可以通过N0等模块建模核心网。在NS-3里实现NFV,本质上是把每个VNF建模成一个Application或Node,然后为它分配处理延迟、丢包率和服务速率。你可以在仿真脚本里动态增加Node实例来模仿弹性伸缩,也可以用ns3::MobilityHelper之类的方式挪动节点位置,模拟边缘计算场景。这种方式的好处是宏观可控,适合跑大规模网络拓扑,比如几百个基站、上千个终端。

OMNeT++我用的相对少一些,但它的模块化程度确实高,适合做协议级仿真。如果你需要把3GPP TS 23.501里的服务化接口一个一个建模出来,OMNeT++的模块嵌套能力会比NS-3更顺手。缺点是学习曲线陡,而且要自己写大量消息定义和状态机,做完一套5G核心网NFV仿真模型往往要投入好几个月。

对于纯仿真器,最大的坑是“资源参数从哪里来”。NS-3里给AMF设置节点处理时延,你不能拍脑袋定一个10ms,而是要参考真实VNF在白盒服务器上的基准测试数据。我在项目里会把Open5GS在Docker容器里的实际CPU处理时延测出来,再回填到NS-3模型里,这样仿真结果和真实环境才能对齐。

3.2 半实物仿真派:Open5GS + UERANSIM + Docker

相比纯抽象建模,我更推荐在半实物仿真环境里做NFV。所谓半实物,就是信令流程跑真实的开源协议栈软件,但把基站、终端、物理链路用软件模拟器替代。目前最成熟的组合是开源5G核心网Open5GS加上开源仿真UE和基站UERANSIM。

Open5GS本身就是一个高度模块化的5G核心网实现,包含了AMF、SMF、UPF、NRF、AUSF等网元,并且每个网元都可以作为独立的Linux进程或Docker容器运行。这天然就是NFV架构的体现:网元软件化、服务化、可独立部署。UERANSIM则是一个用C++写的高层仿真器,它可以模拟手机UE和5G基站gNB,通过仿真无线接口与Open5GS核心网交互。虽然UERANSIM没有模拟真实的无线信道衰落,但它已经把NAS信令、RRC信令、PDU会话建立这些高层流程完整跑通了。

用这套组合,你可以在几分钟内搭起一个虚拟化的5G端到端系统,然后从终端发起ping和iperf流量,观察流量是怎么经过gNB、UPF再到外部网络的。这种环境的优点是你改的不是数学模型,而是真实的配置文件和容器编排文件,调试过程中遇到的就是真实分布式系统会遇到的问题:端口冲突、DNS解析失败、容器网络互通异常等。

3.3 选型对照表

维度纯仿真器(NS-3/OMNeT++)半实物仿真(Open5GS+UERANSIM+Docker)
协议层真实度取决于模块完善度高,跑真实协议栈实现
无线信道建模支持物理层与信道模型不模拟物理层,只模拟高层信令
NFV资源竞争抽象建模,需自行校准参数天然可见,使用真实CPU/内存/网络资源
仿真规模可支持大规模网络受物理主机资源限制,一般支持几十个终端
开发门槛需要编写脚本和模块代码需要熟悉Linux网络、容器和配置
适用场景系统级算法验证、大规模拓扑协议流程验证、NFV性能评估、切片编排实验

选择时不用纠结谁替代谁,两者是互补的:用半实物环境验证“有状态的信令流程和虚拟化部署”,再用纯仿真器把验证过的参数扩展到大规模无线网络场景。

4. 实操案例:用容器化VNF搭建5G核心网仿真环境

4.1 环境准备与总体拓扑

因为我手头是一台12核CPU、32GB内存的服务器,我用Docker Compose来编排Open5GS的核心网VNF,用UERANSIM跑在一个独立容器里充当UE和gNB。整体拓扑是这样的:

  • UE (UERANSIM) → gNB (UERANSIM) → AMF/SMF/UPF (Open5GS容器) → 数据网网桥 (docker bridge)
  • 每个Open5GS网元一个容器,分别是open5gs-amf、open5gs-smf、open5gs-upf、open5gs-nrf、open5gs-ausf、open5gs-udm、open5gs-pcf等。
  • UERANSIM使用两个进程:nr-ue模拟终端,nr-gnb模拟基站。

这里每一个容器本质上就是一个VNF实例。Open5GS官方提供了Docker Compose脚本,但我建议不要直接用官方一键版,手动拆分更有助于理解每个VNF之间的依赖关系。首先创建网络:

docker network create --subnet=192.168.20.0/24 o5gnet docker network create --subnet=192.168.21.0/24 dnnet

o5gnet用于核心网内部信令互通,dnnet用于UPF连接外部数据网络。物理主机上再开启IP转发,否则UPF无法把流量路由出去:

sysctl -w net.ipv4.ip_forward=1

4.2 部署核心网VNF容器

部署顺序上,先启动NRF,因为其它网元都要向它注册。NRF在服务化架构里相当于“电话簿”,AMF启动后会告诉NRF自己能处理哪些服务,SMF也会上报自己的能力。如果NRF没起来,其它网元之间就没法互相发现。

以AMF容器为例,它的核心配置包括PLMN、TAC、以及监听gNB的NGAP端口。我用docker run启动AMF并挂载配置文件:

docker run -d --name open5gs-amf --net o5gnet \ -p 38412:38412/sctp \ -p 7777:7777/udp \ -v /etc/open5gs/amf.yaml:/etc/open5gs/amf.yaml \ open5gs/open5gs-amf

38412是SCTP端口,gNB通过NGAP协议连接AMF;7777/udp是Open5GS各网元默认的SBI(Service Based Interface)端口。这里需要提醒一句:Docker默认不支持SCTP端口映射,要在Docker里用SCTP,必须在启动命令里添加--network host或者使用支持SCTP的CNI插件。如果跟我一样用bridge网络,gNB的SCTP连接会失败。

所以,实际生产环境里我更喜欢直接用docker compose配合network_mode: host,让每个容器共享宿主机的网络栈。一方面绕开SCTP端口映射问题,另一方面更接近真实NFV部署中“网元占用的就是物理网卡端口”的场景。虽然少了网络命名空间隔离,但仿真阶段的互通性会好很多。SMF和UPF也是类似方式部署,SMF要配置AMF地址以及UPF信息,UPF要配置SMF地址和数据网网卡名。

4.3 配置基站与终端模拟

UERANSIM启动前,需要配置gNB侧的IP地址和AMF地址。gnb.yaml里最关键的部分是rf,也就是频率相关参数,但UERANSIM并不真的发射频信号,它只是在逻辑上模拟NR空口,所以一般用rf.deviceName设为"UERANSIM",rf.deviceArgs跳过。

配置文件如下:

mcc: 001 mnc: 01 linkIp: 192.168.20.101 ngapIp: 192.168.20.101 gtpIp: 192.168.20.101 radio: band: 78 dlArfcn: 630000 ueAddress: 192.168.21.10

其中ngapIp是gNB向AMF发起NGAP连接的源地址,gtpIp是gNB建立GTP-U隧道用于用户面转发的IP。UE侧配置主要是选择gNB、填SIM卡参数:

supi: imsi-001010000000001 key: 465B5CE8B199B49FAA5F0A2EE238A6BC opc: E8ED289DEBA952E4283B54E88E6181CA amf: 8000 gnbSearchList: - 192.168.20.101

然后启动gNB和UE:

./nr-gnb -c gnb.yaml ./nr-ue -c ue.yaml

启动之后,UE会发起注册流程,经过gNB的RRC连接、NGAP初始UE消息、AMF鉴权、UDM签约校验之后,进入5GMM-REGISTERED状态。我建议用日志级别INFO来启动,观察UE状态从MM-DEREGISTERED到MM-REGISTERED的变化,这能帮你快速判断到底是哪一步没有通。

4.4 验证端到端业务与采集指标

注册成功后,下一步建立PDU会话,让UPF给UE分配一个IP地址。在UERANSIM里可以通过./nr-cli --exec "psa 1"或者直接在UE配置里预配置会话信息。会话建立成功后,UE会拿到一个192.168.21.x地址。此时在UE容器内执行ping:

ping -I uesimtun0 8.8.8.8

uesimtun0是UERANSIM自动创建的TUN接口,代表UE的数据面出口。如果ping通,说明端到端链路已经打通。

接下来我会采集三个最常用的NFV性能指标:

  • 各VNF容器的CPU和内存:用docker stats --no-stream,重点关注UPF和AMF的CPU占比。
  • NGAP和PFCP信令时延:在Open5GS开启full级别的日志,统计UE注册请求到注册接受之间的时间差。
  • 用户面吞吐:用iperf3在UE侧和UPF数据网侧各起一端,通过UPF转发测试吞吐量。

这些指标能直观反映虚拟化基础设施上的网元表现,比单纯看仿真曲线更可信。

5. 常见的坑与排查技巧实录

5.1 网卡桥接不通,终端一直RRC拒绝

我最初用Docker bridge网络部署时,UERANSIM的gNB始终无法完成SCTP连接,UE一直报RRC Reject。查日志发现,gNB发往AMF的SCTP INIT被丢弃了,原因就是Docker bridge网络和主机网络之间存在地址转换,而Open5GS的AMF绑定的动态端口在bridge模式下暴露不出来。后来改用network_mode: host部署所有核心网容器,SCTP才正常连接。

这个坑说明:半实物仿真里,“虚拟化”的边界不能太彻底。真实NFV部署时,网元往往跑在VM或容器里,但控制面信令对网络时延和地址访问很敏感,仿真时优先保证互通性,再考虑隔离性。

5.2 容器资源限制导致UPF转发性能暴跌

我试过给UPF容器加--cpus=0.5来模拟低配资源环境,结果iperf吞吐从900Mbps掉到不到200Mbps,但没有丢包。刚开始以为是Docker网络问题,后来用perf stat看了UPF进程,发现CPU占用长时间在100%,明显是处理不过来了。这其实是个很好的“假故障”:它模拟了NFV资源不足时的用户面性能退化。在做仿真时,如果你确实要模拟资源受限场景,建议不要直接限制CPU核数,而是通过cpu-shares配合高优先级任务来产生资源竞争,这样更接近多VNF共享资源池的真实情况。

5.3 时钟同步问题在仿真里被忽视

容器化仿真里,各VNF默认都使用宿主机的CLOCK_REALTIME,好像没有时钟同步问题,但当我同时在多台物理机上分布式部署NRF和AMF时,两个容器所在主机的时钟偏差直接导致SBI接口的Token鉴权失败。Open5GS的SBI服务之间没有做严格的时钟容错,一旦两个节点时间差超过几秒,服务注册就会间歇性失败。仿真时如果涉及多物理机,务必在所有宿主机上配置NTP服务,别因为“仿真嘛”省略这一步,否则你排查问题的时间会成倍增长。

5.4 仿真规模上不去怎么办

Open5GS + UERANSIM在单机上跑几十个终端毫无压力,但想模拟上千终端同时注册就会把单进程CPU耗光。如果你的实验规模需要上千个UE,我会这么处理:先用小规模半实物仿真采集每个VNF在高负载下的真实处理时延和资源使用曲线,然后把这些数据放到NS-3的NFV模型里作为每个网络功能节点的处理延迟参数,再跑大规模无线网络级仿真。这样既保留了半实物环境和协议的准确性,又让系统级仿真可以扩展到千级基站、万级终端的规模。这是一条我自己验证过的“半实物标定+纯仿真扩展”路径,推荐你按这个思路来设计实验。

做了这么多次5G网络仿真的NFV实验,我个人最深的体会有三点:一是不要把NFV建模停留在“把网元改成进程”的层面,要关注资源竞争、生命周期编排和隔离策略;二是不要迷信纯仿真器里的默认参数,最好从半实物环境里实测标定;三是遇到问题先查日志,Open5GS和UERANSIM的日志信息已经足够详细,大部分故障都能从日志里看到根因。这套方法目前在我手里已经稳定跑过多次5G核心网虚拟化仿真项目,也沉淀成了一套可复用的实验框架。如果你正准备在无线网络仿真里引入网络功能虚拟化,我建议从小规模端到端验证开始,再把规模逐步撑大。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询