Tcp 什么是正确的网络协议,用于以尽可能低的延迟将整数偶尔从计算机A传输到计算机B?

Tcp 什么是正确的网络协议,用于以尽可能低的延迟将整数偶尔从计算机A传输到计算机B?,tcp,udp,websocket,Tcp,Udp,Websocket,我不是网络专家,所以请容忍我。我需要在两台计算机之间建立一个非常简单的单向数据连接,每100ms使用该连接将整数(int8或int16)从计算机a传输到计算机B。连接和数据传输将始终在方向a->B。因为我想尽快对@B中的包作出反应,我想知道我应该使用哪种协议来最小化网络延迟。也就是说,我希望传输尽可能“实时”,理想情况下延迟

我不是网络专家,所以请容忍我。我需要在两台计算机之间建立一个非常简单的单向数据连接,每100ms使用该连接将整数(int8或int16)从计算机a传输到计算机B。连接和数据传输将始终在方向a->B。因为我想尽快对@B中的包作出反应,我想知道我应该使用哪种协议来最小化网络延迟。也就是说,我希望传输尽可能“实时”,理想情况下延迟<10ms(如果可能,不应丢失任何包)

下面是我的具体问题:

  • 什么通信协议适合此工作
  • 我试图实现的延迟是否现实
  • 理论上我能达到的最小延迟是多少
  • 延迟会很大程度上取决于所使用的交换机吗?或者任何廉价的消费者转换都可以吗
  • 如果我需要突然发送更多数据,为了最小化开销,最佳的包大小是什么
  • 实际测量延迟的最佳/正确方法是什么
  • 延迟在多大程度上取决于所使用的编程语言?(我正在考虑java、c、python)
  • 使用TCP的利弊是什么
  • 使用UDP的利弊是什么
  • 使用WebSocket的利弊是什么
  • 计算机A和B连接到同一交换机,物理上非常靠近,为了减少不必要的“网络噪音”,可以将计算机与网络的其余部分分离


    非常感谢示例代码:)

    您可以为此使用TCP。只要确保
    B
    在收到每个整数后将应用程序级确认发送回
    A
    。这将允许ACK背驮数据,确保下一次传输不会延迟。延迟应该可以小于1ms。

    鉴于这些非常优化的网络条件,我认为UDP非常适合该任务(数据丢失应该非常罕见,TCP是一种过度杀伤力)。

    如果我理解正确,这些要求应该很容易满足。事实上,您应该能够获得
    <1ms
    延迟。一个简单/粗略的测试是在两台计算机之间使用
    ping
    ,大致了解时间


    对于实现,我将使用TCP/IP。它使可靠性更容易实现(比UDP更简单),并且相对容易实现。您可能希望禁用Nagle算法(
    setsockopt(…TCP\u NODELAY…
    ),以消除通常会发生在如此小的数据包上的延迟。

    我认为您正在寻找的解决方案是客户机-服务器体系结构中的TCP套接字。 由于你没有说明编程语言的选择,我先在Python中尝试一个概念证明,然后(如果它太慢)切换到普通C或C++(使用所提到的LIBS之一)。 另外,请查看延迟和套接字。

    答案:

  • 什么通信协议适合此工作

    这在某种程度上取决于应用程序对数据包丢失和延迟抖动(延迟变化)的容忍度。在本地单交换机配置中,无论使用何种传输方式,您可能都不会遇到这些问题,但如果您的网络变得嘈杂,或者您可能决定将其扩展到更大的网络上,则需要确定哪个更重要。如果避免数据包丢失是您的最高优先级,那么您应该使用基于会话的传输(TCP、WebSockets)。如果避免延迟抖动至关重要,那么您可能需要使用UDP传输。例如,大多数在线FPS游戏使用UDP,因为偶尔的数据包丢失或重新排序是可以接受的,但延迟抖动不是

  • 我试图实现的延迟是否现实

    是的,见下一个答案

  • 理论上我能达到的最小延迟是多少

    在本地单交换机网络上,平均延迟绝对可能低于10毫秒。如果您使用千兆以太网端到端,您可能会实现低于0.1毫秒(100微秒)的平均单向延迟

  • 延迟会很大程度上取决于所使用的交换机吗?或者任何廉价的消费者转换都可以吗

    切换肯定会影响您的延迟。然而,即使是一个便宜的100MB/s用户交换机,也应该能让您的速度低于10ms(甚至可能低于1ms)

  • 如果我需要突然发送更多数据,为了最小化开销,最佳的包大小是什么

    作为一般规则,将通过使用不会分段的最大有效负载来实现最低开销。但是你必须考虑碎片的端到端。例如,您的网卡和交换机是否都支持巨型帧(大于1500字节)?它们是否都具有相同的MTU设置?传输库是否具有任意大小的缓冲区

  • 实际测量延迟的最佳/正确方法是什么

    我建议创建一个延迟测试应用程序,该应用程序包含实际硬件和您打算使用的所有软件堆栈,并构建一个延迟测试应用程序来测试实际延迟(而不仅仅是理论延迟)。您需要测试往返延迟,然后除以2(否则您将把所有时间都花在高精度时间同步上)。此外,您还希望能够轻松地调整有效负载大小,特别是如果您想回答前面关于最有效的包/消息大小的问题。如果您正在考虑UDP,那么我还建议将序列号添加到有效负载中,并检查它们,以确保
    # Echo server program
    import socket, sys
    
    while True:
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.bind(('', int(sys.argv[1])))
        s.listen(1)
        conn, addr = s.accept()
        print 'Connected by', addr
        while True:
            data = conn.recv(1024)
            if not data: break
            conn.sendall(data)
        conn.close()
    
    # Echo client program
    import socket, sys, time
    
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((sys.argv[1], int(sys.argv[2])))
    i = 0
    while True:
        i += 1
        start = time.time()
        s.sendall('Test payload #%d' % i)
        data = s.recv(1024)
        end = time.time()
        print "%f-%f" % (end, start)
        print "Received '%s' back in %f milliseconds" % (data,
                (end-start)*1000.0)
        time.sleep(0.5)
    
    python ./server.py 8123
    
    python ./client.py SERVER_HOST 8123