当前位置: 首页 > news >正文

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是什么&#xff1f;​​​​二、lksctp​​​​三.sctp初始化​​​​四.绑定本端两个IP​​​​ 五.与对端建链​​​​六.设置主要路径​​​​七.设置是否启用心跳​​​​八.关于防火墙的配置​ ​总结​​ …...

MFC的SendMessage与PostMessage的区别

一、SendMessage 同步操作&#xff1a; SendMessage 是一个同步函数&#xff0c;它会将消息发送到指定的窗口&#xff0c;并等待该窗口的消息处理过程完成&#xff0c;然后返回。这意味着它会阻塞当前线程&#xff0c;直到消息处理完成。 直接调用&#xff1a; SendMessage 会…...

学习虚幻C++开发日志——基础案例(持续更新中)

官方文档&#xff1a;虚幻引擎C编程教程 | 虚幻引擎 5.5 文档 | Epic Developer Community | Epic Developer Community 1.物体上下起伏并旋转 1.1第一种写法 创建一个继承于Actor的类&#xff0c;并为新的Actor命名为FloatingActor&#xff0c;然后点击Create Class 重新…...

【CUDA代码实践03】m维网格n维线程块对二维矩阵的索引

文章目录 一、数据存储方式二、二维网格二维线程块三、二维网格一维线程块四、一维网格一维线程块 为了方便下次找到文章&#xff0c;也方便联系我给大家提供帮助&#xff0c;欢迎大家点赞&#x1f44d;、收藏&#x1f4c2;和关注&#x1f514;&#xff01;一起讨论技术问题&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实现“定义一个用户类,包含用户名和密码”

问题&#xff1a; 定义一个用户类&#xff08;User&#xff09;&#xff0c;包含用户名&#xff08;username&#xff09;和密码&#xff08;password&#xff09;属性&#xff0c;提供静态方法验证密码是否有效&#xff08;长度至少为6&#xff09;&#xff0c;并提供getter和…...

大数据之VIP(Virtual IP,虚拟IP)负载均衡

VIP&#xff08;Virtual IP&#xff0c;虚拟IP&#xff09;负载均衡是一种在计算机网络中常用的技术&#xff0c;用于将网络请求流量均匀地分散到多个服务器上&#xff0c;以提高系统的可扩展性、可靠性和性能。以下是对VIP负载均衡的详细解释&#xff1a; 一、VIP负载均衡的基…...

鸿蒙网络编程系列38-Web组件文件下载示例

1. web组件文件下载能力简介 在本系列的第22篇文章&#xff0c;介绍了web组件的文件上传能力&#xff0c;同样的&#xff0c;web组件也具备文件下载能力&#xff0c;鸿蒙API提供了处理web组件下载事件的委托类型WebDownloadDelegate&#xff0c;该类型包括四个下载事件的回调接…...

Cisco Packet Tracer 8.0 路由器的基本配置和Telnet设置

文章目录 构建拓扑图配置IP地址配置路由器命令说明测试效果 构建拓扑图 1&#xff0c;添加2811路由器。 2&#xff0c;添加pc0。 3&#xff0c;使用交叉线连接路由器和pc&#xff08;注意线路端口&#xff09;。 4&#xff0c;使用配置线连接路由器和pc&#xff08;注意线路…...

Flink系列之:学习理解通过状态快照实现容错

Flink系列之&#xff1a;学习理解通过状态快照实现容错 状态后端检查点存储状态快照状态快照如何工作&#xff1f;确保精确一次&#xff08;exactly once&#xff09;端到端精确一次 状态后端 由 Flink 管理的 keyed state 是一种分片的键/值存储&#xff0c;每个 keyed state…...

Linux 读者写者模型

1.背景概念 在编写多线程的时候&#xff0c;有一种情况是十分常见的。那就是&#xff0c;有些公共数据修改的机会比较少。相比较改写&#xff0c;它们读的机会反而高的多。这样就衍生出了读者写者模型&#xff0c;在这个模型中&#xff0c;有两类线程&#xff1a;读者和写者。读…...

JavaScript 的 axios 实现文件下载功能

用 JavaScript 的 axios 实现文件下载功能&#xff0c;咱们要分几个步骤来搞定它&#xff01;最主要的部分是处理 二进制数据&#xff0c;可以生成一个进度检测&#xff0c;然后把它保存为文件。 文件名的获取二进制数据获取创建下载链接 const axios require(axios);const g…...

合合信息亮相2024中国模式识别与计算机视觉大会,用AI构建图像内容安全防线

近日&#xff0c;第七届中国模式识别与计算机视觉大会&#xff08;简称“PRCV 2024”&#xff09;在乌鲁木齐举办。大会由中国自动化学会&#xff08;CAA&#xff09;、中国图象图形学学会&#xff08;CSIG&#xff09;、中国人工智能学会&#xff08;CAAI&#xff09;和中国计…...

深度学习:匿名函数lambda函数的使用与numerical_gradient函数

背景&#xff1a; 假设我们有一个简单的线性回归模型&#xff0c;其损失函数是均方误差&#xff08;MSE&#xff09;&#xff1a; class LinearModel:def __init__(self):self.W np.random.randn(1, 1) # 初始化权重def predict(self, x):return np.dot(x, self.W) # 线性预…...

PHP数据类型

几种常用的数据类型&#xff1a; String&#xff08;字符串&#xff09; Integer&#xff08;整型&#xff09; Float&#xff08;浮点型&#xff09; Boolean&#xff08;布尔型&#xff09; NULL&#xff08;空值&#xff09; Array&#xff08;数组&#xff09; Obje…...

2FA-双因素认证

双因素认证&#xff08;2FA&#xff0c;Two-Factor Authentication&#xff09;是一种提高安全性的方法&#xff0c;要求用户在登录或进行某些敏感操作时提供两种不同类型的身份验证信息。这种方法通过引入第二层验证&#xff0c;增加了账户被未经授权访问的难度。 项目结构 …...

解决 Python 中的 TypeError 错误

解决 Python 中的 TypeError 错误 在 Python 编程中&#xff0c;TypeError 是一种常见的错误&#xff0c;通常发生在尝试对不兼容的类型进行操作时。了解这个错误的原因以及如何有效解决它&#xff0c;对于提高代码的可靠性和可读性至关重要。本文将详细讨论 TypeError 的成因…...

快速学会C 语言基本概念和语法结构

&#x1f600;前言 本篇博文是关于C 语言的基本概念和语法结构&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我的动力&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证书&#xff0c;下载Apache版本&#xff0c;我目前只发现Apache这个里面有对应的私钥和证书 私钥重命名为private.key证书重命名为public.crt&…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅

目录 前言 操作系统与驱动程序 是什么&#xff0c;为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中&#xff0c;我们在使用电子设备时&#xff0c;我们所输入执行的每一条指令最终大多都会作用到硬件上&#xff0c;比如下载一款软件最终会下载到硬盘上&am…...

微服务通信安全:深入解析mTLS的原理与实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言&#xff1a;微服务时代的通信安全挑战 随着云原生和微服务架构的普及&#xff0c;服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...

规则与人性的天平——由高考迟到事件引发的思考

当那位身着校服的考生在考场关闭1分钟后狂奔而至&#xff0c;他涨红的脸上写满绝望。铁门内秒针划过的弧度&#xff0c;成为改变人生的残酷抛物线。家长声嘶力竭的哀求与考务人员机械的"这是规定"&#xff0c;构成当代中国教育最尖锐的隐喻。 一、刚性规则的必要性 …...

轻量级Docker管理工具Docker Switchboard

简介 什么是 Docker Switchboard &#xff1f; Docker Switchboard 是一个轻量级的 Web 应用程序&#xff0c;用于管理 Docker 容器。它提供了一个干净、用户友好的界面来启动、停止和监控主机上运行的容器&#xff0c;使其成为本地开发、家庭实验室或小型服务器设置的理想选择…...