无需端口转发的点对点套接字通信
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 后面的两个客户端(这是您的路由器正在做的事情)可以使用充当某种中介的第三台服务器来建立连接。
首先,我不是在谈论在 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 后面的两个客户端(这是您的路由器正在做的事情)可以使用充当某种中介的第三台服务器来建立连接。