我最近查看了Richards Stevens 撰写的"UNIX网络编程,第1卷"这本书,我发现除了TCP和UDP之外还有第三个传输层标准:SCTP.
简介:SCTP是一种传输级协议,它像UDP一样是消息驱动的,但是像TCP一样可靠.以下是IBM DeveloperWorks的简短介绍.
老实说,我以前从未听说过SCTP.我记不起在任何网络书籍中阅读它或在我参加的课程中听到它.阅读提到SCTP的其他stackoverflow问题表明,我并不孤单,因为缺乏这方面的知识.
为什么SCTP如此未知?为什么没用多少?
我已经看过并阅读了很多类似的问题,以及相应的维基百科文章(NAT遍历,STUN,TURN,TCP打孔),但是大量的信息并没有真正帮助我解决我的非常简单的问题:
我正在编写一个P2P应用程序,我希望NAT后面的两个应用程序用户能够相互连接.连接必须可靠(与TCP的可靠性相当),所以我不能只切换到UDP.该解决方案应该适用于当今的通用系统而无需重新配置.如果有帮助,解决方案可能涉及可连接的第三方,只要它不必代理整个数据(例如,获取对等方的外部(WAN)IP地址).
据我所知,我唯一的选择是使用"可靠的UDP"库+ UDP打孔.这有(C/C++)库吗?我在相关问题中找到了enet,但它只关注解决方案的前半部分.
还要别的吗?我看过的事情:
我们有一个系统(内置C),可以通过UDP进行通信.最近我们发现有必要保证数据包的传送.我的问题是:基于UDP的系统最少增加什么才能确保使用ack数据包进行传输?此外,理想情况下无需操纵数据包标头.我们对数据包进行应用程序级控制,包括序列号和ack/nack标志.我想知道这是否是一个失败的原因,我们尝试做的任何事情基本上都是一个有缺陷和破坏的TCP版本.基本上,我们可以通过极简主义改进来实现有保证的交付(我们不需要TCP的许多功能,例如拥塞控制等).谢谢!
速度,优化和可扩展性是Udp和Tcp协议之间的典型比较.Tcp吹嘘可靠性有一点额外开销的缺点,但速度很好,非常好.一旦Tcp套接字被实例化,保持套接字打开需要一些开销.但与Udp所描述的负担相比,哪种协议实际上有更多的开销?我也听说过Tcp存在可扩展性问题......但是互联网(网页/服务器)在Tcp上运行 - 那么Tcp是什么阻碍了可扩展性呢?
好的...所以Udp不需要保持连接打开的开销.但是,它要求您编写额外的方法以确保所有数据包都到达那里,希望按照您希望它接收的顺序.如果未完整收到数据包,则必须告知客户端或服务器重新发送.此外,您还必须为部分数据包保留某种消息收集,重建部分消息,并在最终处理消息之前检查完整的消息.更不用说如果消息的第二部分永远不会成功,你必须要么重新发送整个内容,要么重新发送我们缺少的部分,或者其他什么.
基本上,我的问题是:
注意:我不反对为服务器实现Udp选项.我们在.Net 3.5框架上使用C#.所以我也对处理Udp 负担的最佳实践感兴趣.我也在套接字级别使用异步方法,而不是使用TcpListener,TcpClient等.
我必须用 Python 从头开始编写一个可靠的、完全有序的多播系统。我不能使用任何外部库。我可以使用中央音序器。
似乎有两种直接的方法:
我被允许使用第二个选项,并且我倾向于这样做。
我目前正在多播 UDP 消息(这似乎是唯一的选择),但这意味着某些消息可能会丢失。这意味着我必须能够唯一标识每个发送的 UDP 消息,以便可以根据 #2 重新发送。我真的应该生成唯一的数字(例如,使用发件人地址和计数器)并将它们打包到每个发送的 UDP 消息中吗?我该怎么做?以及如何在 Python 中接收单个 UDP 消息,而不是数据流(即socket.recv)?
许多游戏开发者选择在应用程序级别使UDP 可靠.这不是TCP的用途吗?我创建了一个API,使用UDP和TCP数据包启用客户端 - 服务器通信.我应该在列表中添加Reliable UDP吗?为什么?如果我使用TCP有问题吗?
我只是想知道RUDP是否对TCP有任何好处,因此我可以选择是否添加RUDP支持.
我目前在使用UDP和Python套接字模块时遇到问题.我们有服务器和客户端.当我们向用户发送数据时会出现问题.用户可能通过客户端崩溃,ISP断开连接或其他一些不正确的方法关闭了与服务器的连接.因此,可以将数据发送到封闭的套接字.
当然,使用UDP,您无法判断数据是否真正到达或是否已关闭,因为它不关心(至少,它不会引发异常).但是,如果您发送数据并且它已关闭,则会以某种方式返回数据(???),最终会在sock.recvfrom上出现套接字错误.[Errno 10054]远程主机强行关闭现有连接.几乎看起来像连接的自动响应.
虽然这很好,但可以通过try:except:block来处理(即使它会降低服务器的性能).问题是,我不知道这是来自谁或什么套接字关闭.有没有找到'谁'(ip,socket#)发送这个?它会很棒,因为我可以立即断开它们并将它们从数据中删除.有什么建议?谢谢.
服务器:
import socket
class Server(object):
    def __init__(self):
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.connected = {}
    def connect(self):
        self.socket.bind(('127.0.0.1', 5579))
    def find_data(self):
        while 1:
            data, address = self.socket.recvfrom(1024)
            self.got_data(data,address)
            if self.connected.has_key(address):
                pass
            else:
                self.connected[address] = None
    def got_data(self, data, address):
        print "GOT",data,"FROM",address
        for people in self.connected:
            print people
            self.send_data('hi', people)
    def send_data(self, data, address):
        self.socket.sendto(data,address)
if __name__ == '__main__':
    server = Server()
    server.connect()
    print "NOW SEARCHING FOR DATA"
    server.find_data()
客户:
import socket, time
class Client(object): …我知道该协议不支持这一点,但对于需要一定程度可靠性的客户端来说,如果发现它是腐败的,请求重新发送数据包的方法是否常见?
任何人都可以推荐一个易于使用,快速和可靠的C++ API来通过UDP套接字发送和接收数据?也许某些特定用于多人游戏的东西?
我正在开发基于 udp/tcp 的 P2P 文件和实时视频流应用程序。该应用程序将使用 C++ 为 Linux 和 Windows 平台开发。
我们使用 ICE(TCP/UDP 打孔)来实现 P2P。虽然 TCP 确保数据包丢失,但对于 UDP,我需要一种体面的方法来确保必须将数据包传送到其他对等方。
任何链接和建议将不胜感激?