相关疑难解决方法(0)

为什么SCTP没有太多使用/已知

我最近查看了Richards Stevens 撰写的"UNIX网络编程,第1卷"这本书,我发现除了TCP和UDP之外还有第三个传输层标准:SCTP.

简介:SCTP是一种传输级协议,它像UDP一样是消息驱动的,但是像TCP一样可靠.以下是IBM DeveloperWorks简短介绍.

老实说,我以前从未听说过SCTP.我记不起在任何网络书籍中阅读它或在我参加的课程中听到它.阅读提到SCTP的其他stackoverflow问题表明,我并不孤单,因为缺乏这方面的知识.

为什么SCTP如此未知?为什么没用多少?

networking tcp popularity sctp

185
推荐指数
8
解决办法
5万
查看次数

实用的NAT遍历可靠的网络连接

我已经看过并阅读了很多类似的问题,以及相应的维基百科文章(NAT遍历,STUN,TURN,TCP打孔),但是大量的信息并没有真正帮助我解决我的非常简单的问题:

我正在编写一个P2P应用程序,我希望NAT后面的两个应用程序用户能够相互连接.连接必须可靠(与TCP的可靠性相当),所以我不能只切换到UDP.该解决方案应该适用于当今的通用系统而无需重新配置.如果有帮助,解决方案可能涉及可连接的第三方,只要它不必代理整个数据(例如,获取对等方的外部(WAN)IP地址).

据我所知,我唯一的选择是使用"可靠的UDP"库+ UDP打孔.这有(C/C++)库吗?我在相关问题中找到了enet,但它只关注解决方案的前半部分.

还要别的吗?我看过的事情:

  1. Teredo隧道 - 需要操作系统和/或用户配置的支持
  2. UPnP端口转发 - UPnP在任何地方都不存在/启用
  3. TCP打孔似乎是实验性的,仅在某些情况下有效
  4. SCTP的支持甚至低于IPv6.通过UDP的SCTP只是花哨的可靠UDP(见上文)
  5. RUDP - 几乎没有主流支持
  6. 根据我对STUN,STUNT,TURN和ICE的理解,他们中的任何一个都不会对我有所帮助.

networking tcp nat-traversal

14
推荐指数
1
解决办法
3692
查看次数

通过UDP实现ack?

我们有一个系统(内置C),可以通过UDP进行通信.最近我们发现有必要保证数据包的传送.我的问题是:基于UDP的系统最少增加什么才能确保使用ack数据包进行传输?此外,理想情况下无需操纵数据包标头.我们对数据包进行应用程序级控制,包括序列号和ack/nack标志.我想知道这是否是一个失败的原因,我们尝试做的任何事情基本上都是一个有缺陷和破坏的TCP版本.基本上,我们可以通过极简主义改进来实现有保证的交付(我们不需要TCP的许多功能,例如拥塞控制等).谢谢!

c networking udp tcp network-protocols

8
推荐指数
3
解决办法
8891
查看次数

Tcp可靠性与Udp负载对于认真,高性能的服务器

速度,优化和可扩展性是Udp和Tcp协议之间的典型比较.Tcp吹嘘可靠性有一点额外开销的缺点,但速度很好,非常好.一旦Tcp套接字被实例化,保持套接字打开需要一些开销.但与Udp所描述的负担相比,哪种协议实际上有更多的开销?我也听说过Tcp存在可扩展性问题......但是互联网(网页/服务器)在Tcp上运行 - 那么Tcp是什么阻碍了可扩展性呢?

好的...所以Udp不需要保持连接打开的开销.但是,它要求您编写额外的方法以确保所有数据包都到达那里,希望按照您希望它接收的顺序.如果未完整收到数据包,则必须告知客户端或服务器重新发送.此外,您还必须为部分数据包保留某种消息收集,重建部分消息,并在最终处理消息之前检查完整的消息.更不用说如果消息的第二部分永远不会成功,你必须要么重新发送整个内容,要么重新发送我们缺少的部分,或者其他什么.

基本上,我的问题是:

  1. 为什么我会选择Udp over Tcp作为一个严肃的高性能服务器,增加了消息检查和手动ACK的"开销"与连续流的"开销"?
  2. 如果Tcp对于魔兽世界来说足够好,为什么Tcp不被广泛接受作为游戏服务器使用协议?

注意:我不反对为服务器实现Udp选项.我们在.Net 3.5框架上使用C#.所以我也对处理Udp 负担的最佳实践感兴趣.我也在套接字级别使用异步方法,而不是使用TcpListener,TcpClient等.

c# sockets udp tcp .net-3.5

8
推荐指数
2
解决办法
5724
查看次数

用 Python 编写一个可靠的、完全有序的多播系统

我必须用 Python 从头开始​​编写一个可靠的、完全有序的多播系统。我不能使用任何外部库。我可以使用中央音序器。

似乎有两种直接的方法:

  1. 编写一个高效的系统,为每个多播消息附加一个唯一的 id,具有它接收到的消息 id 的定序器多播序列号,并来回发送 ACK 和 NACK。
  2. 编写一个低效的泛洪系统,其中每个多播器简单地重新发送它收到的每条消息一次(除非它是由该特定多播器发送的。)

我被允许使用第二个选项,并且我倾向于这样做。

我目前正在多播 UDP 消息(这似乎是唯一的选择),但这意味着某些消息可能会丢失。这意味着我必须能够唯一标识每个发送的 UDP 消息,以便可以根据 #2 重新发送。我真的应该生成唯一的数字(例如,使用发件人地址和计数器)并将它们打包到每个发送的 UDP 消息中吗?我该怎么做?以及如何在 Python 中接收单个 UDP 消息,而不是数据流(即socket.recv)?

python sockets ip networking multicast

5
推荐指数
1
解决办法
2942
查看次数

为什么游戏开发人员在应用程序级别中避免使用TCP并使UDP可靠?

许多游戏开发者选择在应用程序级别使UDP 可靠.这不是TCP的用途吗?我创建了一个API,使用UDP和TCP数据包启用客户端 - 服务器通信.我应该在列表中添加Reliable UDP吗?为什么?如果我使用TCP有问题吗?

我只是想知道RUDP是否对TCP有任何好处,因此我可以选择是否添加RUDP支持.

networking udp tcp rudp

5
推荐指数
2
解决办法
2871
查看次数

UDP数据接收上的Python套接字错误.(10054)

我目前在使用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()
Run Code Online (Sandbox Code Playgroud)

客户:

import socket, time

class Client(object): …
Run Code Online (Sandbox Code Playgroud)

python sockets client udp

3
推荐指数
1
解决办法
1万
查看次数

UDP可以重传丢失的数据吗?

我知道该协议不支持这一点,但对于需要一定程度可靠性的客户端来说,如果发现它是腐败的,请求重新发送数据包的方法是否常见?

networking udp udpclient

3
推荐指数
1
解决办法
9072
查看次数

C++多人UDP套接字API

任何人都可以推荐一个易于使用,快速和可靠的C++ API来通过UDP套接字发送和接收数据?也许某些特定用于多人游戏的东西?

c++ sockets udp multiplayer

1
推荐指数
3
解决办法
4730
查看次数

udp丢包和恢复

我正在开发基于 udp/tcp 的 P2P 文件和实时视频流应用程序。该应用程序将使用 C++ 为 Linux 和 Windows 平台开发。

我们使用 ICE(TCP/UDP 打孔)来实现 P2P。虽然 TCP 确保数据包丢失,但对于 UDP,我需要一种体面的方法来确保必须将数据包传送到其他对等方。

  1. 我想知道执行此操作的算法或技术。
  2. 是否有任何免费的 thord 方工具/库可以做。

任何链接和建议将不胜感激?

p2p udp network-programming hole-punching

1
推荐指数
1
解决办法
4897
查看次数