Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 关于p2p应用中的UDP端口_Sockets_Udp_Port_P2p_Dht - Fatal编程技术网

Sockets 关于p2p应用中的UDP端口

Sockets 关于p2p应用中的UDP端口,sockets,udp,port,p2p,dht,Sockets,Udp,Port,P2p,Dht,我正在做一个DHT的小演示项目(仅限p2p路由,如Chord、Pastry等),我对p2p网络中的传输细节感到困惑 假设所有节点使用 UDP通信,端口为强> 10050 ,这是固定的,然后考虑两个典型的例子: A可以向B发送“加入”消息 另外,B可以根据p2p的性质向a发送“加入”消息(或其他消息) 在情况1中,消息的目标端口必须为10050 在情况2中,消息的目标端口必须是10050 我想知道在这两种情况下,消息的源端口是什么?如果是由系统调用决定的随机端口,则DHT协议栈需要在10050和随

我正在做一个DHT的小演示项目(仅限p2p路由,如Chord、Pastry等),我对p2p网络中的传输细节感到困惑

假设所有节点使用<强> UDP通信,端口为强> 10050 ,这是固定的,然后考虑两个典型的例子:

  • A可以向B发送“加入”消息
  • 另外,B可以根据p2p的性质向a发送“加入”消息(或其他消息) 在情况1中,消息的目标端口必须为10050

    在情况2中,消息的目标端口必须是10050

    我想知道在这两种情况下,消息的源端口是什么?如果是由系统调用决定的随机端口,则DHT协议栈需要在10050和随机端口上处理数据报,这是基于DHT的应用程序(例如,emule、bittorrent)中的正常行为吗

    我想知道在这两种情况下,消息的源端口是什么?如果是由系统调用决定的随机端口

    通常使用套接字绑定(POSIX
    bind()
    )到特定的本地端口。该本地端口将同时作为传出消息的源端口和传入消息的目标端口。请注意,对于UDP,您可能希望使用POSIX
    sendmsg()
    sendto()
    调用,而不是
    send()

    这对于DHT协议很重要,因为其他节点根据您的源端口推断您正在侦听的端口,并将其存储在其路由表中

    至于具体的端口号,原则上可以为DHT使用固定的端口号,这意味着其他节点不必推断侦听端口,因为它们知道它是固定的

    但最好有一些灵活性,这样可以避免港口冲突。因此,节点通常可以自由选择任何端口,然后通过该端口执行所有发送和接收操作


    此外,由于IPv6变得越来越普遍,您需要将套接字绑定到主机上的一个特定地址,因为v6通常为每台主机提供多个地址,监听多个接口并从不同IP发送消息会使您对其他DHT节点不可靠(IP地址不断变化)。也就是说,如果可以避免,请不要绑定到任何本地地址(
    0.0.0.0
    ::0


    找出默认路由使用的本地地址并绑定到该地址。

    创建UDP套接字并将其绑定到端口,然后我们仍然可以使用该套接字发送消息。UDP是对称的,不像TCP

    udp套接字
    无需绑定或连接;如果未绑定,
    udp send to
    将其绑定到随机本地端口

    (udp-send-to        udp-socket               
            hostname                 
            port-no              
            bstr                 
         [  start-pos                
            end-pos])       →       void
      udp-socket : udp?
      hostname : string?
      port-no : port-number?
      bstr : bytes?
      start-pos : exact-nonnegative-integer? = 0
      end-pos : exact-nonnegative-integer? = (bytes-length bstr)
    

    将(子字节开始位置结束位置)作为数据报从未连接的udp套接字发送到端口号上远程计算机主机名地址的套接字。
    udp套接字
    无需绑定或连接;如果未绑定,
    udp send to
    将其绑定到随机本地端口。如果套接字的传出数据报队列太满,无法支持发送,
    udp send to
    会阻塞,直到数据报可以排队。

    非常感谢,现在一切都清楚了!因此,DHT中的传输规则(假设UDP)在发送和接收操作中使用相同的端口,而端口可以预定义或动态选择,对吗?如果节点使用预定义的侦听端口,则源端口无关紧要。如果节点可以自由选择端口,则它们必须使用send==receive port,或者必须将其接收端口显式编码为DHT消息的一部分。我现在清楚了,我将在演示中尝试使用“send==receive port”方法,因为它允许端口选择以避免端口冲突,并且非常简单,非常感谢:]