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

连接流程详解

进程启动时,先使用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.mzph.cn/bicheng/52726.shtml

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

相关文章

最长的一帧学习 part3

文章目录 八、osgUtil:: SceneView::cull ()part1 初始化必要的SceneView类成员变量part2 立体显示的处理part3 执行SceneView::cullStage函数,它也是场景视图筛选工作的核心函数part3.1 首先统计场景中的遮挡节点(OccluderNode),…

缺失ffmpeg.dll要用什么修复方法?快速恢复丢失的ffmpeg.dll文件

多媒体软件用户常常会遭遇一个提示:系统无法找到ffmpeg.dll文件。这类情况经常在启动视频编辑软件、流媒体播放应用或其他音视频处理工具时出现,导致相关程序无法正确加载和执行。ffmpeg.dll是一种关键的动态链接库文件,负责处理复杂的视频和…

ssrf+redis未授权访问漏洞复现

ssrfredis未授权访问漏洞复现 一,pikachu靶场练习 docker拉取环境: docker run -d -p 8765:80 8023/pikachu-expect:latest国内很多加速源都用不成,配置代理拉取即可,配置方式如下: 1,新建目录 mkdir -…

数据结构与算法的代码实现(C++版)

数据结构与算法的代码实现(C版) 1. 线性表的顺序表示和实现1.1 线性表的初始化1.2 线性表的销毁1.3 线性表的清空1.4 线性表的长度1.5 判断线性表是否为空1.6 线性表的线性表取值1.7 线性表的顺序查找1.8 线性表的插入1.9 线性表的删除总结 2. 线性表的链…

JavaScript ES6+ 新特性

JavaScript ES6 新特性 引言 随着前端技术的不断发展,JavaScript 语言也在不断演进。自 ES6(ES2015)发布以来,JavaScript 引入了许多新的特性和语法,极大地提升了开发者的编程体验和代码的可维护性。本篇文章将详细探…

真话有危险,测评需谨慎!一个家最大的内耗:谁都在抱怨,没人肯改变——早读(逆天打工人爬取热门微信文章解读)

现在都这么完了吗? 引言Python 代码第一篇 洞见 一个家最大的内耗:谁都在抱怨,没人肯改变第二篇 故事风云录结尾 引言 慢慢调整时间 一是现在有点忙 做那个传播声音的研究实验实在是有点没有头绪 没有头绪的事情你就不知道怎么安排时间 也就…

数学建模比赛(国赛)水奖攻略

之前很多同学私聊问我,学校要求参加数模比赛,但是不擅长建模编程,但又不想浪费这个时间该怎么办呢,今天就来给大家讲一下大家都非常感兴趣的内容——数学建模水奖攻略。分享一下博主直接参加比赛时候的经验。 一、选题技巧 有一句…

HarmonyOs如何获取rawfile目录下的所有文件列表

最近在做一个功能,需要使用获取rawfile下目录的所有文件 参考连接为: zRawfile-模块-C API-Localization Kit(本地化开发服务)-应用框架 - 华为HarmonyOS开发者 (huawei.com) 需要使用到native实现,实现步骤&#…

2008-2020年 中国健康与养老追踪调查CHARLS数据合集

中国健康与养老追踪调查(China Health and Retirement Longitudinal Study, CHARLS)是一项由北京大学国家发展研究院主持的大型跨学科调查项目。该项目始于2011年,每两到三年对样本进行一次追踪调查,旨在收集代表中国45岁及以上中…

面试经典算法150题系列-反转字符串中的单词

反转字符串中的单词 给你一个字符串 s ,请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。 注意:输入字符串 s中可能…

关于告警,要想做好,从这些方面着手

各类监控系统都会产生告警事件,于是,就产生了 FlashDuty、PagerDuty、Opsgenie 这类产品,做告警事件的收敛降噪、排班认领升级等。如果你想增强自己公司的告警事件处理能力,参考(chao xi)这些产品的功能就可…

使用统计方法在AMD GPU上使用JAX Profiler可靠地比较大型生成AI模型中的算法性能

Using statistical methods to reliably compare algorithm performance in large generative AI models with JAX Profiler on AMD GPUs — ROCm Blogs 摘要 本文提供了一份详细的指南,介绍如何在JAX实现的生成AI模型中测量和比较各种算法的性能。利用JAX Profiler…

35岁程序员的4条出路!请提早布局!

小编准备入门了Python入门学习籽料80个Python爬虫实战入门实例 点击 领取(无偿获得) 20多岁,初入职场,满腔热血,对未来充满憧憬; 30多岁,家庭事业双重压力,开始迷茫,对…

阿里云发送短信功能(Java)

(1)注册用户,并且开通短信套餐 (2) 点击快速学习,然后绑定测试的手机号码。 选用专用测试签名(自定义的话阿里可能会验证什么什么的比较麻烦) 然后在选取调用API (3&…

3秒AI写真出图,Stable Diffusion2024升级版+使用教程来了!(无需安装,解压即用)

要说今年摄影圈最大的新秀 那妥妥的就Stable Diffusion 比如下面的写真照片 你敢信这是SD绘画生成的? 就在刚刚它又全面升级了 新版无需安装,直接解压就能用 比之前推送的更加智能、快速和简单 另外还特意为大家准备了 Stable Diffusion 人工智能…

故障诊断 | 基于小波时频图与Swin Transformer的轴承故障诊断方法(PyTorch)

文章目录 文章概述程序设计参考资料文章概述 基于小波时频图与Swin Transformer的轴承故障诊断方法 针对用传统的故障诊断方法难以对非线性非平稳的柴油机故障信号进行准确高效诊断的问题, 提出基于小波时频图与Swin Transformer的故障诊断方法。该方法可以有效结合小波时频分…

Git实战精粹

一、快速入门 1. 什么是Git Git是一个分布式的版本控制软件。 软件,类似于QQ、office、dota等安装到电脑上才能使用的工具版本控制,类似于毕业论文、写文案、视频剪辑等,需要反复修改和保留原历史数据分布式 文件夹拷贝本地版本控制集中式…

如何在Java中使用protobuf

写在前面 本文看下在Java中如何使用protofbuf。 1:介绍 1.1:什么是protobuf 是一种数据格式,同json,xml,等。但是一种二进制数据格式。 1.2:强在哪里?为啥要用? 小&#xff0c…

JS中this的指向问题、JS的执行机制、offset、client、scroll

JS中this的指向问题 1. 在全局环境下 在全局环境中(在浏览器中是 window 对象,在Node.js中是 global 对象),this 指向全局对象。 console.log(this window); // 在浏览器中为 true console.log(this.document ! undefined); //…

如何练高音技巧

如何练高音技巧 高音的练习技巧有:练“a”(啊)音,让口腔打开,声带放松,反复几次;再练“u”(呜)音,这个音可以有按摩声带的功能,也使声带进一步放松;发“i”(衣)音,逐步加…