SCTP多地址技术作为TCP的替代方案

9

SCTP具有本地多宿主支持,如果我理解正确,它会在主接口失效时自动将数据包重定向到次要网卡。我通过编写一个自定义路由守护程序来复制此功能,以便在我的主要网卡失效时修改路由表。我想尝试使用SCTP

在Steven的《Unix网络编程第1卷第3版》第288页中写道:

对于这个示例,我们使用一种一对多样式的服务器。我们做出了这个选择,因为有一个重要的原因。第5章中的示例可以通过进行一个小的更改:将socket函数调用修改为指定IPPROTO_SCTP而不是IPPROTO_TCP作为第三个参数来运行SCTP。然而,仅进行这个更改并不能利用SCTP提供的任何其他功能,除了多宿主。

现在我已经尝试过这个方法,但效果很差。

我正在Ubuntu 9.04上运行,安装了libsctp1、libsctp-dev和lksctp-tools软件包。我已经使用lksctp-tools验证了SCTP的正常工作。

我采用了UNP示例代码,并按照上述方法修改了~/unpv13e/tcpcliserv/tcpserv04.c~/unpv13e/select/tcpcli02.c程序。

这是一个简单的回显服务器/客户端对。服务器似乎在运行并监听,但客户端退出并显示连接被拒绝。由于netstat不支持SCTP,我使用lsof -n | grep tcpserv,它显示:

tcpserv04 6208      alice    3u     sock        0,4            33889 can't identify protocol

这似乎并没有告诉我太多,除了 tcpserv04 有某种套接字打开。

我已经重新编写和测试了原始的 TCP 客户端,所以我将其切换到 SCTP 并能够连接,尽管在标准输入上传输文件时不完全起作用(在接收回显的过程中大约被挂起了三分之二)。

UNP 看起来在暗示将 TCP 应用程序移植到 SCTP 以利用多重主机是微不足道的,但基于这个简单的尝试,情况似乎并非如此。

是否有人可以指向一个好的教程或给出良好的建议,在将 TCP 应用程序移植到一对一式 SCTP 以利用多重主机时需要注意什么?


TCP也可以实现这种冗余形式,即路由表中从a到b的多条路径 -- 为什么要费心呢? - Hassan Syed
@Hassan Syed: 因为我很好奇。 - Robert S. Barnes
你尝试过使用Wireshark进行捕获吗?如果一切设置正确,客户端的连接调用应该会触发向服务器的4次握手。此外,我无法从您提供的链接中找到客户端文件(~/unpv13e/select/tcpcli02.c)。 - Aditya Sehgal
2
@Hassan:因为SCTP多宿主不会在其中一个接口失效时中断连接。理论上,你可以通过SCTP从有线以太网连接的笔记本电脑上进行ssh,同时也可以使用wifi,然后将其拆卸并仅使用wifi接口保持相同的连接。 - Jeff Allen
2
@HassanSyed,最初的商业案例是在IP上运行SS7。由于电话公司传统上具有极高的正常运行时间,他们希望能够使用热插拔硬件为基站和交换机提供服务,而不必中断连接。 - Brian Cain
1个回答

2

tcpcli02 尝试连接端口7,而 tcpserv04 监听端口9877(SERV_PORT 的默认值)。将它们更改为匹配后,对我而言运行正常。

通常情况下,SCTP 的支持非常差。除非您控制尝试连接的主机之间的整个网络基础设施,否则我不会指望它能可靠地工作。 根据 UNP 中提到的内容,移植应用程序本身应该相当轻松。


我认为我只需要控制彼此交流的两个端点。为什么我需要控制“整个网络基础设施”呢?啊,我猜网络中的所有路由器都需要明确支持SCTP,而大多数路由器目前并没有这种支持? - Robert S. Barnes
1
实际上,理论上来说,路由器不应该是一个问题,因为它们不会检查第四层。互联网核心的路由器可能不会有这个问题。然而,你越靠近边缘,这种情况就越有可能发生。一旦你到达执行NAPT的设备(它依赖于使用第四层头将数据包映射到端点),你可能就没那么幸运了,因为它们肯定只处理TCP和UDP。 - fnl
IPv6是答案。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接