来自知识星球

P-CSCF如何根据SDP参数的取值映射到Rx接⼝的Max-Requested-Bandwidth参数

这个问题的背景是:
1)5GC要为上层语音业务建专有Qos流(GBR)来提供Qos保证;
2)而上层的语音业务Qos是通过协商的SDP结果来确定Qos的;
3)因此,P-CSCF要做一件事情,就是把SDP中的参数,映射到Rx接口(以后是基于SBI的N5接口)的
Diameter参数中,发给PCF来执行策略,并触发专有Qos流的建立。
如何映射的规则在TS29.513的7 QoS Parameters Mapping中有详细介绍。
其中,有一个关键参数是Max-Requested-Bandwidth,
它又包括Max-Requested-Bandwidth-DL和Max-Requested-Bandwidth-UL。
用于IMS向5GC/EPC请求上行/下行IP流最大带宽(bit/s)。
最终这个带宽会作为IMS音频/视频业务的GBR Qos参数。
因此非常重要。
那Max-Requested-Bandwidth这个参数是如何从SDP的参数里映射过来的呢?
映射规则在29513的Table 7.2.3-1: Rules for derivation of service information within Media Component
Description from SDP media componentz中定义,部分截图如下:

实际上映射规则来自于右侧的伪代码,如下:
(这里以上行带宽为例,下行类似)
"IF <SDP direction> = UE terminated (NOTE 8) THEN
IF Transport in m-line is "TCP" or "TCP/MSRP" THEN (NOTE 9)
IF a=recvonly or a=sendrecv or no direction attribute THEN
IF b=AS:<bandwidth> is present and
( b=TIAS:<Tibandwidth> is not
present or is present but not supported ) THEN
"marBwUl" := <bandwidth> * 1000; /* Unit bit/s
ELSE
IF b=TIAS:<Tibandwidth> is present and supported THEN
"marBwUl" := <Transport-dependent bandwidth>
(NOTE 11) /* Unit bit/s
ELSE
"marBwUl" := <Operator specific setting>;
ENDIF;
ENDIF;
ELSE
"marBwUl" := <Operator specific setting>,
(NOTE 10)
ENDIF;
ELSE /* UDP or RTP/AVP transport
IF b=AS:<bandwidth> is present and
( b=TIAS:<Tibandwidth> is not
present or is present but not supported ) THEN
IF a=rtcp-mux is negotiated(NOTE 13) THEN
IF b=RR:<rrbandwidth> is present
OR b=RS:<rsbandwidth> is present THEN
"marBwUl" := <bandwidth> * 1000 +
<rrbandwidth> + <rsbandwidth>;
ELSE
"marBwUl" := <bandwidth> * 1050;
/* Unit is bit/s
ENDIF
ELSE
"marBwUl" := <bandwidth> * 1000;
/* Unit is bit/s
ENDIF;
ELSE
IF b=TIAS:<Tibandwidth> is present and supported THEN
IF a=rtcp-mux is negotiated (NOTE 13) THEN
IF b=RR:<rrbandwidth> is present
OR b=RS:<rsbandwidth> is present THEN
"marBwUl" :=
<Transport-dependent bandwidth> (NOTE 11) +
<rrbandwidth> + <rsbandwidth>; (NOTE 3; NOTE 6)
ELSE
"marBwUl" :=
<Transport-dependent bandwidth>
* 1.05 (NOTE 11) /* Unit bit/s
ENDIF
ELSE
"marBwUl" := <Transport-dependent bandwidth>
(NOTE 11) /* Unit bit/s
ENDIF;
ELSE
"marBwUl" := <Operator specific setting>,
or attribute not supplied;
ENDIF;
ENDIF;
ENDIF
ELSE
Consider SDP in opposite direction
ENDIF"
这段伪代码用于确定VoLTE(Voice over LTE)服务中上行链路的最大请求带宽(`marBwUl`)。它根据
SDP(Session Description Protocol)中的不同条件和属性来计算带宽。以下是对这段代码的逐步解读:
1. SDP方向检查:
- 如果SDP方向是“UE terminated”,则继续执行,否则考虑SDP的相反方向。
2. 传输协议检查:
- 如果传输协议是“TCP”或“TCP/MSRP”:
- 检查SDP中的方向属性(`a=recvonly`、`a=sendrecv`或没有方向属性):
- 如果`b=AS:<bandwidth>`存在,并且`b=TIAS:<Tibandwidth>`不存在或不被支持:
- 将`marBwUl`设置为`<bandwidth> * 1000`(单位是bit/s)。
- 如果`b=TIAS:<Tibandwidth>`存在且被支持:
- 将`marBwUl`设置为传输协议相关的带宽。
- 否则,使用运营商特定的设置。
- 如果方向属性不符合上述条件,使用运营商特定的设置。
- 如果传输协议是“UDP”或“RTP/AVP”:
- 如果`b=AS:<bandwidth>`存在,并且`b=TIAS:<Tibandwidth>`不存在或不被支持:
- 如果协商了`a=rtcp-mux`:
- 如果`b=RR:<rrbandwidth>`或`b=RS:<rsbandwidth>`存在:
- 将`marBwUl`设置为`<bandwidth> * 1000 + <rrbandwidth> + <rsbandwidth>`。
- 否则,将`marBwUl`设置为`<bandwidth> * 1050`。
- 如果没有协商`a=rtcp-mux`,将`marBwUl`设置为`<bandwidth> * 1000`。
- 如果`b=TIAS:<Tibandwidth>`存在且被支持:
- 如果协商了`a=rtcp-mux`:
- 如果`b=RR:<rrbandwidth>`或`b=RS:<rsbandwidth>`存在:
- 将`marBwUl`设置为传输协议相关的带宽加上`<rrbandwidth>`和`<rsbandwidth>`。
- 否则,将`marBwUl`设置为传输协议相关的带宽乘以1.05。
- 如果没有协商`a=rtcp-mux`,将`marBwUl`设置为传输协议相关的带宽。
- 如果上述条件都不满足,使用运营商特定的设置或不提供属性。
如果还是不好理解,那再用大白话总结一下。
因此总结后就是:
• 如果SDP中传输协议是TCP,那Max-Requested-Bandwidth-UL就等于b行中的AS;(不过要乘
1000,换算成kbps)
• 如果SDP中传输协议是UDP,那Max-Requested-Bandwidth-UL就等于b行中的AS;(不过要乘
1000,换算成kbps)。【没有协商`a=rtcp-mux`场景。】
看个例子:

这是一个带SDP的183响应。可以看到b:AS的取值是49。
再看Rx接口:

这是一个紧跟着183的Rx接口的AAR消息,可以看到
Max-Requested-Bandwidth-UL和Max-Requested-Bandwidth-DL的取值都是49000,
也就是严格按照29513的要求,用b:AS的49乘以1000得到的。