




















上面所做的实验,我们用的都是 IPv4 的地址。这个 v4 表示的是,用 4 个字节来表示一个地址。4 个字节能表达的最大十进制数,大概是 42 亿多,而今天,全球互联网的使用者已经超过 40 亿了,更别提现在一个人可能有几个设备接入互联网(手机、ipad、笔记本),以及现在成千上万的网络服务器。这些庞大的互联网设备,都需要 IP 地址,所以 IPv4 地址不够用的问题越来越严重。在互联网诞生的那个年代,网络带宽和设备容量及其有限,导致了地址设计时,觉得 4 个字节已经足够了,同样的问题,在使用 2 位十进制数表示 19xx 年也出现过,酿成了著名的“千年虫”事件。
为了解决 IPv4 不够的问题,一个最常见的方法,就是 NAT 技术。如果我们在家上网,我们通过手机的网络设置,或者电脑的 ipconfig 命令,查看我们设备的 IP 地址,往往看到的都是以 192.168. 开头的样子。别人家手机和电脑的 IP 还是 191.168.x.x 的样子。如果没有特别的方法,接入互联网的 IP 地址重复了的话,信息是如何能做到正确的流动呢?
拥有两个地址的设备
我们看到的以 192.168.x.x 为形式的地址,其实是一组特殊的 IP 地址。这类地址叫做“局域网 IP 地址”,也有叫“内网地址”的。互联网的 IP 地址,是由一个叫“互联网名称与数字地址分配机构” (ICANN) 的全球化组织负责的,它在全球范围内协调此类唯一标识符,如果没有这种协调,我们就不会拥有统一的全球互联网。而 192.168.x.x 这组地址,是不会被分配给任何实际需要直接接入互联网的设备(或者人)的,这些地址是保留给大家在“内部使用”的,比如一个公司内部、一个学校内部、或者一个家庭内部。这样所有的设备和程序,就能很快的发现,如果有信息是使用这种地址的,就不需要麻烦的往互联网上传了。实际上,被保留作为“内网地址”的 IP 段,还有另外两段:
10.x.x.x:以 10 开头的所有地址
172.16.0.0 - 172.31.255.255 这个范围的地址
如果我们在家上网,当我们发送一个信息到内网地址的数据,不管是不是在同一个“子网”的,我们的互联网网关(路由器),都不会发到互联网上去。类似的,另外一个特殊的 IP 127.0.0.1,表示“本机”,发往这个地址的信息,甚至不会被操作系统发到网卡上,只会在当前电脑上处理。以前我们监测网卡是否安装好的时候,会用 ping 127.0.0.1 来判断。
前文有提到,我们的路由器的 IP,就是我们电脑上的“默认网关”,而路由器一个最重要的功能,就是当我们的电脑,需要发送信息到互联网上的时候,帮我们把信息转发出去。这种转发的信息,会分成一个个的数据包(又叫数据分组)。在我们所谓的 TCP/IP 数据包里面,会包含发送者的 IP 和端口号,以及接收者的 IP 和端口号。路由器帮我们转发数据的时候,就会把“发送者 IP、端口”部分的信息,从内网地址,改成路由器自己的“公网地址、端口”(不属于内网的地址就是公网地址啦)发送出去。我们可以通过某些网站,来看一下这个过程:这个网站会在页面上,显示 HTTP 请求,也就是发送的 TCP/IP 数据包的发送者 IP。
这个上面的地址,就是你访问其他网站的 IP 地址了。
在路由器管理界面上,标注的 LAN(Local Area Netword),指的就是我们的手机、电脑这些使用“内网 IP”的设备,所组成的网络;而 WAN(Wide Area Network) 指的是,路由器通过电信运营商接入了的互联网的网络。路由器就好像一个插了两个网卡(现在好多电脑都做在主板上,不需要插卡了)的电脑,一边连接着互联网,使用者公网 IP;另外一边连接着家里的网络,使用内网 IP。每个从我们的手机、电脑发出的数据,都通过路由器改写地址之后,发到互联网上。这样的一个把内网数据发到外网的过程,就是所谓 NAT(Network Address Translation) 服务的内容。
本来我想整一下端口转发的实验,但是现在电信的用户早就没有自己的真正公网 IP 了,100.64.x.x 的 IP 属于是运营商的内网 IP,运营商自己也搞了个 NAT,所以我们在路由器上看的 WAN 的 IP 其实并不能真正的被外界访问。这一切,都是因为 IPv4 早就不够用有引起,幸好,我们还有更好的选择,那就是 IPv6!
IPv6 的地址长度是 128 位,而 IPv4 只有 32 位。所以 IPv6 可以给地球每个沙子一个地址。他的样子在之前我们的 ipconfig 指令中大家可能见过了。我的电脑的地址如下:
240e:3bb:ab3:6ee0:9c7d:2826:6be9:318c
这里的每个冒号之间,是一个 16 位数字,也就是 0-65535,也就是说两段地址,就等于原来的一个 IPv4 地址了,而 IPv6 一共有 8 段!
对于 IPv6 来说,不再需要“子网掩码”了,因为地址足够多,直接用前半段(240e:3bb:ab3:6ee0)表示网络号,用后半段(9c7d:2826:6be9:318c)表示主机号。由于这个数字足够大,网络号和主机号,各自都有 18446744073709551616(184亿亿)个号码,这也是足够够的了。IPv4 那些什么 A\B\C 类子网统统见鬼去吧!
由于地址足够多了,所以也不需要规定什么公网和内外地址了,直接每个上网的设备发 1 万个都够!所以也不需要搞什么路由器的端口转发,DMZ 配置之类的玩意。
下面我们用之前的手搓服务器,放在真正的互联网上吧!
第一步肯定是要拿到我们的 IPv6 地址,用 ipconfig 就能看到
我们启动一下 NetAssit,让他监听我们的 IPv6 的地址和 8888 端口,注意要选择“TCP Server IPv6”,地址选最后一个全是 0 的就好了:0:0:0:0:0:0:0:0,表示监听所有的地址。
用微信或者别的什么东西,把下面这个链接发到你的手机上。注意浏览器访问 IPv6 需要用中括号抱起来。
http://[240e:3bb:ab3:6ee0:9c7d:2826:6be9:318c]:8888/
把手机的 wifi 关掉,直接用 4g,以确保我们是通过互联网访问的自己的电脑。然后把上面的地址复制、粘贴到手机浏览器的地址栏中,点访问。这个时候,你的电脑的 NetAssit 应该可以看到一串字符输入,表示手机发的数据已经达到了。
把我们上面的那段 HTTP 报文填入到 NetAssit 的数据发送窗口,然后点“发送”按钮,手机上就能显示出页面来了!
好像用了 IPv6 之后,上面学的好多知识都没用了,譬如折腾个半死的 NAT 设置?其实并不要紧,因为网络协议是为了解决问题而存在的,而解决问题有很多方法。计算机科学中,存在着所谓“一力降十会”“力大砖飞”的事情,就是因为硬件的速度、容量增强之后,很多问题都能迎刃而解。有价值的是,在有限资源的情况下,解决这些问题的思路。
希望以后所有的游戏,都支持用 IPv6 来通信吧!这样我们想联机,就再也不用去折腾什么路由器了!
下一篇,我们开始进入有趣的物理层
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。