首页 文章

关于p2p应用程序中的UDP端口

提问于
浏览
1

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

假设所有对等体使用 UDP 进行通信且端口为 10050 (这是固定端口),则考虑两种典型情况:

  • A 可能会向 B 发送"JOIN"消息 .

  • 此外, B 可能会根据p2p性质向 A 发送"JOIN"消息(或其他消息) .

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

在案例2中,消息的目标端口必须是 10050 ;

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

2 回答

  • 2

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

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

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

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

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


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

    找出哪个本地地址用于默认路由并绑定到该路由 .

  • -1

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

    udp-socket 无需绑定或连接;如果它没有绑定, 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)
    

    发送(子字节字节start-pos end-pos)作为数据报从未连接的udp-socket到端口 port-no 上的远程机器 hostname-address 的套接字 . udp-socket 无需绑定或连接;如果没有绑定, udp-send-to 将其绑定到随机本地端口 . 如果套接字的传出数据报队列太满,无法支持发送,则 udp-send-to 阻塞,直到数据报可以排队 .

相关问题