想象一个巨大的快递分拣中心。卡车从全国各地运来包裹,每个包裹上都贴着不同颜色的标签——红色代表加急,蓝色代表普通,绿色代表冷链。分拣中心的任务,就是把这些五颜六色的包裹分配到不同类型配送车上:加急车、普通车、冷链车。
在5G网络中,SDAP层就是这个"分拣中心"。包裹就是你的数据包(视频流、语音、网页浏览……),颜色标签就是QFI(QoS Flow Identifier),配送车就是DRB(数据无线承载)。SDAP站在数据进入无线链路的最后一道关卡,决定"这个数据包该上哪辆车"。
如果你在4G(LTE)时代工作过,可能会问:4G没有SDAP层,数据不照样传输吗?为什么5G非要加这一层?
答案藏在5G对QoS架构的彻底重构里。
4G LTE的QoS基本单位是EPS Bearer(演进分组系统承载)。每个EPS Bearer是一根从手机到PGW的完整"管道",拥有独立的QoS参数(QCI、ARP、GBR/MBR)。这根管道穿过无线侧(Uu接口)、传输侧(S1-U接口)、核心网侧(S5/S8接口),端到端绑死。
4G: 一个EPS Bearer = 一根端到端管道
手机 ────[EPS Bearer 1 (QCI=1 VoLTE)]──── eNodeB ────[EPS Bearer 1]──── SGW ────[EPS Bearer 1]──── PGW
手机 ────[EPS Bearer 2 (QCI=9 Internet)]─── eNodeB ────[EPS Bearer 2]──── SGW ────[EPS Bearer 2]──── PGW
这套架构的问题在于:太僵硬。想加一种新的QoS级别?得新建一整根管道,涉及NAS信令、RRC信令、GTP隧道建立——信令开销大、时延长。手机同时用10种业务?理论上可能需要10个EPS Bearer,资源浪费严重。
5G用QoS Flow取代了EPS Bearer,作为QoS的最细粒度。一个PDU Session(相当于4G的PDN Connection)内可以包含任意多个QoS Flow,它们共享同一根N3 GTP隧道,仅靠QFI标签区分。
graph LR
subgraph "4G LTE QoS架构"
A1[手机] -->|EPS Bearer 1<br/>QCI=1 VoLTE| B1[eNodeB]
A1 -->|EPS Bearer 2<br/>QCI=9 上网| B1
A1 -->|EPS Bearer 3<br/>QCI=6 视频| B1
B1 -->|各自独立GTP隧道| C1[SGW/PGW]
end
subgraph "5G NR QoS架构"
A2[手机] -->|DRB 1<br/>QFI=1语音+QFI=6视频| B2[gNB]
A2 -->|DRB 2<br/>QFI=9上网+QFI=7下载| B2
B2 -->|共享N3隧道<br/>QFI在GTP头中| C2[UPF]
end
style A1 fill:#ffcccc
style A2 fill:#ccffcc
核心区别在于:5G把"QoS管理"和"传输隧道"解耦了。多个QoS Flow可以复用一条隧道,也可以映射到同一个无线承载。这种灵活性需要一个专门的协议层来管理映射关系——这就是SDAP存在的理由。
SDAP(Service Data Adaptation Protocol,服务数据适配协议)只有两个核心功能:
| 功能 | 说明 |
|---|---|
| QoS Flow → DRB映射 | 决定每个QoS Flow的数据包走哪个无线承载 |
| QFI标记 | 在数据包中写入或读取QoS Flow Identifier |
简洁到极致。但正是这种简洁,支撑了5G灵活的QoS架构。
SDAP是5G NR协议栈中唯一的新增层(相比4G)。它位于用户面协议栈的最顶端,紧贴在应用数据之下、PDCP之上:
graph TB
subgraph "5G NR 用户面协议栈"
APP[应用层数据<br/>视频/语音/网页/下载]
SDAP["<b>SDAP层</b><br/>QoS Flow → DRB映射<br/>QFI标记"]
PDCP[PDCP层<br/>加密/完整性保护/头压缩]
RLC[RLC层<br/>分段/ARQ]
MAC[MAC层<br/>复用/调度]
PHY[物理层<br/>调制/发射]
end
APP --> SDAP --> PDCP --> RLC --> MAC --> PHY
style SDAP fill:#4CAF50,color:white,stroke:#333
注意几个关键点: - SDAP只在用户面存在,控制面(SRB)不经过SDAP - 每个PDU Session对应一个SDAP实体 - 每个SDAP实体管理该PDU Session内所有QoS Flow到DRB的映射
SDAP的映射遵循三条不可违反的铁律:
$$ \text{Rule 1: } QoSFlow_i \rightarrow DRB_j \quad \text{(一个QoS Flow只映射到一个DRB)} $$
$$ \text{Rule 2: } DRB_j \rightarrow {QoSFlow_1, QoSFlow_2, ..., QoSFlow_n} \quad \text{(一个DRB可承载多个QoS Flow)} $$
$$ \text{Rule 3: } \exists DRB_{default} \in \text{PDU Session} \quad \text{(每个PDU Session至少有一个默认DRB)} $$
用日常类比来理解:
SDAP支持两种映射方式,这是5G相对于4G的重大创新:
graph TD
A[QoS Flow → DRB 映射方式] --> B[显式映射<br/>Explicit Mapping]
A --> C[反射式映射<br/>Reflective Mapping]
B --> B1["gNB通过RRC信令<br/>直接告诉UE映射规则"]
B --> B2["适用:所有QoS Flow类型"]
B --> B3["信令开销:较大"]
C --> C1["UE从下行数据包中<br/>自行学习映射关系"]
C --> C2["适用:Non-GBR类型QoS Flow"]
C --> C3["信令开销:极小"]
style B fill:#2196F3,color:white
style C fill:#FF9800,color:white
这是最直观的方式。gNB通过RRC Reconfiguration消息中的SDAP-Config信元,明确告诉UE"QFI=X的流量走DRB=Y"。
RRC配置中包含的关键参数:
| 参数 | 含义 |
|---|---|
mappedQoSFlowsToAdd |
新增映射到此DRB的QFI列表 |
mappedQoSFlowsToRelease |
从此DRB移除映射的QFI列表 |
sdap-HeaderDL |
下行SDAP头:present(启用)或 absent(禁用) |
sdap-HeaderUL |
上行SDAP头:present或absent |
defaultDRB |
此DRB是否为默认DRB |
reflectiveQoS |
是否启用反射式QoS |
这是5G最巧妙的QoS机制之一。核心思想:UE通过观察下行数据的映射关系,自动学习上行应该怎么映射。
工作流程: 1. gNB在下行数据包的SDAP头中设置 RDI=1(Reflective QoS flow to DRB mapping Indication) 2. UE收到后,记录"QFI=X的下行数据走了DRB=Y" 3. UE创建一条反射式QoS规则:当上行有QFI=X的数据时,也走DRB=Y 4. 这条规则有定时器保护,超时未刷新则自动删除
反射式映射的精妙之处在于:完全不需要上行信令。gNB只需在下行数据包中打个标记,UE就"心领神会"地照做。
当一个QoS Flow的数据包到达SDAP实体时,SDAP按以下优先级决定映射到哪个DRB:
| 优先级 | 条件 | 动作 |
|---|---|---|
| 1 | 有显式RRC配置的QoS Flow → DRB映射 | 使用配置的DRB |
| 2 | 有反射式映射规则(且未超时) | 使用反射学习到的DRB |
| 3 | 以上均无 | 使用默认DRB |
这个设计哲学非常清晰:显式配置优先,自主学习次之,兜底机制保底。
SDAP头部只有两种长度:1字节或2字节(扩展QFI场景)。在最常用的1字节格式中:
SDAP Data PDU Header (1 byte):
┌─────┬──────────────────────┬─────┐
│ R │ QFI (6 bits) │ RDI │
│ 1bit│ │1bit │
└─────┴──────────────────────┴─────┘
SDAP Data PDU Header (2 bytes, 扩展QFI):
┌─────┬──────────┬─────┬─────┬──────────────────┐
│ R │ QFI(6bit)│ RDI │ EI │ Extended QFI(8bit)│
└─────┴──────────┴─────┴─────┴──────────────────┘
| 字段 | 比特数 | 说明 |
|---|---|---|
| QFI | 6 | QoS Flow Identifier,范围0~63,标识数据包属于哪个QoS Flow |
| RDI | 1 | Reflective QoS flow to DRB mapping Indication,置1时UE创建反射式映射规则 |
| R | 1 | 保留位 |
| EI | 1 | Extension Indicator,置1时表示有扩展QFI字节 |
| Extended QFI | 8 | 扩展QFI,范围0~255(Release 17+支持更多QoS Flow) |
关键细节:SDAP头部可以被完全省略。当DRB只承载一个QoS Flow时,SDAP头配置为absent,省下每包1字节的 overhead。这在高速业务(如视频流)中能节省可观的带宽。
SDAP只有一种控制PDU:End-Marker。当某个QoS Flow从DRB-A切换到DRB-B时,UE在DRB-A上发送End-Marker,告诉gNB"这个QoS Flow在DRB-A上结束了,后续数据请看DRB-B"。这保证了映射切换时不丢包、不乱序。
让我们跟踪一个数据包从应用到空口的完整旅程:
sequenceDiagram
participant App as 应用层
participant SDAP as SDAP层
participant PDCP as PDCP层
participant RLC as RLC层
participant MAC as MAC层
Note over App,MAC: 场景:手机同时进行视频通话和下载文件
App->>SDAP: 视频数据包(QFI=1,GBR)
SDAP->>SDAP: 查找映射规则<br/>QFI=1 → DRB 1(显式配置)
SDAP->>SDAP: 添加SDAP头:QFI=1
SDAP->>PDCP: 映射到DRB 1
App->>SDAP: 文件下载数据包(QFI=9,Non-GBR)
SDAP->>SDAP: 查找映射规则<br/>QFI=9 → 无显式配置<br/>检查反射式规则
alt 有反射式规则
SDAP->>SDAP: 使用反射学习到的DRB
else 无反射式规则
SDAP->>SDAP: 使用默认DRB
end
SDAP->>SDAP: 添加SDAP头:QFI=9
SDAP->>PDCP: 映射到默认DRB
Note over PDCP,MAC: 后续PDCP/RLC/MAC层处理<br/>加密→分段→复用→调度→发射
PDCP->>RLC: DRB 1数据(加密后)
PDCP->>RLC: 默认DRB数据(加密后)
RLC->>MAC: 逻辑信道DTCH复用
MAC->>MAC: 调度与TBS组装
当网络侧决定调整映射关系时(如负载均衡、QoS策略变更),流程如下:
mappedQoSFlowsToAdd/Release| 维度 | 4G LTE(EPS Bearer) | 5G NR(QoS Flow + SDAP) |
|---|---|---|
| QoS粒度 | 承载级(EPS Bearer) | 流级(QoS Flow),更细 |
| 映射协议 | 无专门层,靠NAS/E-RAB管理 | 专门SDAP层 |
| 映射灵活性 | 1 Bearer绑定1套QoS参数 | 多QoS Flow可复用1个DRB |
| 上行映射学习 | 不支持,完全依赖NAS信令 | 支持反射式映射,省信令 |
| 隧道效率 | 每个Bearer独立GTP隧道 | 多QoS Flow共享N3隧道 |
| 新业务QoS建立 | 需新建Bearer(信令重) | 在已有PDU Session内加Flow(信令轻) |
| QoS标识范围 | QCI 0~9(9个标准化值) | 5QI 0~255+(更多标准化值+扩展) |
| SDAP头开销 | 无 | 0~2字节(可省略) |
这个对比揭示了一个核心设计哲学的转变:4G是"粗管子"思维,5G是"细标签"思维。在5G中,网络不再是为一类业务建一根管,而是在一根共享管道里用标签区分不同业务,由SDAP层完成精细化的标签到管道映射。
在分析5G用户面问题时,SDAP层的信息可以帮助你判断: - 数据包是否被映射到了正确的DRB - 反射式QoS是否生效(检查RDI位) - QFI值是否与核心网下发的QoS Profile一致
调试技巧:如果发现某个业务的QoS不达标,用Wireshark解析SDAP头,确认QFI→DRB映射是否正确。常见问题是默认DRB承载了本该走专用DRB的GBR业务。
gNB会控制DRB的数量(典型最多8个DRB/PDU Session)。多个QoS Flow复用DRB时,需要确保QoS特性相近的Flow被分到一起。如果调度器不能在同一TTI内公平地服务差异大的Flow,就可能导致QoS劣化。
反射式映射依赖定时器(典型值数十秒)。如果下行数据流长时间中断,反射式规则可能超时被删,导致上行数据回退到默认DRB。在视频通话场景中,这可能表现为短暂的上行质量下降。
当5G语音回退到4G时,5G的QoS Flow映射需要转换为4G的EPS Bearer映射。SDAP层在切换过程中会被"移除",QoS Flow → DRB的映射关系转为EPS Bearer的 TFT规则。理解这个转换过程,对排查语音回退问题至关重要。
Q: 为什么4G不需要SDAP层,5G就非要加一个?
A: 4G的EPS Bearer架构中,QoS和无线承载是"绑死"的——一个Bearer就是一条从手机到PGW的完整管道,QoS参数随管道走,不需要额外映射。5G将QoS Flow和DRB解耦,多个QoS Flow可以复用同一个DRB、同一条N3隧道,因此需要一个"翻译层"来管理"哪个Flow走哪个DRB"——这就是SDAP。
Q: 反射式QoS和显式QoS可以同时使用吗?
A: 可以。同一个PDU Session内,部分QoS Flow用显式映射(如GBR业务),部分用反射式映射(如Non-GBR业务)。但反射式映射只能用于Non-GBR类型的QoS Flow,GBR业务必须走显式映射,因为GBR对资源保障有严格要求,不能依赖"自学"。
Q: 默认DRB有什么特殊之处?
A: 默认DRB是"兜底承载"。任何没有被显式或反射式映射到特定DRB的QoS Flow,都会走默认DRB。每个PDU Session必须有且仅有一个默认DRB,它在PDU Session建立时随第一个DRB一起创建,直到PDU Session释放才消失。在RRC信令中,SDAP-Config的defaultDRB标志标识了它。
Q: SDAP头什么时候可以省略?
A: 当一个DRB只承载一个QoS Flow时,SDAP头可以被禁用(配置为absent)。因为只有一个Flow,不需要QFI来区分——所有经过这个DRB的数据必然属于那个唯一的QoS Flow。这在高速业务(如视频流)中每包省1字节,累积效果可观。
Q: SDAP的End-Marker PDU在什么场景下会用到?
A: 当某个QoS Flow的映射从一个DRB切换到另一个DRB时(如gNB负载均衡调整映射),UE在旧DRB上发送End-Marker。gNB收到后知道该QoS Flow在旧DRB上结束了,后续数据应从新DRB接收。没有End-Marker,gNB可能误以为旧DRB上还有数据在路上,导致映射切换不干净。
本文由「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 等场景全覆盖。
