方案一、动态分配 IP 地址
一个设备上网就分配 IP,不上网就先不分配(权宜之计)
方案二、NAT
网络地址转换
以一当千,使用一个 IP,代表一大波设备
NAT 把 IP 地址分为两大类:
- 内网 IP / 私网 IP(重要)
10.*
172.16~172.31.*
192.168.*
- 外网 IP / 公网 IP:除了私网 IP 就都是公网 IP
要求公网 IP 必须是唯一的,但是私网 IP 在不同的局域网中是允许重复的
- 一台电脑上,有几个网卡就有几个 IP 地址,虚拟出来的网卡也算(软件模拟的网卡)
- 一般笔记本都会有:有线网卡和无线网卡,具体哪个生效就看你当前是用网线上网还是 WiFi 上网
NAT 网络地址转换
一个设备在进行上网的时候,IP 数据报中的 IP 地址,就会被 NAT 设备(通常就是路由器)进行自动修改
- 同一个局域网内,主机 A 访问主机 B
不会涉及到 NAT 机制 - 公网上的设备 A,访问公网上的设备 B
不会涉及到 NAT 机制 - 不同局域网中的主机 A 访问另一个局域网的主机 B
NAT 机制中,是不允许的
之前写
UDP
回服务器的时候,我这台电脑上启动UDP
服务器,你使用UDP
客户端是不能访问的
- 因为我处于我这里的局域网,你处于你们那的局域网
- 在
NAT
机制下,一个局域网中的主机 A 是无法访问领一个主机
- 局域网内部的设备 A,访问公网上的设备 B
NAT 机制主要就是针对这个情况进行生效
但凡是搭建一个服务器给别人使用,都是需要公网 IP 的
- 单个设备
- 此时我的电脑要想访问
CCtalk
这个服务器,就要构造一个 IP 数据报 - 数据包到达运营商路由器(
NAT
设备)之后,就会进行网络地址转换
- 将源 IP 地址由我的 IP 地址变为运营商公网 IP 地址
- 所以
CCtalk
看到的数据包,源 IP 不是192.168.111.222
,而是1.2.3.4
为什么进行这样的 IP 地址的替换就能提高 IP 地址的利用率呢?
- 其实日常上网的设备:手机、电脑、电视、空调等绝大部分都是在不同的局域网中
- 此时就相当于一个公网 IP 就可以代表一大批设备
运营商的公网 IP,不是服务一个设备,而是服务一个片区,可能有上万个设备。此时一个 IP 就代表了上万个设备,此时 IP 的利用率就大大提高了
- 就相当与你在网上买东西,写的收货地址是:北京市海淀区清华园清华大学
- 这个地址对应着几万个人,而不是你一个人
CCtalk 的响应如何正确地返回到我的电脑上呢?
- CCtalk 要构造一个响应数据包
- 达到运营商路由器之后,里面的目的 IP 就会被替换回我的电脑 IP
- 之后就能顺利达到我的电脑
运营商路由器这样的NAT
设备能在发出和收回的时候都进行 IP 替换,就能使内网设备和外网设备进行连接
- 多个设备(同一个局域网内)
在网络通信中,不仅仅只有 IP 信息,还有一个关键的是端口号
- 端口号本来是来区分同一个主机上不同的应用程序的
- 在 NAT 中,就可以用于区分不同主机上不同的应用程序
- 在我的和你的数据包到达运营商路由器之后,要进行 IP 替换。同时运营商路由器会记录一个映射关系:
旧 IP | 旧端口 | 新 IP | 新端口 |
192.168.111.222 | 1234 | 1.2.3.4 | 1234 |
192.168.333.444 | 1235 | 1.2.3.4 | 1235 |
返回数据包的时候
- 此时,CCtalk 服务器返回的响应数据也是有 IP,也是有端口
- 端口就决定这个返回值是给我还是给你
- 运营商路由器收到这个目的端口后,就会看原来记录的映射关系
- 根据传过来的目的端口,运营商路由器可以知道是哪个 IP 传过来的
- 之后再将这个目的端口对应的 IP 替换上去就可以传到对应的设备了
- 目的端口是
1234
,就是传给我 - 目的端口是
1235
,就是传给你
此处就是通过端口号,来区分不同主机的不同程序
是否可能出现:你和我的电脑上 CCtalk 源端口恰好是一样的?
- 这个概率非常小;客户端这里的源端口,是操作系统随机分配的空闲端口
- 就算你的端口号也是 1234,但是路由器建立映射关系表的时候,可以把端口号也替换成不重复的其他端口
NAT
既能替换IP
中的IP
,也能替换TCP/UDP
中的端口。这个就是NAPT
我们当前的网络世界,主要就是 NAT
机制的支撑
NAT 机制的缺点
- 网络环境太复杂了
- 替换过程中,每一层路由器都需要维护映射关系
- 每次转发数据,都要查询映射关系
- 每个步骤都是开销
方案三、IPv6
从根本上解决了 IP 地址不够用的问题
IPv4
使用 32 位 4 个字节表示 IP 地址IPv6
使用 128 位 16 个字节表示 IP 地址
16 个字节表示的 IP 地址数目,比 4 个字节的 IP 地址大: 2 128 − 2 32 2^{128}-2^{32} 2128−232。这个地址空间非常大,大到可以给地球上的每一粒沙子都分配一个唯一的IPv6
地址
IPv6 提出的时间是在上个世纪 90 年代,时间上和 NAT 其实是差不多的。之所以 IPv6 举步维艰,因为 IPv6 和 IPv4 不兼容!
- 要想使用
IPv6
,就要更换新的设备(能支持 IPv6 的设备) - 在
IPv6
提出的当年,显然是不具备这样的条件的。换设备就得花钱,但花钱了网速又不会变快(用户感知不到好处)
NAT 机制,只要给路由器设备更新升级软件即可,硬件不需要改变(成本非常低)
关于Ipv6,强烈推荐大家看一个视频:(https://www.bilibili.com/video/