我最近查看了Richards Stevens 撰写的"UNIX网络编程,第1卷"这本书,我发现除了TCP和UDP之外还有第三个传输层标准:SCTP.
简介:SCTP是一种传输级协议,它像UDP一样是消息驱动的,但是像TCP一样可靠.以下是IBM DeveloperWorks的简短介绍.
老实说,我以前从未听说过SCTP.我记不起在任何网络书籍中阅读它或在我参加的课程中听到它.阅读提到SCTP的其他stackoverflow问题表明,我并不孤单,因为缺乏这方面的知识.
为什么SCTP如此未知?为什么没用多少?
各种Windows版本都支持哪种SCTP?
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netinet/sctp.h>
#include <stdio.h>
#include <string.h>
int main(int argc,char **argv)
{
struct sockaddr_in remoteAddr;
int clientSock = socket(PF_INET,SOCK_SEQPACKET,IPPROTO_SCTP);
if(clientSock == -1) {
perror("socket");
return 1;
}
memset(&remoteAddr,0,sizeof remoteAddr);
remoteAddr.sin_family = AF_INET;
remoteAddr.sin_len = sizeof remoteAddr;
remoteAddr.sin_port = htons(5555);
remoteAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
sctp_assoc_t assoc_id = 0;
if(sctp_connectx(clientSock,(struct sockaddr*)&remoteAddr,1, &assoc_id)!= 0) {
perror("sctp_connectx");
return 1;
}
printf("Connected! Assoc ID %d\n",(int)assoc_id);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
运行时,此代码失败:
$ clang -Wall sctp_connect.c
$ ./a.out
sctp_connectx: Invalid argument
$ uname -rp …Run Code Online (Sandbox Code Playgroud) 我一直在使用C开发这个简单的客户端 - 服务器应用程序,其中客户端只是将随机数据发送到服务器,服务器只是监听客户端发送的内容.我正在使用的协议是SCTP,我对如何实现多宿主功能很感兴趣.
我一直在互联网上搜索有关SCTP和多宿主的信息,并且无法找到有关如何指示SCTP使用多个地址进行通信的任何示例.我只是设法找到在尝试使用多宿主设置SCTP时应该使用的命令,它应该非常简单.
我创建了一个客户端和一个服务器,它们都使用我的计算机两个WLAN接口作为它们的连接点.两个适配器都连接到同一个AP.服务器正在从这些接口侦听来自客户端的数据,客户端通过它们发送数据.问题是,当我断开客户端正在发送数据的主WLAN适配器时,传输只会在它应该回退到辅助连接时停止.我用Wireshark跟踪了数据包,第一个INIT和INIT_ACK数据包报告客户端和服务器都使用WLAN适配器作为通信链路.
当我重新连接主WLAN连接时,传输会在一段时间后继续传输并向服务器发送大量数据包,这是不对的.数据包应该通过辅助连接传输.在许多网站上,据说SCTP在连接之间自动切换,但在我的情况下,没有发生.所以你们有什么线索,为什么当主链路断开时传输不会回退到辅助连接,即使客户端和服务器知道其他地址包括辅助地址?
关于服务器:
服务器创建SOCK_SEQPACKET类型套接字并绑定使用INADDR_ANY找到的所有接口.getladdrs报告服务器被限制为3个地址(包括127.0.0.1).之后,服务器侦听套接字并等待客户端发送数据.服务器使用sctp_recvmsg调用读取数据.
关于客户:
客户端还创建一个SEQPACKET套接字并连接到命令行参数指定的IP地址.在这种情况下,getladdrs还返回3个地址,如服务器情况.之后,客户端开始向服务器发送数据,延迟一秒钟到服务器,直到用户使用Ctrl-C中断发送.
这是一些源代码:
服务器:
#define BUFFER_SIZE (1 << 16)
#define PORT 10000
int sock, ret, flags;
int i;
int addr_count = 0;
char buffer[BUFFER_SIZE];
socklen_t from_len;
struct sockaddr_in addr;
struct sockaddr_in *laddr[10];
struct sockaddr_in *paddrs[10];
struct sctp_sndrcvinfo sinfo;
struct sctp_event_subscribe event;
struct sctp_prim prim_addr;
struct sctp_paddrparams heartbeat;
struct sigaction sig_handler;
void handle_signal(int signum);
int main(void)
{
if((sock = socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP)) < 0)
perror("socket");
memset(&addr, 0, sizeof(struct sockaddr_in));
memset((void*)&event, 1, sizeof(struct sctp_event_subscribe)); …Run Code Online (Sandbox Code Playgroud) 我正在研究SCTP协议.它的功能看起来很吸引 我担心的是社区的支持.是否有任何良好的跨平台(至少Linux和Windows)C++(或至少C)SCTP库?它是否支持异步方法?
我正在寻找SCTP协议的.NET实现.组件或C#/ F#源代码将是首选,但是如果没有这样的东西可用,VB.NET源代码也可能工作.我正在研究的项目是针对.NET Framework v3.5,但欢迎任何适用于.NET v2到v4的项目.
SCTP具有本机多宿主支持,如果我理解正确,将在主接口关闭时通过辅助NIC自动重新路由您的数据包.我通过编写自定义路由守护程序来复制此功能,以便在主NIC发生故障时修改路由表.我想尝试使用SCTP.
在Steven的Unix网络编程V1第3版第288页中,它说:
对于此示例,我们使用一对多样式的服务器.我们做出这个选择有一个重要原因.可以修改第5章中的示例以通过
SCTP一个小的更改来运行:修改socket函数调用以指定IPPROTO_SCTP而不是IPPROTO_TCP作为第三个参数.但是,简单地进行此更改不会利用SCTP除多宿主之外提供的任何其他功能.
现在我尝试了相当差的结果.
我正在使用安装了libsctp1,libsctp-dev和lksctp-tools软件包的Ubuntu 9.04上运行.我已经使用SCTP正常工作的lksctp-tools进行了验证.
我拿了UNP示例代码并修改了如上所示~/unpv13e/tcpcliserv/tcpserv04.c和~/unpv13e/select/tcpcli02.c程序.
这是一个简单的echo服务器/客户端对.服务器运行显然正在侦听,但客户端退出说连接被拒绝.由于netstat不支持SCTP我使用的lsof -n | grep tcpserv显示我:
tcpserv04 6208 alice 3u sock 0,4 33889 can't identify protocol
Run Code Online (Sandbox Code Playgroud)
除了tcpserv04有某种套接字打开之外,这似乎并没有告诉我什么.
我已经重新编写并测试了perl中的原始TCP客户端,所以我将其切换到sctp并且能够连接虽然在stdin上管道文件没有完全正常工作(通过接收回声的回来挂了大约2/3) .
似乎UNP暗示将TCP应用程序移植到SCTP以利用多宿主是微不足道的,但基于这种简单的尝试似乎并非如此.
任何人都可以指点我一个好的教程,或者在将TCP应用程序移植到一对一风格的SCTP以利用多宿主的时候注意任何问题吗?
我看到SCTP将用于从Chrome 31开始的数据通道,并且根据这个谷歌组线程,有时在2014年2月将正式弃用基于RTP的频道:
https://groups.google.com/forum/#!topic/discuss-webrtc/y2A97iCByTU
这是否也意味着webrtc音频和视频频道最终也将通过SCTP传输(如果尚未在工作中)?
RTP如何适应整个SCTP传输工作?这是否意味着SRTP数据包将通过SCTP数据通道流动?或者只是有效载荷将通过SCTP传输协议发送.
如果我在SCTP上阅读信息,它结合了最好的TCP和UDP协议; 但它默认不包括加密; 因此,流过的流量仍应加密.
任何其他信息都会有所帮助.谢谢!
如何在Android中使用SCTP协议?
我已经知道Android系统默认不支持SCTP,但是可以通过插入SCTP内核模块来启用它,或者在模块配置中使用SCTP重建内核.
我需要对这个问题有所了解.可能吗?如何让android支持协议?如何构建内核模块并正确插入?如果我们能够成功地使系统支持它,我们如何使用该协议?android上的Java API是否支持SCTP?
android network-programming network-protocols linux-kernel sctp
是否有类似于 Linux 和 Solaris 使用的“eth0”的 Windows 通用 IP 设备名称?
我正在尝试监视 SCTP 流量,这似乎成功传递了 ip 地址,但这意味着每台使用此应用程序的机器都会更改为使用主机地址。
谢谢
sctp ×10
sockets ×3
c ×2
tcp ×2
.net ×1
android ×1
c++ ×1
device-name ×1
ethernet ×1
freebsd ×1
ip-address ×1
linux ×1
linux-kernel ×1
multihomed ×1
networking ×1
popularity ×1
webrtc ×1
windows ×1