Python – 在不同网络之间交换数据

Python – Exchange Data Between Different Networks

我对这个话题进行了很多调查,但大多数指南只是教导如何在同一网络上的设备之间交换数据,而关于在不同网络上的设备之间交换数据,我没有完全清楚的来源。我希望有人可以通过这个问题给我(和其他用户)一个很好的概述。如果你有任何关于它的指南或书籍,我会非常感兴趣(Java 也可以)。

  1. 首先我感兴趣的是程序之间的区别 需要快速交换数据(可能是在线视频游戏)与 需要准确交换数据的程序(可能是消息 应用程序)。我的理解是,两者之间的区别是 使用的协议:第一种情况是 UDP(不检查 确保没有数据包丢失),在第二种情况下是 TCP(其中 检查已完成,数据交换速度更慢)。这个对吗? 所以在假设的 Python 脚本中,第一种情况是套接字 创建的内容如下所示:

    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    

    而在第二种情况下看起来像这样:

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
  2. 我的理解是不同网络之间交换数据 你必须使用端口转发(非常好的解释here), 我很清楚的概念。但是,你有任何来源吗? 在 Python 中建议如何操作?还有就是端口转发 为了在两者之间交换数据,您需要做的一切 不同的网络?最后,我不确定我是否理解 UPnP 的作用 在端口转发中播放。基于 this question 似乎是 UPnP 是一种自动端口转发的方法。这是正确的吗?我可以用吗 miniupnpc 库自动完成?

  3. 最后,如果我关闭并打开我的路由器,私有 IP 地址 分配给连接到网络的设备发生变化(因此 我 phone 连接到我家 WiFi 的私人 IP 可能会改变,因为 例如,从 192.168.1.2 到 192.168.1.11)。这是否代表一个 网络编程中的问题?如果我在路由器上设置某个 端口和到达该端口的流量被定向到 某些私有 IP 地址然后这个 IP 发生变化我想有一个 问题。这个对吗?如果是怎么解决?

  1. 您对 UDP 和 TCP 用例的理解似乎很粗略 准确的。 UDP 确保较低的延迟(并非总是如此),因此对于应用程序 要求尽可能低的延迟,同时也不关心错过 数据包,使用UDP。所以如果你考虑视频流,一旦 数据包丢失,阻止每个未来的数据包没有意义 对于那个旧包。这是因为少量的数据 被错过并不真正影响用户的观看体验。为了 游戏,我们希望尽快获得最新数据,所以等待 旧数据也无关紧要。但是如果你正在实施一个协议 或者需要传输所有数据的东西,TCP使 有道理,因为所有信息都传达给 接收器和顺序。
  2. 有几种方法可以在两个专用网络之间交换数据。端口转发当然是一种方法,任何一个网络上的两台机器都必须有端口转发。我对您提到的自动端口转发一无所知,但是您可以进入路由器设置并非常轻松地进行设置。另一种跨网络对话的方法是类似 webRTC 的东西。它是一种使用 STUN TURN 和 ICE 协议来执行称为 NAT 遍历的协议。简而言之,它会诱使您的路由器让您的机器相互通信(类似于临时端口转发)。
  3. 你说得对,这可能是个问题。但是,您应该能够在路由器中设置静态 IP 地址。所以你可以给一台机器分配一个静态 IP 地址,设置端口转发,然后你就有了一个永久(希望)打开的连接。