概述
路由器一般有以下2类网口:
- lan口(Local Area Network),用于连接局域网
- 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的实现方式有三种,即
- 端口多路复用 (Port address Translation,PAT)是指 改变外出数据包的源端口,即端口转换(PAT,Port Address Translation)。
采用这种方式,内部网络的所有主机均 可共享一个外部IP地址 实现对Internet的访问,从而可以最大限度地 节约IP地址资源。
同时, 隐藏局域网内的所有主机,即广域网不能主动访问局域网主机,有效避免来自internet的攻击。因此,目前网络中应用最多的就是端口多路复用方式。
静态转换是指将内部网络的私有IP地址转换为公有IP地址,IP地址对是一对一的,是一成不变的,某个私有IP地址只转换为某个公有IP地 址。借助于静态转换,可以实现外部网络对内部网络中某些特定设备(如服务器)的访问。
动态转换是指将内部网络的私有IP地址转换为公用IP地址时,IP地址是不确定的,是随机的,所有被授权访问上Internet的私有IP地址可 随机转换为任何指定的合法IP地址。也就是说,只要指定哪些内部地址可以进行转换,以及用哪些合法地址作为外部地址时,就可以进行 动态转换。动态转换可以使用多个合法外部地址集。当ISP提供的合法IP地址略少于网络内部的计算机数量时。可以采用动态转换的方 式。
广域网主机不可以访问局域网主机
正式由于路由器 采用 端口多路复用,隐藏局域网内的所有主机,所以 广域网主机 不可以访问 局域网主机
让广域网主机访问局域网主机
- 使用udp协议
- 让局域网主机(必须绑定端口)向广域网主机发送udp数据包,让路由器 建立端口映射,广域网主机接收到 端口映射后的 IP和PORT
- 广域网主机通过 映射后的 IP和PORT, 可以主动向局域网主机发送udp数据包
- 如果第3步执行失败,那么多执行几次第2步
- 由于路由器的 端口转换有时间限制,一段时间内没有发送数据,就会失效。
防火墙有安全机制,一段时间内没有发送数据,可能会禁止。
为了避免上面情况,要让局域网主机 定时向 广域网主机发送心跳包
感谢:
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
