ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

5G前传抓包实战:用Wireshark拆解eCPRI协议报文

5G前传抓包实战:用Wireshark拆解eCPRI协议报文 干过前传链路的人都知道CPRI 这个缩写几乎天天挂在嘴边但真正打开 Wireshark 对着基站前传协议抓包、把帧结构一层层扒开的机会并不多。原因很现实4G 时代 CPRI 跑在专用光纤上用的是类似 SDH 的比特流承载普通网卡根本接不进去到了 5G 时代前传协议演进到 eCPRI直接跑在标准以太网上这一下就给 Wireshark 分析打开了口子。这篇文章我就按自己的实际排查经验从 CPRI 为什么被替换讲起再把 eCPRI 协议栈和消息类型拆开最后手把手带你把一个 eCPRI 报文从 MAC 层看到 UDP、再从 eCPRI 头部看到 IQ 数据字段整个过程全用 Wireshark 完成。适合刚接触 5G 前传的研发、测试、运维同学也适合想弄明白“基站 BBU 到天线之间到底传了什么”的通信爱好者。1. 前传链路在基站里扮演什么角色1.1 从 DRAN 到 CRAN前传的位置怎么变无线基站的传统架构分成了 BBU基带处理单元和 RRU/RRU远端射频单元。BBU 负责基带信号处理RRU 负责射频收发和功放。两者之间的这一段链路行业里叫前传fronthaul原来在 4G 时代多是 DRAN 组网BBU 和 RRU 就放在同一个机房或者相距几百米的站址上中间用光纤直连。到了 5G 大规模建设时期CRAN 组网变成主流BBU 集中到中心机房RRU 分布在城市各个站址中间的距离可能拉到 10 公里以上前传链路的角色就不只是“连接”这么简单了它直接决定了整个无线接入网的时延、带宽和同步性能。前传链路传的到底是什么取决于 BBU 和 RRU 之间的功能切分点在哪里。切分点越靠前前传需要传的数据量越大切分点越靠后RRU 需要做的处理越多。这个切分点的选择正是 CPRI 和 eCPRI 最本质的区别。我刚入行时看到一堆缩写也头疼后来把这条链路的演进捋清楚了后面所有报文分析都顺了。1.2 CPRI 帧结构核心参数无线帧、超帧、基本帧CPRICommon Public Radio Interface定义了 BBU 和 RRU 之间的数字接口。它是 TDM 结构不是报文交换结构数据在光纤上按固定帧节奏持续不断地流动。CPRI 的帧结构有三层嵌套关系和 LTE 的无线帧结构有对应理解起来可以比照着看。无线帧Radio Frame周期 10ms和 LTE/NR 的无线帧长度一致。超帧Hyperframe1 个无线帧包含 150 个超帧所以超帧周期约 66.67us。基本帧Basic Frame1 个超帧包含 256 个基本帧每个基本帧长度约 260.42ns这个时间正好对应 3.84MHz 的基本时钟频率。基本帧的实际内容分成两类信息流一类是 IQ 数据也就是每个天线载波采样的 I/Q 序列另一类是控制字承载同步、信令、操作维护等管理信息。每个基本帧内部再按照线速率等级划分成若干字word通常第一个字留给控制信息或同步其余位置按固定的时隙映射关系排队填入多个天线的采样点。如果你用协议分析仪抓一条 CPRI 链路你会看到 2457.6Mbps、4915.2Mbps 甚至 9830.4Mbps 的线速率选项这些都是常见的 CPRI 接口速率。我最开始愣是没看懂控制字的位置后来对着规范里的“每超帧第一个基本帧用于控制字”这句话琢磨了很久才明白CPRI 并不是为每一个 IQ 采样单独加一个包头而是每 256 个基本帧集中传一段控制字这样能把额外开销压得很低适合 TDM 传输。代价是灵活性差所有天线载波的发射和接收采样必须在时隙上严格排列想动态调整带宽和用户数基本不可能。1.3 为什么 5G 时代 CPRI 扛不住了做前传规划时算一笔账就明白了。以 5G 一个典型 100MHz 带宽、64T64R 的宏站为例NR 上行采样率约 122.88Msps一个采样点按 I 路 16bit、Q 路 16bit 算一共 32bit64 个通道加起来就是122.88 × 10^6 × 32bit × 64 ≈ 251.7Gbps这只是纯 IQ 数据还没算 CPRI 控制字、同步开销、8B/10B 线路编码等。CPRI 最高的接口速率选项也就 24.33Gbps离 250Gbps 这个量级差了一个数量级。所以到了 5G 时代继续沿用 CPRI 前传在工程上完全不可行不是说光模块便宜贵的问题而是物理上根本灌不进去。这个问题逼出了新的思路不能对 64 通道的时域采样做透传而是把部分基带处理下沉到靠近天线的设备里让前传链路只传处理后的数据。也就是下一代 RAN 分布式单元的诞生以及 eCPRI 标准的提出。2. eCPRI 的登场协议栈与消息类型2.1 功能切分的思路转变eCPRIenhanced CPRI是在 2017 年前后由 eCPRI 行业协会发布的后来在 O-RAN 架构里继续作为底层传输方案之一。它没有沿用 TDM 位流而是直接选择以太网作为承载。这个决定的直接好处是前传设备不需要专用的帧结构芯片普通的交换机、光模块、网卡就能承载Wireshark 也因此有了用武之地。功能切分上eCPRI 把原来的 PHY 层在 BBU 一侧拆开原来在 BBU 里完成的大部分物理层处理继续放在 DU分布单元射频相关的最低层处理放在 RU远端单元。典型切分点是在 FFT/IFFT 之后也就是说前传链路不再传高数据率的时域采样而是传频域的复数 IQ 信号一个物理资源块PRB的数据量远低于时域采样。配合波束赋形等 5G 特性传输速率可以降一到两个数量级。我实际做前传扩容时看到 eCPRI 链路的单端口速率从上百 Gbps 降到 25G 甚至 10G整条链路的成本压力瞬间就下来了。这就是切分点选择的直接体现。2.2 eCPRI 协议栈怎么搭eCPRI 本身并不是从物理层重新发明的协议栈它是在标准以太网之上增加了一层 eCPRI 协议头再承载各种消息。常见封装顺序是以太网 MAC 头 可选的 VLAN Tag IP 头 UDP 头 eCPRI 通用头 eCPRI 消息体。为什么用 UDP 而不是 TCP这是最关键的设计取舍。前传链路对时延极其敏感TCP 的重传机制意味着延迟不可控根本不能用UDP 虽然不保证可靠但配合底层无损网络比如数据中心里常见的流控和优先级调度可以把丢包率压到极低。数据丢失的问题在 eCPRI 协议栈内部也有兜底比如携带 sequence ID 用于检测丢包。所以你在 Wireshark 里看到的绝大多数 eCPRI 报文封装都是 UDP目的端口由厂家自定义常见的有 38472 等也有的直接用 5000、60000需要根据现网确定。2.3 eCPRI 消息类型 0 到 7 分别干什么eCPRI 通用头里的 message type 字段决定后续报文的用途这是分析报文时第一个要看的字段。规范里定义了 0 到 7 共 8 种消息类型我整理成一张速查表类型消息名称典型用途0IQ Data用户面数据承载各天线载波的频域 IQ 采样流量占比最高1Bit Sequence传送比特序列数据偶尔用于特殊控制或同步场景2Real-Time Control Data实时控制面数据用于载波配置、增益调整等即时控制消息3Generic Data Transfer非实时控制面数据承载通用管理信息4Remote Memory Access远程内存读写的请求和响应用于设备调试和寄存器操作5One-Way Delay Measurement单向时延测量用于计算前传链路的时间同步偏差6Remote Reset远程复位通知由主设备向从设备发起7Event Indication事件上报比如设备告警、状态变化等信息实际生产链路里几乎全是类型 0 的 IQ Data偶尔能看到类型 2 的实时控制和类型 7 的事件通知。类型 5 单向时延测量报文也很重要通常在系统启动或者同步异常时出现抓包时如果看到这个类型大概率是在做时间同步校准。3. 用 Wireshark 逐层拆解 eCPRI 帧3.1 抓包环境搭建eCPRI 跑在以太网上理论上普通的千兆网卡就能抓但实际抓包要考虑带宽和镜像接入方式。我建议的典型环境是这样DU 侧和 RU 侧的接入交换机开启 SPAN 端口把前传物理口的上行和下行流量镜像到一台抓包服务器。抓包服务器至少配双口千兆网卡如果前传是万兆就用带万兆口的服务器用 Wireshark 打开网卡时选择好正确的接口。实验室没有现成前传话务流时可以用 FPGA、商用测试仪表或者开源仿真工具生成 eCPRI 报文灌入线路。之前我在实验室里就是用测试仪表打流再通过交换机镜像口抓包Wireshark 里瞬间就能看到一片类型 0 的 IQ Data 报文后续分析用的样例就是这么来的。选网卡时有一点必须提醒想准确测量前传时延普通网卡的时间戳精度不够最好用支持 PTP 硬件时间戳的网卡比如 Intel X710 系列并把 Wireshark 的抓包接口时间戳模式调到位。如果只是分析协议帧结构和丢包普通千兆网卡完全够用。3.2 Wireshark 基础配置与 eCPRI 识别Wireshark 从 2.4 版本开始就内置了 eCPRI 解析器新版基本都自带。打开抓到的 pcapng 文件后正常情况下协议列里会显示 eCPRI。如果显示的是 UDP 而没有识别为 eCPRI原因通常是 Wireshark 不知道哪个 UDP 端口对应 eCPRI。处理方法有两种第一种选中任意一条 UDP 报文右键选择 Decode As在列表中把 UDP 端口的解析协议指定为 eCPRI保存后整个会话都会按 eCPRI 解。第二种用显示过滤器过滤出对应端口后再用 tshark 指定协议解析。最常见的情况是 Wireshark 无法自动识别厂商自定义端口这种情况强制 Decode As 能解决 99% 的问题。剩下 1% 是因为抓包工具在 PCAP 层面已经把数据截断了属于配置问题第 4 部分专门讲。在正式分析前我建议先把显示列改成方便看 eCPRI 的组合。点击任一列头右键选择 Column Preferences添加三列ecpri.messageType、ecpri.pcId、ecpri.seqId。这样列表里每个报文是 IQ 数据还是控制消息、属于哪个物理信道、序号是否连续都一眼就能看到排查丢包时特别有用。3.3 一个实际报文从头拆到尾我拿一条典型的类型 0 IQ Data 报文来演示。抓包后在 Wireshark 中间窗格展开从上往下看第一层是 Ethernet II。源 MAC 是 RU 侧设备接口的 MAC目的 MAC 是 DU 侧设备的 MAC。如果网络里配置了 VLAN则会多一层 802.1Q其中 VLAN ID 的规划在现网有一定含义我曾经根据 VLAN ID 很快定位出某个物理站点的前传流量被接到了错误的汇聚交换机上所以别嫌 VLAN 信息简单排障时是重要线索。第二层是 IP 层。前传链路组网比较简单一般一个 DU 对一个 RU 用一段独立网段源和目的地址都是固定的。注意 IP 头里的 ToS / DSCP 字段前传流量通常会被打上高优先级标记比如 EF 或 CS7如果抓包时发现优先级和规划不符基本就是 QOS 配置错位。第三层是 UDP。源端口和目的端口由厂商定义固定分配。eCPRI 规范没有强制端口号所以不同设备厂商用的端口不一样。像我接触过的某家设备用 38472另一家用 5000无法一概而论抓包前最好先问设备侧同事要端口配置或者干脆先抓全量包再看。第四层是 eCPRI。这个头部一共 8 字节分几个字段revision4bit协议版本当前一般是 0。messageType8bit报文类型类型 0 就是 IQ Data。payloadSize16bit消息体长度单位是字节。消息专用头对于类型 0 消息后续是 PC_ID2字节和 sequence ID2字节。PC_ID 表示物理信道标识承载了天线编号和载波编号两个信息。实际看的时候要把 PC_ID 拆出来高 8bit 天线编号低 8bit 载波编号不同厂家定义可能有细微差别。最后的 sequence ID 是丢包排查的关键。它是个递增计数类型 0 消息按顺序发下来如果 Wireshark 里看到 0、1、2、4、5中间缺了 3说明链路丢了 eCPRI 报文不是物理层错包就是交换机拥塞丢帧。这个判断方法比看 CRC 错误快得多。再往下就是 IQ Data 的 payload。这部分是频域采样复数数据承载了多少个 RE、layer 数多少必须结合物理信道的配置才能完全解析。Wireshark 不会像解码 UDP 端口那样帮你把 IQ 点的物理含义全部解出来因为每家的资源映射规则不一样。我们在现场通常是靠 Wireshark 的字节流导出功能把 payload 部分导出来再用自研脚本关联 PRB 分配得到星座图这个联动分析法是我做前传信号质量排查时的核心手段。3.4 时延测量和双向消息交互怎么看前传时延过大直接影响无线侧的 HARQ 时序和同步。用 Wireshark 做基础时延分析最简单的方法是看单向时延测量报文类型 5。类型 5 的请求方在消息里携带发送时间戳响应方收到后在响应消息里带上接收时间戳和发送时间戳再把响应发回来请求方就能算出单向延迟和往返延迟。在 Wireshark 里把时间显示列设置成相对时间或者绝对时间然后过滤ecpri.messageType 5把成对的请求和响应报文找出来用时间差值算出的往返时延基本靠谱。如果想连续观察建议加一个计算列内容是frame.time_delta_displayed也就是每一帧和上一帧的时间间隔类型 5 请求和响应如果间隔突然拉大说明链路出现拥塞排队。对于时间同步相关的分析还要去抓 PTP1588v2报文。eCPRI 时间同步常依赖 PTP over Ethernet分析时用ptp过滤器过滤看 Sync、Follow_Up、Delay_Req、Delay_Resp 四条消息的往返时间戳就能算出主从时钟偏差。Wireshark 对 PTP 解码已经很完善了甚至可以单独统计修正域。4. 常见问题排查与实操避坑4.1 抓不到 eCPRI 包怎么办抓不到包有几个高频原因按优先级排查。第一SPAN 镜像配置错误。很多交换机默认只镜像收到的入流量不镜像出方向流量或者镜像口带宽超过上联口导致丢包。验证方法是确认 SPAN 会话同时抓 ingress 和 egress并用简单的 ping 大包测试镜像是否正常。第二抓包服务器的网卡校验和卸载导致报文异常。Windows 下比较常见网卡启用了 TCP/IP Offload、Large Receive OffloadLRO、Generic Receive OffloadGRO之后驱动可能在硬件层把多个报文合并再提交给 Wireshark这时抓到的已经不是原始帧了看起来像多包合流严重时直接看不到小包。解决方法是到网卡高级属性里关闭 LRO/GRO、RSS 和所有流控选项再用tshark -i验证。第三前传链路开了巨型帧Wireshark 默认没抓到完整 MTU。如果 eCPRI 报文长度超过 1518 字节网卡或抓包软件按默认 1514 字节截断就会丢尾部数据类型 0 的大报文解析出来不完整。确认网卡 MTU 是否调到 9000并且在 Wireshark 抓包选项里把每个包的长度限制调到最大。4.2 为什么只显示 520 字节怎么显示 2090 字节这个现象我在给同事做 Wireshark 培训时被问过不止一次。一条本应 2090 字节的报文在报文列表和详情里只显示了 520 字节后面的内容全被截断原因基本是抓包长度限制snaplen被设置成了 520 字节。Wireshark 默认能抓整个帧但某些抓包工具或网卡驱动会把截断长度设得很小后果就是数据只记了前 520 字节用于协议头分析还行看完整载荷完全不够。解决办法是在抓包时设置正确的抓包长度。图形界面下Capture Options 里有一项“Limit each packet to”把它改成 65535 或直接取消勾选。用 tshark 命令行时加-s 65535参数例如tshark -i eth0 -s 65535 -w front.pcapng设置完重新抓包新的文件里就能看到完整的 2090 字节报文。要提醒的是旧抓包文件里被截断的数据是补不回来的只能重新抓。另外打开 pcapng 文件时 Wireshark 会提示“Packet size limited during capture”看到这个提示就说明抓包文件本身被截断了但分析时无法还原这是硬伤。4.3 时间戳不准确导致时延算不准Wireshark 默认用的是主机时钟的时间戳普通网卡的硬件时间戳精度通常是微秒级对分析毫秒级的前传时延勉强够用但一旦链路时延本来就是几十微秒量级或者 CPU 出现调度波动抓包软件记录时间戳的瞬间就可能引入几百微秒甚至毫秒的误差这时候算出来的单向时延完全不可信。要精确测量前传时延我建议用支持 IEEE 1588 硬件时间戳的网卡并在网卡驱动里启用 RX/TX 硬件时间戳Wireshark 界面的接口信息里可以看到时间戳精度有没有切到 nanoseconds。还有一个土办法把同一台交换机镜像口的双向流量同时打上 PPS 信号用 PTP 报文来校准抓包主机的时间偏移。但这套操作复杂度高日常协议分析用不到只有做交付验收或者投诉定位时才需要较真。4.4 实用过滤器和 tshark 快速提取分析 eCPRI 前传流量我有一组固定的过滤器直接复制就能用只看 eCPRI 所有报文ecpri只看 IQ 数据ecpri.messageType 0只看实时控制消息ecpri.messageType 2看某个物理信道天线/载波ecpri.pcId 0x103看某个 UDP 端口udp.port 38472看源 MAC 为某个 RUeth.src xx:xx:xx:xx:xx:xx找丢包序列号不连续可以先按 PC_ID 过滤再观察 seqId 列是否跳跃用 tshark 做批量提取也很方便。比如我想统计每条消息类型的数量tshark -r front.pcapng -T fields -e ecpri.messageType | sort | uniq -c想看某个 PC_ID 的序列号范围tshark -r front.pcapng -Y ecpri.messageType 0 ecpri.pcId 0x103 -T fields -e ecpri.seqId | head -100压测时我会用 tshark 把 seqId 导出来再丢进脚本里查断点比在图形界面里人肉滚动快得多。这也是从“会用 Wireshark”到“会高效分析前传抓包”的分水岭。4.5 个人实操心得先查标准再上工具我的经验是真正到现场前先把 eCPRI 规范里 message type、PC_ID 和 sequence ID 的定义吃透比自己拿着 Wireshark 瞎试效率高太多。早期我分析类型 0 报文时光区分天线号和载波号就绕了好几天后来翻文档确认厂商的 PC_ID 编码规则一次性解决。别嫌前期查文档麻烦。在实验室有条件的话建议先用测试仪表生成固定序列的 eCPRI 报文把 Wireshark 的显示列、Decode As、过滤器全部调好确认能正确解析连续的小报文和大报文再上真实链路。这样到了生产环境你看到列表里 eCPRI 类型和序列号的瞬间链路状态基本心里就有数了。最后再提醒一个细节无论做协议分析还是故障排查抓包的同时记得开启多文件自动切割每 500MB 或者每 10 分钟切一个文件因为前传流量跑满时带宽极高单个文件分钟级就能过 GB不切文件的话后面分析一次卡爆一次这一条在长时间抓包定位偶发丢包时尤其好用。
返回列表