5G 基站SCTP
如何实现SCTP多归属链路对接
文章目录
 前言一、SCTP是什么?二、lksctp三.sctp初始化四.绑定本端两个IP 五.与对端建链六.设置主要路径七.设置是否启用心跳八.关于防火墙的配置
 总结
前言
 最近完成了贝尔及华为软交换的SCTP 多归属链路对接。由于网络上对于多归属链路介绍的资料特别少。能看到的一些资料介绍,但是说明的不详细,大都是Demo性质不能完全商用。以客户端为例子,概括如下,首先绑定本端两个IP,然后绑定交换的主用Path。然后将该主用的Path的IP设置为PrimaryPath。如果对端交换不支持BEAT心跳消息,就不要发送该BEAT消息。 现在分享下我的具体的经验心得。
提示:以下是本篇文章正文内容,下面案例可供参考
一、SCTP是什么?
 SCTP (Stream Control Transmission Protocol)是一种传输协议,在TCP/IP协议栈中所处的位置和TCP、UDP类似,兼有TCP/UDP两者特征。
随着网络接入技术的多样化,利用通信终端上多个网络接口实现并行多路径(Concurrent Multipath Transfer,CMT)成为研究的热点,成为提高数据传输效率重要手段。基于流传输(Stream Control Transmission Protocl,SCTP)实现的CMT是这一领域研究的重点,它通过扩展SCTP的多IP特性实现同一关联的多条端到端的路径上同时传输数据。    SIGTRAN信令通过SCTP建链承载信令。SCTP位于SCTP应用和无线分组网络(IP网)之间,通过两个SCTP端点之间建立关联,为两个SCTP用户提供可靠的消息传输业务。一个SCTP链路包换了一个或两个源/目的的地址。这些地址包含在每个端点的传输地址中。SCTP的关联结构如图1所示。
如何实现SCTP多归属链路对接_开发语言
SCTP发送端使用一组传输地址作为消息的目的地,会根据SCTP用户的指令和当前合法的目的地址集合的可达性状态,为每个待发送的消息选择一个目的传输地址。在关联建立后,需要为每个SCTP端点定义一条主路径,用来在正常情况下发送SCTP消息。正常情况下,SCTP只选择其中的一条可用路径作为主路径传输数据,其他路径作为备用路径。当主路径失效时,SCTP切换到其中的一条备用路径上继续传输。
二、lksctp
 lksctp封装了linux内核sctp的接口函数。使用lksctp可以加速sctp的开发。代码中引入sctp.h,编译时加入-lsctp,进行动态库链接。
三.sctp初始化
 from_sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_SCTP);
setsockopt(from_sockfd,SOL_SOCKET,SO_SNDBUF,(char*)&sndBufS,sndBufL);
setsockopt(from_sockfd,SOL_SOCKET,SO_RCVBUF,(char*)&rcvBufS,rcvBufL);
setsockopt(from_sockfd, SOL_SOCKET, SO_REUSEADDR, &reuse_address, sizeof(reuse_address);
setsockopt(from_sockfd , IPPROTO_SCTP , SCTP_RTOINFO , &timeout , opt_len);
setsockopt(from_sockfd , IPPROTO_SCTP , SCTP_ASSOCINFO , &assocmaxrxt , opt_len);
setsockopt(from_sockfd, IPPROTO_SCTP, SCTP_INITMSG, &initmsg, sizeof(initmsg);
四.绑定本端两个IP
 struct sockaddr_in cliaddr;
 int ret;
 bzero( (void *)&cliaddr, sizeof(cliaddr) );
 cliaddr.sin_family = AF_INET;
 cliaddr.sin_addr.s_addr = pFrom_addr[0].sin_addr.s_addr;
 cliaddr.sin_port = pFrom_addr[0].sin_port;
 ret = bind(fd, (struct sockaddr *)&cliaddr, sizeof(cliaddr));
bzero( (void *)&cliaddr, sizeof(cliaddr) );
 cliaddr.sin_family = AF_INET;
 cliaddr.sin_addr.s_addr = pFrom_addr[1].sin_addr.s_addr;
 cliaddr.sin_port = pFrom_addr[1].sin_port;
 ret = sctp_bindx(fd, (struct sockaddr *)&cliaddr, 1, SCTP_BINDX_ADD_ADDR);
五.与对端建链
 设置对端两个IP
if (sctp_peeraddr->addr_num)
 {
 addr = (struct sockaddr *)(cli_addr + offsetof(struct sctp_getaddrs, addrs));
 for (index = 0; index < sctp_peeraddr->addr_num; index++)
 {
 memset(dest, 0, sizeof(dest));
 if (addr->sa_family == AF_INET)
 {
 //Log::PrintLog(LOG_INFO, “[SCTP_GET_PEER_ADDRS] %s\n”, inet_ntoa(((struct sockaddr_in *)addr)->sin_addr));
 Log::PrintLog(LOG_TRACE, “Sctp.cxx”, “sctp_peer_param()”, “[SCTP_GET_PEER_ADDRS %s]”,inet_ntoa(((struct sockaddr_in *)addr)->sin_addr));
 memcpy(&paddrparams.spp_address, addr, sizeof(struct sockaddr_in));
 addr = (struct sockaddr *) (((char *) addr) + sizeof(struct sockaddr_in));
 }
 ret = setsockopt(cfd, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, (const void *)&paddrparams, sizeof(paddrparams));
 if (ret < 0)
 {
 //Log::PrintLog(LOG_INFO,“[set SCTP_PEER_ADDR_PARAMS error] %d:%s\n”, errno, strerror(errno));
 Log::PrintLog(LOG_TRACE, “Sctp.cxx”, “sctp_peer_param()”, “[SCTP_PEER_ADDR_PARAMS err] %d %s”, errno, strerror(errno));
 return;
 }
 Log::PrintLog(LOG_TRACE, “Sctp.cxx”, “sctp_peer_param()”, “set SCTP_PEER_ADDR_PARAMS]”);
 Log::PrintLog(LOG_TRACE, “Sctp.cxx”, “sctp_peer_param()”, “get SCTP_PEER_ADDR_PARAMS] hb = %d, sackdelay = %d, %s, %s, %s”,
 paddrparams.spp_hbinterval,
 paddrparams.spp_sackdelay,
 (paddrparams.spp_flags & SPP_HB_ENABLE)?“HB_ENABLE”:“HB_DISABLE”,
 (paddrparams.spp_flags & SPP_PMTUD_ENABLE)?“PMTUD_ENABLE”:“PMTUD_DISABLE”,
 (paddrparams.spp_flags & SPP_SACKDELAY_ENABLE)?“SACKDELAY_ENABLE”:“SACKDELAY_DISABLE”);
 }
 }
与一个IP建链:
sctp_connectx(from_sockfd, (struct sockaddr*)&m_primsockaddr, 1,(sctp_assoc_t *)&m_assoc[0];
切记,与对端建联时,初始时,只和一个IP进行建链。
六.设置主要路径
 setsockopt(from_sockfd,IPPROTO_SCTP,SCTP_PRIMARY_ADDR,&m_primaddr,sizeof(m_primaddr)
七.设置是否启用心跳
 struct sctp_paddrparams paddrparams;
if (spp_hbinterval == 0)
 {
 paddrparams.spp_flags |= SPP_HB_DISABLE;
 }
 else
 {
 paddrparams.spp_flags |= SPP_HB_ENABLE;
 paddrparams.spp_hbinterval = spp_hbinterval;
 }
ret = setsockopt(cfd, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, (const void *)&paddrparams, sizeof(paddrparams));
八.关于防火墙的配置
 如果系统的网卡地址是通过防火墙映射的,防火墙上有的没有SCTP一个选项,那么配置TCP即可。但是防火墙一定要设置为透明模式。不然在调试多归属链路时会遇到各式各样的怪问题。
总结
 SCTP偶链多归属对接,网上资料特别少,有的也是语焉不详。笔者根据最近数月的调试,将经验分享处理,希望对进行SIGTRAN信令开始的同行有帮助。
相关文章:
5G 基站SCTP
如何实现SCTP多归属链路对接 文章目录 前言一、SCTP是什么?二、lksctp三.sctp初始化四.绑定本端两个IP 五.与对端建链六.设置主要路径七.设置是否启用心跳八.关于防火墙的配置 总结 …...
 
MFC的SendMessage与PostMessage的区别
一、SendMessage 同步操作: SendMessage 是一个同步函数,它会将消息发送到指定的窗口,并等待该窗口的消息处理过程完成,然后返回。这意味着它会阻塞当前线程,直到消息处理完成。 直接调用: SendMessage 会…...
 
学习虚幻C++开发日志——基础案例(持续更新中)
官方文档:虚幻引擎C编程教程 | 虚幻引擎 5.5 文档 | Epic Developer Community | Epic Developer Community 1.物体上下起伏并旋转 1.1第一种写法 创建一个继承于Actor的类,并为新的Actor命名为FloatingActor,然后点击Create Class 重新…...
 
【CUDA代码实践03】m维网格n维线程块对二维矩阵的索引
文章目录 一、数据存储方式二、二维网格二维线程块三、二维网格一维线程块四、一维网格一维线程块 为了方便下次找到文章,也方便联系我给大家提供帮助,欢迎大家点赞👍、收藏📂和关注🔔!一起讨论技术问题&am…...
VSCode Qt6安装OpenSSL
报错 Could NOT find OpenSSL, try to set the path to OpenSSL root folder in thesystem variable OPENSSL_ROOT_DIR (missing: OPENSSL_CRYPTO_LIBRARYOPENSSL_INCLUDE_DIR SSL Crypto) (Required is at least version "3.0")问题确认 这个错误显示在Windows环境…...
JAVA学习-练习试用Java实现“定义一个用户类,包含用户名和密码”
问题: 定义一个用户类(User),包含用户名(username)和密码(password)属性,提供静态方法验证密码是否有效(长度至少为6),并提供getter和…...
 
大数据之VIP(Virtual IP,虚拟IP)负载均衡
VIP(Virtual IP,虚拟IP)负载均衡是一种在计算机网络中常用的技术,用于将网络请求流量均匀地分散到多个服务器上,以提高系统的可扩展性、可靠性和性能。以下是对VIP负载均衡的详细解释: 一、VIP负载均衡的基…...
 
鸿蒙网络编程系列38-Web组件文件下载示例
1. web组件文件下载能力简介 在本系列的第22篇文章,介绍了web组件的文件上传能力,同样的,web组件也具备文件下载能力,鸿蒙API提供了处理web组件下载事件的委托类型WebDownloadDelegate,该类型包括四个下载事件的回调接…...
 
Cisco Packet Tracer 8.0 路由器的基本配置和Telnet设置
文章目录 构建拓扑图配置IP地址配置路由器命令说明测试效果 构建拓扑图 1,添加2811路由器。 2,添加pc0。 3,使用交叉线连接路由器和pc(注意线路端口)。 4,使用配置线连接路由器和pc(注意线路…...
 
Flink系列之:学习理解通过状态快照实现容错
Flink系列之:学习理解通过状态快照实现容错 状态后端检查点存储状态快照状态快照如何工作?确保精确一次(exactly once)端到端精确一次 状态后端 由 Flink 管理的 keyed state 是一种分片的键/值存储,每个 keyed state…...
 
Linux 读者写者模型
1.背景概念 在编写多线程的时候,有一种情况是十分常见的。那就是,有些公共数据修改的机会比较少。相比较改写,它们读的机会反而高的多。这样就衍生出了读者写者模型,在这个模型中,有两类线程:读者和写者。读…...
JavaScript 的 axios 实现文件下载功能
用 JavaScript 的 axios 实现文件下载功能,咱们要分几个步骤来搞定它!最主要的部分是处理 二进制数据,可以生成一个进度检测,然后把它保存为文件。 文件名的获取二进制数据获取创建下载链接 const axios require(axios);const g…...
 
合合信息亮相2024中国模式识别与计算机视觉大会,用AI构建图像内容安全防线
近日,第七届中国模式识别与计算机视觉大会(简称“PRCV 2024”)在乌鲁木齐举办。大会由中国自动化学会(CAA)、中国图象图形学学会(CSIG)、中国人工智能学会(CAAI)和中国计…...
深度学习:匿名函数lambda函数的使用与numerical_gradient函数
背景: 假设我们有一个简单的线性回归模型,其损失函数是均方误差(MSE): class LinearModel:def __init__(self):self.W np.random.randn(1, 1) # 初始化权重def predict(self, x):return np.dot(x, self.W) # 线性预…...
 
PHP数据类型
几种常用的数据类型: String(字符串) Integer(整型) Float(浮点型) Boolean(布尔型) NULL(空值) Array(数组) Obje…...
2FA-双因素认证
双因素认证(2FA,Two-Factor Authentication)是一种提高安全性的方法,要求用户在登录或进行某些敏感操作时提供两种不同类型的身份验证信息。这种方法通过引入第二层验证,增加了账户被未经授权访问的难度。 项目结构 …...
解决 Python 中的 TypeError 错误
解决 Python 中的 TypeError 错误 在 Python 编程中,TypeError 是一种常见的错误,通常发生在尝试对不兼容的类型进行操作时。了解这个错误的原因以及如何有效解决它,对于提高代码的可靠性和可读性至关重要。本文将详细讨论 TypeError 的成因…...
快速学会C 语言基本概念和语法结构
😀前言 本篇博文是关于C 语言的基本概念和语法结构,希望你能够喜欢 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的动力&a…...
 
Python酷库之旅-第三方库Pandas(172)
目录 一、用法精讲 791、pandas.UInt8Dtype类 791-1、语法 791-2、参数 791-3、功能 791-4、返回值 791-5、说明 791-6、用法 791-6-1、数据准备 791-6-2、代码示例 791-6-3、结果输出 792、pandas.UInt16Dtype类 792-1、语法 792-2、参数 792-3、功能 792-4、…...
 
Linux系统下minio设置SSL证书进行HTTPS远程连接访问
文章目录 1.配置SSL证书使用HTTPS访问2.MINIO SDK 忽略证书验证3.使用受信任的证书 1.配置SSL证书使用HTTPS访问 生成域名对应的SSL证书,下载Apache版本,我目前只发现Apache这个里面有对应的私钥和证书 私钥重命名为private.key证书重命名为public.crt&…...
 
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
 
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
 
IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
 
【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
 
在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...
 
Linux中《基础IO》详细介绍
目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改,实现简单cat命令 输出信息到显示器,你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...
区块链技术概述
区块链技术是一种去中心化、分布式账本技术,通过密码学、共识机制和智能合约等核心组件,实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点:数据存储在网络中的多个节点(计算机),而非…...
