【问题标题】:How a peer to peer connection is established in python ? ( UDP ) [duplicate]如何在 python 中建立对等连接? (UDP)[重复]
【发布时间】:2020-05-20 19:00:18
【问题描述】:

您好,我想开发一个项目,将点对点文件从一台计算机传输到另一台计算机,该计算机具有不同的 nat 或不同的 ISP,没有中间服务器(仅允许 Stun 服务器)。尽管我们必须使用 Tcp 进行文件传输,但我只想在 UDP 中尝试一下。

我研究了这篇论文 http://brynosaurus.com/pub/net/p2pnat/ 以了解点对点连接的基本观点,并通过使用 aws ec2 免费层在 UDP 连接中尝试了一些实用的东西。

案例1:(使用python的aws中的socket tcp服务器)

在本地机器的 1234 端口打开了一个 tcp 连接,并在同一台机器的同一端口打开了一个 UDP 连接。 通过与 aws 服务器建立 tcp 连接并保持连接来获取公共 ip 和端口。 然后通过从aws(Ssh连接)的终端复制外部地址来使用sendTo函数。我从本地机器向远程计算机的公共地址发送了一个 UDP 数据包

以下是发送 udp 数据包的代码:

sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
sock.sendTo(b'Message',('publicIp',PublicPort))

结果: 失败,可以接受

案例 2:(socket UDP 服务器使用 python 绑定在 aws 的 1234 端口上)

aws 中的服务器代码会维护已建立连接的列表,因此如果存在超过 2 个连接,它会将已建立连接的列表发送给已建立连接列表中的所有客户端。

所以我在每个连接控制台中都收到了已建立连接的列表。

之后,我使用 udp 连接的公共地址使用 sendTo 函数将数据发送到连接。 下面是发送 udp 数据包的代码:

sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) 
sock.sendTo(b'Message',('publicIp',PublicPort))

但我在这种情况下也失败了。

在那之后,我认为 udp 连接的 nat 超时,所以我向服务器发送了一个新的 UDP 数据,但我收到了所有连接中已建立连接的列表。

所以 Nat 超时并没有发生,我一定是技术上的错误,因为服务器可以将 udp 数据发送给客户端,而且 udp 连接较少。

所以逻辑必须是,如果我知道与 aws 服务器建立的 udp 连接的公共地址 我可以将 udp 数据发送到该公共地址。

请帮助我理解这个逻辑,我尝试搜索谷歌,但我不知道在谷歌中搜索的关键字。

我曾经在 google 中搜索过的关键字:

udp打孔 tcp打孔 使用pyp2p进行udp打孔

但我找不到解决办法。

【问题讨论】:

    标签: python sockets udp p2p stun


    【解决方案1】:

    问题是因为您不了解NAT 的工作原理。现在使用的 NAT 有四种类型

    • 全锥形 NAT

    • 受限 NAT

    • 端口受限 NAT

    • 对称 NAT

    您用来穿越 NAT 的方式对某些类型很有用,但并非对所有类型都有用。我们通常使用ICE 来完成这项工作。更何况nat-pmpupnp也可以很好用。

    【讨论】:

    • 谢谢,我认为 upnp 和 ice 会很好用。在 python 中,我看到了一个名为 pyp2p 的 git repo,它使用 Upnp 进行点对点。之后,服务器会将外部 IP 地址发送给其他对等方。我研究了 ICE,我认为如果所有其他选项都不起作用,我们可以使用 TURN 服务器来传递数据包。或者我们可以使用其他对等点将数据包发送给我们无法直接发送数据包的对等点。
    • Nat-pmp 和 Upnp 的效果是一样的,但是我建议你同时实现它们。因为它取决于路由器。如果路由器不支持upnp但支持nat-pmp,不做就惨了。
    猜你喜欢
    • 2012-09-10
    • 2020-04-05
    • 1970-01-01
    • 2021-10-14
    • 2017-08-25
    • 1970-01-01
    • 1970-01-01
    • 2019-05-23
    • 2022-01-18
    相关资源
    最近更新 更多