我正在做一个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 回答
您通常使用套接字绑定(POSIX
bind()
)到特定的本地端口 . 该本地端口既可以作为传出消息的源端口,也可以同时作为传入消息的目标端口 . 请注意,对于UDP,您可能希望使用POSIXsendmsg()
或sendto()
调用而不是send()
.这对于DHT协议很重要,因为其他节点会根据您的源端口推断您正在侦听的端口,并将其存储在路由表中 .
至于具体的端口号,原则上可以为DHT使用固定的端口号,这意味着其他节点不必推断监听端口,因为它们知道它是固定的 .
但最好有一些灵活性,以避免端口冲突 . 因此,节点通常应该可以自由选择任何端口,然后通过该端口执行所有发送和接收操作 .
此外,由于IPv6变得越来越普遍,您需要将套接字绑定到主机上的一个特定地址,因为v6通常为每个主机提供多个地址并监听多个接口,并且从不同的IP发送消息将使您看起来不可靠DHT节点(不断变化的IP地址) . 即如果可以避免,请不要绑定到任何本地地址(
0.0.0.0
或::0
) .找出哪个本地地址用于默认路由并绑定到该路由 .
创建UDP套接字并将其绑定到端口,然后我们仍然可以使用此套接字发送消息 . UDP是对称的,不像TCP .
udp-socket
无需绑定或连接;如果它没有绑定,udp-send-to
将它绑定到随机本地端口 .发送(子字节字节start-pos end-pos)作为数据报从未连接的udp-socket到端口
port-no
上的远程机器hostname-address
的套接字 .udp-socket
无需绑定或连接;如果没有绑定,udp-send-to
将其绑定到随机本地端口 . 如果套接字的传出数据报队列太满,无法支持发送,则udp-send-to
阻塞,直到数据报可以排队 .