【freeDiameter】服务端和客户端的连接流程

news2024/12/23 16:53:15

连接流程详解

进程启动时,先使用main_cmdline解析命令行参数,比如使用-c就会使用指定路径的配置文件,使用-d就会启用后台进程。

之后使用fd_core_initialize初始化核心库。具体会先使用fd_conf_init初始化配置,比如设置各项的默认值,初始化字典,初始化主事件队列等。之后使用fd_dict_base_protocol,定义了一些基础的 AVP,例如 Vendor-Id、Host-IP-Address、Supported-Vendor-Id等,他们都作为字典对象存放在字典中,以供查询。之后是初始化三个队列,分别是fd_g_localfd_g_outgoing、fd_g_incomingfd_g_local 用于存储需要在本地处理的消息,fd_g_outgoing 用于管理所有待发送到远程对等体的消息,fd_g_incoming 用于存储所有已经接收到但尚未进行进一步处理的消息。之后还有fd_hooks_init、fd_sess_start、fd_p_expi_init。
在这里插入图片描述

接着是fd_core_parseconf 解析配置文件,解析的规则由fdd.lfdd.y生成,其会更新fd_g_config并建立对应的数据结构,其中的ConnectPeer模块会创建peer并调用fd_psm_begin进行启动。

在这里插入图片描述

如上图,fd_psm_begin启动后会创建线程p_psm_th,线程p_psm_th会创建线程connect_thrconnect_thr会像对端发送sctp连接,与对端进行sctp四次握手,成功后将连接cnx构建成事件放到peer的事件队列中,并且创建一个线程rcvthr_notls_sctp来接收消息构建事件并放到连接cnx的事件队列中,线程rcvthr_notls_sctp在成功接收一个普通消息后便结束(即接收到的是sctp的普通消息而非通知,等待的是CEA)。
在这里插入图片描述

之后p_psm_th就能从peer事件队列中取到连接事件并进行处理。具体就是向对端发送CER,然后将连接的事件队列与peer的事件队列进行同步,收到的CEA也就能同步到peer的事件队列中,p_psm_th就能取出CEA事件进行处理。

在这里插入图片描述

p_psm_th取到CEA事件后会创建一个rcvthr_notls_sctp线程来循环接收消息并放到连接的事件队列(peer事件队列)中,之后p_psm_th就可以从peer中一直取消息事件进行处理。

之后使用fd_rtdisp_init初始化运行时分发模块,创建三个线程分别负责dispatch_thrrouting_out_thrrouting_in_thrdispatch_thr 调用 process_thr 函数,并将 msg_dispatch 作为处理函数,fd_g_local 作为消息队列;routing_in_thr调用 process_thr 函数,使用 msg_rt_in 作为处理函数,fd_g_incoming 作为消息队列;routing_out_thr调用 process_thr 函数,使用 msg_rt_out 作为处理函数,fd_g_outgoing 作为消息队列。

msg_rt_in 函数负责处理进入的Diameter消息,包括解析消息头、检查路由信息、决定消息是本地处理还是转发,如果是本地处理就将消息放到fd_g_local中,转发就放到fd_g_outgoing。它确保请求消息根据路由规则和本地配置被正确地分发,并且响应消息被送回正确的请求者。如果消息不符合协议规范或无法处理,该函数还会处理错误响应。

msg_dispatch是消息分发处理函数。它解析消息,检查是否有注册的回调函数来处理该消息,并根据回调函数的返回值或消息类型决定如何进一步处理消息。在test_app中,服务端注册了 ta_tr_cb函数来处理Test_Request。在处理并构建完应答后,会将应答消息或报错消息发布到fd_g_outgoing中等待发送。

msg_rt_out处理Diameter消息路由输出的函数。根据路由规则和对等体状态确定如何转发消息。

接着是调用fd_core_start启动服务器,fd_core_start主要调用了fd_servers_start,fd_psm_start,core_runner_thread,core_state_set

fd_servers_start 函数的作用是初始化并启动 freeDiameter 守护进程的服务器监听功能。其内部会调用new_serv新建一个服务实例,还会启用一个serv_th线程负责监听。该服务会创建一个队列存放客户端的连接请求,并创建一定量的线程运行client_worker,监听线程会将监听到的连接请求放到服务实例的队列中,client_worker会负责处理这些连接对象。如图
在这里插入图片描述

先创建一个线程rcvthr_notls_sctp接收一个消息(CER),将其构建成事件放到连接对象的事件队列中,接着client_worker会去取事件,将事件解析成消息后,判断如果是CER会交给fd_peer_handle_newCER处理。

在这里插入图片描述

fd_peer_handle_newCER会先在peer队列中找到该CER对应的peer,然后将其构建成事件添加到peer的事件队列中,让peer的状态机去处理。

在这里插入图片描述

在peer的状态机中,线程p_psm_th会从peer的事件队列中取出CER事件处理,成功后会向对端发送CEA,并且会创建线程rcvthr_notls_sctp来循环的接收消息,并放到连接的事件队列中(peer事件队列)。

pthread_create(&core_runner, NULL, core_runner_thread, NULL)创建核心运行器线程,这是一个主要的事件处理线程,负责处理守护进程的主要事件循环,直到接收到关闭信号。在test_app的例子中,ta_cli_init注册了ta_cli_test_message回调函数,当指定的信号被触发时,负责处理信号的线程会向主事件队列中发送事件,在由core_runner_thread调用对应的回调函数处理。

core_state_set(CORE_RUNNING)更新内部状态标志,表明核心组件已经启动并运行。用于同步。

之后主线程还会创建负责捕捉处理信号的线程catch_signals,其会循环捕捉信号,处理后将事件发送到主事件队列中。

从上面的流程可知,freeDiameter的节点是不分客户端和服务端的,每一个节点都具有发起连接和接收连接的功能。假设我们先开启了peer1,后开启peer2,从抓到的包中可以看到,CER是由peer2发给peer1

在这里插入图片描述

相反,如果先开启peer2,后开启peer1CER则是由peer1发给peer2

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2083745.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android活动(activity)与服务(service)进行通信

文章目录 Android活动(activity)与服务(service)进行通信活动与服务进行通信服务的生命周期 Android活动(activity)与服务(service)进行通信 活动与服务进行通信 上一小节中我们学…

国产3A大作《黑神话:悟空》,各类MOD+修改器+皮肤等资源大合集(附安装教程)

《黑色神话:悟空》的引擎让你可以修改角色的伤害、防御和各种物资数量,大大降低了游戏的难度,让动作游戏的玩家更容易享受到体验。但是,请注意,使用作弊引擎会大大降低游戏体验,因此请明智地使用它&#xf…

各种探针卡介绍

探针卡(Probe Card)是一种在半导体测试过程中至关重要的设备,主要用于晶圆测试阶段,通过探针与芯片上的焊垫或凸块直接接触,完成测试信号的传输和反馈。探针卡的种类多样,各有其特点和应用场景。以下是几种常见的探针卡类型详细介绍: 1. 刀片探针卡(Blade Probe Card)…

<Rust>egui学习之小部件(五):如何在窗口中添加图像部件?

前言 本专栏是关于Rust的GUI库egui的部件讲解及应用实例分析,主要讲解egui的源代码、部件属性、如何应用。 环境配置 系统:windows 平台:visual studio code 语言:rust 库:egui、eframe 概述 本文是本专栏的第五篇博…

【Qt】垂直布局管理器QVBoxLayout

垂直布局管理器QVBoxLayout 在之前学习Qt的过程中,将控件放在界面上,都是依靠“手动”的方式来布局的,但是手动调整的方式是不科学的。 手动布局的方式非常复杂,而且不精确无法对窗口大小进行自适应 因此Qt引入布局管理器来解决…

2-79 基于matlab的卷积稀疏的形态成分分析的医学图像融合

基于matlab的卷积稀疏的形态成分分析的医学图像融合,基于卷积稀疏性的形态分量分析 (CS-MCA) 的稀疏表示 (SR) 模型,用于像素级医学图像融合。通过 CS-MCA 模型使用预先学习的字典获得其卡通和纹理组件的 CSR。然后,合并所有源图像的稀疏系数…

13-springcloud gateway集成nacos实现负载均衡

网关作为访问系统的入口,负载均衡是必选项而不是可选项,本文介绍gateway与nacos集成,实现负载均衡的过程。关于springcloud gateway的基本用法,同学可以看看上篇文章: 12-使用gateway作为网关。 0、环境 jdk:1.8spri…

【GIT】idea中实用的git操作,撤回commit,撤回push、暂存区使用

IDEA中最常见的UI操作:【GIT】Idea中的git命令使用-全网最新详细(包括现象含义) 文章目录 问题一: idea撤回仅commit错误的代码(仅本地仓库,因为还没推送到远程)问题二: idea撤回Com…

【提示学习论文】CoCoLe:Conceptual Codebook Learning for Vision-Language Models

Conceptual Codebook Learning for Vision-Language Models(ECCV 2024) CPL的改进暂无代码 CPL 详见CPL论文 CoCoLe a:手工概念缓存的建立过程b:制作提示的过程,将图像输入Ev,得到image features v 作…

【C++ Primer Plus习题】6.4

问题: 解答: #include <iostream> using namespace std;const int strsize 40; const int usersize 40;typedef struct _Bop {char fullname[strsize];char title[strsize];char bopname[strsize];int preference; }Bop;Bop bop_user[usersize] {{"Wimp Macho&q…

SpringBoot多环境日志配置

SpringBoot 默认使用 LogBack 日志系统 默认情况下&#xff0c;SpringBoot项目的日志只会在控制台输入。 如果想查询历史日志则无法找到&#xff0c;我们需要一个日志系统来统一管理日志。 一般正式项目会有单独日志系统&#xff0c;将日志操作存入数据库。 第一种方式是 在 ap…

如何理解select(1)、select(*)、select(column)背后的差异?

先说结论 select&#xff08;1&#xff09;、select&#xff08;*&#xff09;都是基于结果集进行的行数统计&#xff0c;统计到NULL行select&#xff08;column&#xff09;则受到索引设置的影响&#xff0c;默认会排除掉NULL行 在数据库查询中&#xff0c;SELECT语句用于从数…

第 7 章 B+树索引的使用

7.1 索引的代价 空间上的代价 每建立一个索引都要为它建立一棵B树&#xff0c;B树的每一个节点都是一个数据页&#xff0c;一个页默认占用16KB的空间。 时间上的代价 每次对表中的数据进行增、删、改操作时&#xff0c;都需要去修改各个B树索引。 一个表上的索引越多&#x…

从零上手CV竞赛Task2 # Datawhale AI夏令营

文章目录 平台参赛平台云平台 Task 1 从零上手CV竞赛下载baseline相关文件一键运行baseline&#xff01;&#xff08;大约需要25分钟&#xff09;赛题解析数据集提交结果违法标准注意事项 下载生成的文件结果如图最后要记得关机 不然一直消耗算力 Task 2 建模方案解读与进阶物体…

光性能 -- OMA(光调制幅度)

基本概念 OMA&#xff08;Optical Modulation Amplitude&#xff09;&#xff1a;光调制幅度&#xff0c;是光信号测试中的一项指标。是指光模块接收到的信号”1”的光功率和信号“0”的光功率的差值。即&#xff1a; Pavg&#xff08;average optical power&#xff09;&#…

WxPython可视化编辑器

作者&#xff1a;陈炳强 WxPython是python的一个用来写桌面程序的模块,目前只写了小部分功能跟组件, 用Python写中文&#xff0c;非常方便&#xff01; 下载地址&#xff1a;https://pan.quark.cn/s/ba19b2472246

LabVIEW如何适应航天系统的要求

随着航天任务的复杂性和精确性要求不断提高&#xff0c;软件系统在其中扮演的角色变得愈发关键。LabVIEW凭借其强大的实时数据处理能力、高可靠性、以及灵活的系统集成和仿真工具&#xff0c;已逐渐成为满足航天系统需求的重要开发平台。通过全面适应航天工程的严格标准&#x…

守护电动“心脏”!仿真APP在汽车电池包随机振动分析中的应用

汽车电动化、智能化、绿色化发展已成为全球各国应对气候变化、实现低碳发展的共同选择。在此背景下&#xff0c;新能源汽车持续高速发展。电池包作为新能源汽车的“心脏”&#xff0c;是其主要动力来源&#xff0c;直接影响车辆的续航里程与行驶安全。电池包结构的安全可靠性对…

Linux——性能调优工具一览

一、CPU 1.调优工具 根据指标找工具 性能指标工具说明 平均负载 uptime、top uptime最简单、top提供了更全的指标 系统整体CPU使用率 vmstat、mpstat、top、sar、/proc/stat top、vmstat、mpstat只可以动态查看&#xff0c;而sar还可以记录历史数据 /proc/stat是其他性…

界面控件Telerik UI for ASP.NET Core 2024 Q2亮点 - AI与UI的融合

Telerik UI for ASP.NET Core是用于跨平台响应式Web和云开发的最完整的UI工具集&#xff0c;拥有超过60个由Kendo UI支持的ASP.NET核心组件。它的响应式和自适应的HTML5网格&#xff0c;提供从过滤、排序数据到分页和分层数据分组等100多项高级功能。 本文将介绍界面组件Teler…