Sockets 关于p2p应用中的UDP端口
我正在做一个DHT的小演示项目(仅限p2p路由,如Chord、Pastry等),我对p2p网络中的传输细节感到困惑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和随
假设所有节点使用<强> UDP通信,端口为强> 10050 ,这是固定的,然后考虑两个典型的例子:
bind()
)到特定的本地端口。该本地端口将同时作为传出消息的源端口和传入消息的目标端口。请注意,对于UDP,您可能希望使用POSIXsendmsg()
或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”方法,因为它允许端口选择以避免端口冲突,并且非常简单,非常感谢:]