文章目录
会话管理的key专题
一个会话可以理解为多个网元实体处理的一个共同的资源,这种资源通常是用户端和服务端之间创建的关联。通过这种关联,Client/Server两端就可以互相发送数据,就同一资源进行处理。
在会话建立的过程中,可能有多个网络模块参与,且一个网络模块不仅服务于一个会话。这种多对多的关系如果处理不当,会导致“数据不通,记错费用,串号(对于通信领域)” 等严重的问题,因此如何合理的标识一个会话资源非常重要。
会话标识通常和消息路由有一定关联,我们可以使用Hash或者掩码算法,从中提取出路由的信息,因此路由也纳入本文的讨论范围。
会话标识通常也和数据存储有关,我们可以选择合适的会话标识,当做关系型数据库的主键,也可当做数据库的索引,因此数据库也在本文讨论范围内。
现说明下文章的用词:
ContextId
, SessionId
指会话的标识。
PrimaryKey
, Index
指数据库里的键和索引。
TunnelId
, RefValue
指通信的端点标识,参考点标识。
通信、资源、key基本概念
通信是分层的
最经典的就是网络分层的OSI模型。
无论是系统内部还是系统外部的通信方式都是有层级的。分层能够帮我们聚焦于一类问题,统一术语,统一范围,并能屏蔽掉下一层的细节。
key的唯一性是有范围的
key只需要在一定范围内唯一即可。就如每一栋楼都可以有1层。
比如在一栋楼范围内找另一户人,只需要知道几层第几户。而在小区范围内找另一户人,则还需要知道楼栋号。
当我们明确通信的对端在 某一范围 内,那么最好就用那个范围内的唯一标识,不需要过多的扩展,额外的信息只会带来困扰。
资源编号的分配者应该是谁
两个平级的资源自然不能给自己分资源编号,因为他们很有可能分重了,应该交由他们的上级来分配。
同一资源的标识方式可能有多种
一种标识方式,对应着一种通信方式、一种路由方式。一个模块可能与周边多个模块通信,因此同一资源就会有多种标识方式。
比如ModA
模块可以通过API_AB
协议栈和ModB
模块通信,可以通过API_AC
协议栈和ModC
模块通信,那么ModA
的一个会话就会同时拥有:
AB
接口上的标识ContextId_AB
AC
接口上的标识ContextId_AC
同一资源的不同标识的矛盾
正如上一个话题所说,如果标识的对应关系发生了错乱,则会导致通信的两端无所适从。比如A-B
通信时,B
在API_AB
中携带了ContextId_AC
的值,但是所带的值和A
保存的值不一致,那就会导致A
的困扰。
实际工作中,难以避免在多个模块间同步这些信息时发生丢失,造成标识对不上的困境。
在极力保证通信可靠性的同时,我们也应该思考:如果真正发生了不一致,如何处理是最合理的。
可以采取的方案有:
- 信赖于对端:从而修改自身的资源标识的对应关系。
- 信赖于自己:从而拒绝对端的请求。
- 都不信赖:删除资源,等待重新建立。
- 定期进行资源核查。
物理资源与逻辑资源
逻辑资源可以理解为一个处理者,物理资源可以理解为他所依赖的计算资源,他们在通信中处于不同的层级。
在设计资源的标识时,一定要想好什么是会变的(一定不要依赖于可能会改变,或者可能未来会改变的标识),什么是一定不变的,两个通信的单元是处于什么层级,针对什么资源达成的共识。
会话标识 in 核心网控制面协议栈
SessionId
的设计与两个网络模块的通信方式关系很大,因此首先要了解两个通信实体的协议栈是如何规定的。
GUL
的移动管理、会话管理网络实体依赖于GTP协议栈。
5G
则依赖于HTTP协议栈。
2、3、4G的隧道
协议栈为 [GTP(应用层) - UDP(传输层) - IP(网络层) - L2 - L1]
在2\3\4G中对一个会话的另一种说法是一条隧道,从29274协议中能看出端倪。Create Session Request
被归类为了Tunnel Management
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gUfknTg1-1589017078775)(https://code.huawei.com/q00452800/BlogsRepo/uploads/4d57b15c0de4b4b673efb2c034d92e49/image.png)]
那么隧道是什么?
GPRS隧道协议(英语:GPRS Tunnelling Protocol,简称:GTP)是一组基于IP的通信协议,用于在GSM、UMTS和LTE网络中承载GPRS(通用分组无线业务,英语:General Packet Radio Service)。
GTP协议目前有3个版本:version 2使用于LTE核心网;version 1使用于GSM和UMTS网络,也应用于LTE网络中以传输用户面数据;version 0是早期版本,被1999年标准化的version 1替代。
隧道是GTP协议栈中关键的一个概念,简单理解就是两点一线构成一个会话,其中两点即TEID
,全称:Tunnel endpoint identifier
。他由通信的两端分配,并携带给对端,在后续的交互中,会在GTP消息头中携带这一TEID,标识通信对端的一个会话,属于应用层的概念。
5g的reference point
5g的核心网网元间采用HTTP协议,采用基于服务的架构(SBA)。
相比于4g,在通信理念上有较大的变化,基于服务的架构也是IT领域后端常见的架构,更详细的可参考文章 5G核心网的颠覆:SBA架构。
简单来说,一个网元称为一个网络服务(Network Function),服务通过生产者(Producer)与消费者(Consumer)之间的消息交互来达成。交互模式简化为两种:Request-Response、Subscribe-Notify,NF之间按照服务化接口交互。
这种总线式的模型淡化了通信两端的概念,更偏向于一个NF能够提供什么服务,像是建立于HTTP层以上的一种RPC
方式。习惯称一个服务接口为一个referece point
。
OSI的五层模型为 [HTTP(应用层) - TCP(传输层) - IP(网络层) - L2 - L1]
在HTTP协议的理念中,采用URI
作为资源定位的key
。
URL
是一种URI
,它标识一个互联网资源。
大部分URL
遵循一种标准格式,该格式包含三个部分:
- 第一部分:方案
scheme
,方案告知Web客户端怎样访问资源 - 第二部分:服务器的位置
<host>:<port>
,告知Web客户端资源位于何处。 - 第三部分:指定服务器上某个资源
/<path>
,说明了请求的是服务器上的哪个特定的资源。
TCP/IP
层的通信key
在URL的第二部分,host+port
决定了唯一一个TCP
连接,在一个TCP/IP
的连接上,可能建立多个用户的会话资源,如何区分不同的会话资源呢?
答案自然就在第三部分,对于一个5G的会话来说,它的唯一资源标识 SmContextRef
就藏于此处。首次创建时,被请求方SMF
应当分配SmContextRef
,并且要保证它的唯一性。
会话标识 in 终端&&核心网
手机是日常生活中最常见的终端,手机最常见的身份标识就是IMSI
(5g为SUPI
),它存在于SIM卡中。一个终端可以通过不同的会话连接到多个数据网络上,不同的会话使用不同的Id
标识,对于2\3\4G,是Nsapi/Lbi
,对于5g是PduSessionId
。
Id
的分配者可能是终端或者网络侧。无论分配者是谁,最终终端和网络侧均需要就一个会话的标识达成一致。
一般情况下,终端会通过IMSI+一个数字,来标识一个会话。特殊情况下,终端可能会通过wifi等其他方式接入网络,不过需要资源标识的原则是不变的。