有公众号要不要做网站,百度爱采购推广怎么入驻,成都五月花网页设计培训,j2ee做网站如何实现SCTP多归属链路对接
文章目录 前言一、SCTP是什么#xff1f;二、lksctp三.sctp初始化四.绑定本端两个IP 五.与对端建链六.设置主要路径七.设置是否启用心跳八.关于防火墙的配置 总结 …如何实现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 ProtoclSCTP实现的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信令开始的同行有帮助。