引子
在学习 Web 和 Python 爬虫的时候,我们都需要向公网 IP(通过 URL)进行请求,然后得到响应数据。一个典型的网络系统架构图如下所示:
但是我们并没有公网 IP,我们通常使用的是 192.168 开头的局域网 IP 地址,或者是网络服务商提供的动态的公共 IP 地址。那么,Web 服务器到底是怎么准确地找到我们并且数据发给我们请求的应用呢?——答案就是 NAT。
NAT 技术也叫网络地址转换技术,是一种私有地址转换成合法/公网 IP 地址的技术。下面我们一起来了解一下,什么是私有地址,什么是合法 IP 地址,以及为什么要引入 NAT 技术。
当你了解了 NAT,相信也会对 Python Web 编程和架构设计有更深的理解!
NAT 技术
私有地址和合法地址
如果组建一个局域网,其中的 IP 地址仅用于局域网内部通信,而不能直接连到 Internet 的话,那么这些IP地址就是局域网的私有 IP 地址。理论上所有 IP 地址均可作为私有 IP 地址,但是 RFC1918 规定私有 IP 地址不能出现在 Internet 上,所以规定了私有IP地址为以下三种:
10.*
,前8位是网络号,共16777216个地址;172.16.*
到172.31.*
,前12位是网络号,共1048576个地址;192.168.*
,前16位是网络号,共65536个地址。
与私有 IP 地址相对的就是公有 IP 地址,也就是合法 IP 地址,是能够用在 Internet 上的通信的,是唯一的。
为什么要引入NAT技术
由于 IP 地址数量有限,对于企业而言,向 ISP 申请 IP 地址,能够申请到的 IP 地址数目也远远满足不了网络用户的需求,所以在局域网内用户在向外网访问的时候,将其私有 IP 地址转换成一个合法的公有 IP 地址,通过这个 IP 地址来在外网上进行访问,而将私有 IP 地址转换成公有 IP 地址的技术就是 NAT 技术。而且在一定程度上,NAT 技术对局域网内的主机与外网进行了分隔,保护了局域网内部的信息交互。
对于 NAT 技术,我们都知道在网络传输过程中数据包中会包含源 IP 地址和目的 IP 地址,它们俩在传输过程当中一般不会改变的,但在这里我们应用 NAT 技术就是要改变它们俩的其中之一满足我们的需求。
在数据包从局域网内部的某个主机上送至网关上时,会将数据包中的源 IP 地址替换成公有 IP 地址,然后转发给外网的某个服务器,而当服务器处理好服务,会向之前接收到的数据包中的源 IP 地址(也就是公有地址)发送数据包,而当它到达网关时,此时数据包中的目的IP地址又会被替换成局域网内发送请求的主机的私有 IP 地址,从而转发到目标主机上。
NAT 技术类型
① 静态转换 Static NAT
将内部网络的私有 IP 地址转换为公有 IP 地址,IP 地址对是一对一的,是一成不变的,某个私有 IP 地址只转换为某个公有 IP 地址。借助于静态转换,可以实现外部网络对内部网络中某些特定设备的访问。
② 动态转换 Dynamic NAT
将内部网络的私有 IP 地址转换为公用 IP 地址时,IP 地址是不确定的,是随机的,所有被授权访问上 Internet 的私有 IP 地址可随机转换为任何指定的合法 IP 地址。也就是说,只要指定哪些内部地址可以进行转换,以及用哪些合法地址作为外部地址时,就可以进行动态转换。动态转换可以使用多个合法外部地址集。当 ISP 提供的合法 IP 地址略少于网络内部的计算机数量时。可以采用动态转换的方式。
前面两种转换私有 IP 地址在访问外网时,都会被分配一个公有 IP 地址,只不过第一种是私有 IP 地址与公有 IP 地址是永久对应的,而第二种则是临时分配给这个静态 IP 地址的,用户断开后这个公有 IP 地址就会被释放,后面别的私有 IP 地址也可以和它匹配,到了这里似乎我们发现当同时一个局域网内有多个主机进行访问,而公有IP数目不够时,似乎无法进行同时访问。
而要实现这一点,就要用下面这种 NAT 技术。
③ 端口多路复用 OverLoad
这种 NAT 技术是应用最多的,它在私有 IP 进行访问时,NAT 服务器会提供一个未被使用的端口,将以 公有IP地址:端口号
的形式替换数据包中的目的 IP 地址(私有IP地址:端口号
),而在服务器响应发送回数据包后,又会将目的地址用 私有IP地址:端口号
替换 公有IP地址:端口号
;所以只要 NAT 服务器还有未被使用的端口号,那么就可以实现局域网内的不同主机同时访问外网。
这里提到了端口号,其实在网络当中,“IP 地址 + 端口号” 才能标识网络服务当中唯一的特定主机的网络进程,这也就是我们的套接字。至于端口号,在网络当中主要分为两类:物理端口(硬端口)和逻辑端口(软端口)。
所谓硬端口就是我们经常能看到的各种设备上真实存在的端口,而软端口则是逻辑意义上用于区分服务的端口,它们是供各种应用程序使用进行各种服务的不存在于真实的某个设备上,但能被应用程序识别的,为了区分这些端口,我们将这些端口进行编号,这也就是我们前面所说的端口号,都是这些软端口的编号。
一台计算机上的有效端口号最多到65535,而我们对这些端口又大致进行了如下划分:0~1023为公认端口,它们一般与我们的常见服务进行绑定(如21对应ftp服务,22对应SSH服务,80对应http服务,443对应https服务);1024~49151为注册端口,这些端口松散的绑定某些服务,但同样也可以用于其他目的;49152及以上为动态端口也叫私有端口,可以用于任意应用软件与其他应用软件进行通信,使用TCP/UDP协议。至于常见的服务与端口号之间的对应关系,可以在 /etc/services 文件中查找。
参考:
来源:CSDN
作者:阿基米东
链接:https://blog.csdn.net/luckydarcy/article/details/82990727