python之UDP跨路由器通信(路由器NAT)

概述

UDP跨路由器通信,与在局域网通信有些不同,看下图:

路由器一般有以下2类网口:

  1. lan口(Local Area Network),用于连接局域网
  2. wan口(Wide Area Network),用于连接广域网

还有WLAN(Wireless Local Area Network),无线局域网

局域网间通信

李雷的电脑和韩梅梅的电脑在同一个局域网中,可以正常通信。
这与家庭局域网相同

局域网内主机可以访问广域网主机

李雷的电脑可以访问广域网的服务器,比如李雷通过浏览器可以访问淘宝网站

局域网主机可以 主动访问 广域网主机
在广域网主机执行下面代码:

#coding=utf-8
import socket
def udp_recv():
    udp=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    udp.bind(('0.0.0.0',8000))
    print('监听端口:8000,开始接收数据。。。')
    while True:
        data,addr=udp.recvfrom(1024)
        print(data,addr)
        udp.sendto(b'recv:ok',addr)

if __name__ == "__main__":
    udp_recv()

在李雷的电脑执行下面代码:

#coding=utf-8

import socket,time,os,time
print(int(time.time()))

udp=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 绑定端口号,发送数据的端口号固定
udp.bind(('0.0.0.0',5000))
udp.sendto(b'test',('malaoshi.top',8000))
data,addr=udp.recvfrom(1024)
print(addr,data)
udp.close()

在广域网主机中查看打印结果,发现收到数据的ip不是李雷电脑的ip,端口号也不是上面代码中的端口号

路由器转换发送数据的源IP和源端口号

这是因为路由器做了转换,把局域网到广域网的数据包的源IP 转换成外网IP,源端口号也 转换成 路由器的端口号
实现此功能的,是 路由器的NAT

NAT

Network Address Translation, 网络地址转换

NAT的实现方式有三种,即

  1. 端口多路复用 (Port address Translation,PAT)是指 改变外出数据包的源端口,即端口转换(PAT,Port Address Translation)。
    采用这种方式,内部网络的所有主机均 可共享一个外部IP地址 实现对Internet的访问,从而可以最大限度地 节约IP地址资源。
    同时, 隐藏局域网内的所有主机,即广域网不能主动访问局域网主机,有效避免来自internet的攻击。因此,目前网络中应用最多的就是端口多路复用方式。
  2. 静态转换是指将内部网络的私有IP地址转换为公有IP地址,IP地址对是一对一的,是一成不变的,某个私有IP地址只转换为某个公有IP地 址。借助于静态转换,可以实现外部网络对内部网络中某些特定设备(如服务器)的访问。

  3. 动态转换是指将内部网络的私有IP地址转换为公用IP地址时,IP地址是不确定的,是随机的,所有被授权访问上Internet的私有IP地址可 随机转换为任何指定的合法IP地址。也就是说,只要指定哪些内部地址可以进行转换,以及用哪些合法地址作为外部地址时,就可以进行 动态转换。动态转换可以使用多个合法外部地址集。当ISP提供的合法IP地址略少于网络内部的计算机数量时。可以采用动态转换的方 式。

广域网主机不可以访问局域网主机

正式由于路由器 采用 端口多路复用,隐藏局域网内的所有主机,所以 广域网主机 不可以访问 局域网主机

让广域网主机访问局域网主机

  1. 使用udp协议
  2. 让局域网主机(必须绑定端口)向广域网主机发送udp数据包,让路由器 建立端口映射,广域网主机接收到 端口映射后的 IP和PORT
  3. 广域网主机通过 映射后的 IP和PORT, 可以主动向局域网主机发送udp数据包
  4. 如果第3步执行失败,那么多执行几次第2步
  5. 由于路由器的 端口转换有时间限制,一段时间内没有发送数据,就会失效。
    防火墙有安全机制,一段时间内没有发送数据,可能会禁止。
    为了避免上面情况,要让局域网主机 定时向 广域网主机发送心跳包

感谢:
https://blog.csdn.net/eleven_xiy/article/details/73732147
https://blog.csdn.net/qingwufeiyang12346/article/details/53769866
https://www.cnblogs.com/wangle1001986/p/6087194.html


原文出处:/show_1EF3MIK71I4K.html