无需端口转发的点对点套接字通信

Peer to peer socket communication without port forwarding

首先,我不是在谈论在 vps 或服务器

中实现的 tcp 或 udp 或套接字

我的问题就像客户端到客户端套接字通信一样。

想象一下使用 TCP 套接字在家用电脑上收听。无论如何,您都可以从家庭互联网连接到它。但是假设有人想通过互联网连接到它。然后您可以在路由器上创建转发规则并使其进入工作状态。然后路由器知道如果传入连接来自端口,则该连接将被转发到相关内部网络中的设备。 但是我用的ISP不支持端口转发

我认为这些并非不可能,因为有了团队查看器软件。因为当我在team-viewer中连接到一个朋友时,我打开了wire-shark并查看了它。 然后我看到数据包是点对点交换的。因为目标源地址是我的ip和朋友的ip 这意味着无需额外服务器的参与即可交换视频数据 我强调了团队与观众之间的联系。 61.245.175.81 是我朋友的 public IP。 192.168.1.130 是我的内部 IP

我也想这样做

这是我的简单套接字代码。这在互联网上不起作用,因为没有路由器转发规则。我对套接字和网络方面很陌生

服务器

import socket

server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_socket.bind(('', 12000))

while True:
    message, address = server_socket.recvfrom(1024)
    message = repr(message)
    print("Connected from ->  " + str(address) )
    print("Received data ->  " + message)
    reply = b"Hi from server :) "
    server_socket.sendto(reply, address)

客户端

import time , datetime
import socket

client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
client_socket.settimeout(1.0)

message = bytes(str(datetime.datetime.now()),'utf-8')
addr = ("192.168.1.130", 12000)

client_socket.sendto(message, addr)
try:
    data, server = client_socket.recvfrom(1024)
    print( repr(data) )
except: #socket.timeout:
    print('REQUEST TIMED OUT')

谁能解释一下我的问题

很确定他们使用 UDP hole punching 来做到这一点,您需要做类似的事情来实现它。

简而言之,NAT 后面的两个客户端(这是您的路由器正在做的事情)可以使用充当某种中介的第三台服务器来建立连接。