如何使用Python发送TCP请求,路由是如何工作的



我设法完成了一个程序,该程序在网络中将数据从电脑发送到电脑。这很容易,因为中继器和一个网络中的所有设备都可以将请求路由到网络中的其他电脑。

但是,如果我离开我的网络,甚至可能添加一个经过几次重新路由的VPN,我的数据如何到达目的地?

更重要的是,我该如何编程?我知道通过

send()

我可以添加字节、标志和IP地址+端口,如果我从VPN的IP地址获取数据,我就不能直接去";是的,让我们把它还给它来的时候;。我如何知道要将其发送到VPN和路由器的哪个端口,VPN如何知道/如何告诉它将其转发到路由器和路由器的什么端口,以及如何告诉路由器将其发送给网络中特定PC的指定端口?

TLDR:您只需要指定目的地(IP:port(。正确配置的VPN连接应指示您的系统设置其IP范围和网关。该设置由VPN服务器预先配置或分发。

这不是一个真正的python问题,而是网络问题。假设我们使用的是TCP/IP,只有一个NIC连接到您的系统。您的系统连接到路由器或交换机,而不是对等或其他网络。

系统的网络堆栈在接收到python的连接请求后,将只向默认网关发送数据包,而不考虑其最终目的地(此类信息是数据包的一部分,请参阅https://en.wikipedia.org/wiki/IPv4)。

从这一点开始,您的系统几乎无法控制数据包的传输路线,即使用哪些设备,避免使用哪些设备。相反,它是由介于两者之间的交换机和路由器的路由表定义的。更具体地说,路由表定义了IP范围和下一跳,例如

10.0.0.0/8 -> 10.0.0.1  # the next router's IP
1.2.3.4/32 -> a.b.c.d
0.0.0.0/0 -> none

每个中间设备都会做同样的事情,直到你的目的地连接到最后一个网关。这个设备会直接将数据包发送到你的dest,因为它知道你的dests触手可及。

通用VPN(PPTP、L2TP、IPSec(只添加了一个虚拟NIC,并设置了系统的首选项,这样相应的流量就会通过这个虚拟网关(而不是默认的(。但上述规定仍然适用。

最新更新