2. DRX(非连续接收)基础:周期、窗口与定时器

DRX 这玩意儿,说白了就是让 UE 在没事干的时候睡大觉。你想想看,手机大部分时间都在那等着,要是时时刻刻监听 PDCCH,那电池撑不了多久。我刚开始接触 LTE 协议栈时,觉得 DRX 不就是个开关嘛,后来踩了不少坑才明白——这里面的定时器配合,才是真正的技术活。

2.1 DRX 的核心概念

先理清三个基本概念。它们就像 DRX 的骨架,搞懂了后面都好说。

  • DRX 周期:UE 从醒来一次到下一次醒来的总时长。周期越长,省电效果越好,但时延也会变大。
  • On Duration:UE 醒来监听 PDCCH 的那段时间。说白了就是「睁着眼睛」的窗口。
  • Opportunity for DRX:UE 可以关掉接收机去睡觉的时间段。这段时间里,UE 不需要监听任何下行控制信令。

嗯,这里要注意:Opportunity for DRX 并不是说 UE 一定在睡觉,而是说它可以睡觉。如果还有数据要收,协议栈会通过定时器把 UE 留在唤醒状态。

核心关系:DRX 周期 = On Duration + Opportunity for DRX。这个公式虽然简单,但实际调度时,两个定时器(onDurationTimer 和 drx-InactivityTimer)会动态改变 UE 的清醒时间。

2.2 三个关键定时器详解

DRX 的定时器就像闹钟和计时器的组合。我习惯把它们分成三类:

定时器名称 启动时机 停止条件 超时行为
onDurationTimer 每个 DRX 周期开始时 超时或进入 Active Time UE 进入 Opportunity for DRX
drx-InactivityTimer 收到新数据调度的 PDCCH 时 收到 MAC CE 或超时 UE 回到短/长 DRX 周期
drx-RetransmissionTimer HARQ 重传等待时 收到重传数据或超时 UE 停止监听该 HARQ 进程

2.2.1 onDurationTimer

这个定时器是 DRX 周期的「起床铃」。每个周期开始,UE 就启动它,然后开始监听 PDCCH。我记得有一次在优化 VoLTE 通话质量时,发现 onDurationTimer 设得太短,导致 UE 经常错过调度——那叫一个头疼。

典型配置值:

  • 短周期:2~10 ms
  • 长周期:10~200 ms
  • VoLTE 场景:建议 6~10 ms,保证语音包不丢

我的经验:onDurationTimer 不是越长越好。设长了确实能提高调度成功率,但 UE 醒着的时间也长了,省电效果打折扣。我一般从 6 ms 开始调,看 PDCCH 漏检率再往上加。

2.2.2 drx-InactivityTimer

这个定时器是「加班计时器」。UE 在 On Duration 期间收到 PDCCH 调度后,就会启动它。只要这个定时器在跑,UE 就一直保持清醒,继续监听 PDCCH。

为什么会这样?你想想看,如果刚收到一个数据包,很可能后面还有更多数据要来。这时候让 UE 直接去睡觉,那下一个包就得等下一个周期了,时延受不了。

我曾经在项目中遇到过一个问题:某个厂商的终端在下载大文件时,drx-InactivityTimer 设了 100 ms,结果每 100 ms 就要重新进入 DRX 再唤醒,反而更费电。后来改成 200 ms,吞吐量上去了,功耗反而降了。

避坑指南:drx-InactivityTimer 不能设得太小。如果小于 TCP 的突发间隔,UE 会在每个突发之间反复唤醒,省电效果适得其反。我建议至少设到 80~100 ms。

2.2.3 drx-RetransmissionTimer

这个定时器专门处理 HARQ 重传。当 UE 发送了数据但没收到 ACK,或者下行数据解码失败时,协议栈会启动这个定时器,让 UE 在重传窗口内保持监听。

嗯,这里有个容易搞混的地方:drx-RetransmissionTimer 和 drx-InactivityTimer 是独立的。即使 drx-InactivityTimer 超时了,只要还有 HARQ 重传在等,UE 也得醒着。

典型配置:

  • FDD 模式:8~16 ms
  • TDD 模式:根据上下行配比调整,一般 10~20 ms
  • 注意:这个值必须大于 HARQ RTT,否则重传还没到 UE 就睡了

2.3 DRX 状态机与定时器配合

光讲概念太抽象,我画了一张图,把 DRX 的完整流程串起来:

DRX 状态机与定时器配合流程 DRX 周期开始 启动 onDurationTimer 监听 PDCCH 收到调度? onDurationTimer 超时 启动 drx-InactivityTimer 进入 Opportunity for DRX 说明:收到调度后,drx-InactivityTimer 会延长 UE 的清醒时间;只有所有定时器都超时,UE 才真正进入睡眠

2.4 定时器配置实战建议

配置 DRX 定时器,说白了就是在省电和时延之间找平衡。我总结了几条经验:

  1. 先看业务类型:VoLTE 要求低时延,onDurationTimer 不能太短;网页浏览可以容忍一定时延,周期可以设长些。
  2. 注意定时器之间的耦合:drx-InactivityTimer 超时后,UE 会回到短 DRX 周期或长 DRX 周期。如果短周期设得太短,UE 可能刚睡下又被叫醒。
  3. HARQ 重传不能忘:drx-RetransmissionTimer 必须大于 HARQ RTT。我见过有人设了 4 ms,结果重传还没到 UE 就睡了,那叫一个惨。
  4. 实测验证:理论算得再好,也得拉到现网跑一跑。我习惯用路测工具抓 PDCCH 调度日志,看 UE 的 Active Time 占比,再微调参数。

一个小技巧:如果你不确定怎么配,可以用 3GPP 36.331 里的默认值做起点。默认的 onDurationTimer 是 6 ms,drx-InactivityTimer 是 100 ms,drx-RetransmissionTimer 是 8 ms。大部分场景下,这个组合都不会出大问题。

2.5 常见误区

最后聊几个我踩过的坑:

  • 误区一:认为 DRX 周期越长越省电。其实周期太长会导致 UE 频繁进入深睡眠,醒来时同步开销更大,反而费电。
  • 误区二:把 drx-InactivityTimer 设成 0。这样 UE 收到一个包就去睡觉,下一个包就得等下一个周期,吞吐量直接腰斩。
  • 误区三:忽略短 DRX 周期。长周期省电但时延大,短周期时延小但费电。我建议两个周期都配,让 UE 根据业务动态切换。