引言 #
最近重温《TCP/IP协议簇》,读到子网这个部分,概念都能弄懂,但是不明白子网存在的目的,很多资料都说有两个好处,一是能够判断IP存在局域网还是远程网,另外一个将大的网段分成多个小子网。
这样就搞得我一头雾水,原来我对互联网的认识是从TCP、HTTP高层协议理解的,我原来对互联网信息传递的理解就像这篇回答,网络就像一个神奇的大网,你只需要把电话线插到“网”中就能同别人连起来。原来我对这个解释并没有什么疑问,但是我越来越深入“互联网”,我就我对“互联网”越来越疑惑。
举个例子,我们知道这个IPV4理论上总共有4294967296(256*256*256*256)
个,按照当前的理论,过几年就要分配完了,那意味这至少有50%已经分配好了,也就是说至少有20亿根“网线”要连到一起,我们知道局域网只要交换机就能搭起来,假设我们一个交换机能插20根网线,那么要搭这个20亿“网线”,至少要用一个亿的交换机,你能想象一个亿的交换机堆在一起组成“互联网”吗?就算假如我们使用数字信号,作为一个程序员,我也很难想象原先的程序员是在有限的内存和硬盘,如何设计强大计算机有条不紊的处理20亿的并发。
所以这篇文章就要从OSI底层协议出发让我们从底部掀一掀“互联网”的老底,将一个有血有肉的“互联网”展现在我们面前。
触摸“网” #
我们一直在说着互联网、互联网,由于无数在前人的不懈努力下,其实很多时候我们根本感受不到这张网的存在,比如打开浏览器,输入www.baidu.com
,我们直接就能连上千里之外的服务器,其实在浏览器后面,我们发的“包”正沿着网跨越千山万水到达一个机房的服务器中。
所以为了触摸到网这个东西,我们得用一些工具,我们就在打开的百度中输入traceroute
,根据你的操作系统安装好,然后我们打开命令行输入traceroute -I www.baidu.com
traceroute to www.baidu.com (14.215.177.38), 30 hops max, 60 byte packets
1 192.168.1.1 (192.168.1.1)
2 182.96.180.1 (182.96.180.1)
3 68.248.177.220.broad.nc.jx.dynamic.163data.com.cn (220.177.248.68)
4 53.251.177.220.broad.nc.jx.dynamic.163data.com.cn (220.177.251.53)
5 182.98.159.73 (182.98.159.73)
6 202.97.75.117 (202.97.75.117)
7 113.108.208.194 (113.108.208.194)
8 * * *
9 14.29.121.194 (14.29.121.194)
10 * * *
11 * * *
12 14.215.177.38 (14.215.177.38)
由于百度存在负载均衡,所以你们看到的最终IP地址可能不会同我一样(PS:我去掉了时间),虽然中间还有一些***
的存在,但是不管怎么我们终于触摸到这个网的存在。
我第一次看到这个非常震惊,原来在我的心中,“网”上最多有两个端,一个是我们的客户端,一个是服务器端,现在突然冒充这么多个“中间人”,这些东西是什么呢?
接下来我们通过回答下面两个问题来慢慢了解互联网的构造。
- 为什么第一个IP是局域网内的IP(内网)?
- 为什么中间有那么多IP端,他们的作用是什么?
内网与外网的区别 #
解答第一个问题前,我们必须要知道什么是内网什么是外网。
从IP的角度上来看,刚开始创建以太网时,由于避免连在一起的电脑认错人,就用IP用来做每个电脑的“身份证”,一开始要连在电脑比较少,组织只需要拿个小本本记住哪台服务器对于的IP,但是随着想连在一起的电脑越来越多,这个小本本满满的一本快写满了,虽然可以在多买几本本子记住他们,但是本子越多每次要查他们的IP的时候消耗的时间越多,所以他们决定不再一个一个分IP了,于是他们把40亿IP分成A、B、C、D几类。
这样组织成功用一个小本子记录了几十亿的IP分配,这里组织指的是因特网协会(ICANN),协会自己分好IP后开始发本子,找到下面的运营商,让他们自己搭网线光钎把他们自己负责的国家区域连起来,但由于地方太多,一个本子也记不下来,所以他们又把组织发给他们的本子分发到地区运营商,这样慢慢缩小,最终每个地区的局域网的本子都不会太大,这样查起来速度快而且网络的压力也平摊下去,但是摆在我们面前有一个问题
假设小明和小华分别住在同一条大街的街头和街尾,小明想给小华写信,小明然后写了一封信信放到邮箱,然后邮递员过来把信取走,在邮局分配再让邮递员送到小华家,本来两个人住在同一条街,邮递员只需要把信从街头送到街尾这次传递就结束了,但是由于不知道小明和小华住在同一条街,这封信绕了一个很大的圈才到小华手中。
从这个故事告诉我们,要解决不必要的传输,我们必须要提供一种机制让“邮递员”知道这封“信”是直接“送”还是发到总部发出去,这种机制就是确定是否是内网还是和外网。
大家回头看一下IP,假如我们按照组织(ICANN)的本子来分内网还是外网,那会造成极大的浪费,比如说A类,从1.0.0.0 到126.255.255.255,共分了126个,每个分类下有1658万台电脑,可能现在最大的云服务商都没有几千万台机器,假如你就几十台电脑,你申请一个B类IP(子网可以容纳6万多台),那么子网的利用率约为为20/6000,这么大一个网段却只有几个IP有效,这是对IP的极大的浪费,所以我们需要再次切片,将一个IP段智能的切分成很多块。
有没有什么好的方法能够切分IP呢,我们知道在TCP、HTTP这些高层协议栈中并没有子网这个概念,他们只负责连接和解析,所以我们得从数据链路层里面查看,在这层有一个非常重要的概念:子网掩码
子网掩码 #
首先我们要了解一个概念:路由表
这个就是我们前面提到过的“小本本”,这个路由表就记载了我们主机上面有关子网划分的重要数据,我们可以通过在Linux
上的route -n
命令显示电脑上的路由表
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 wlan0
192.168.1.0 0.0.0.0 255.255.255.0 U 9 0 0 wlan0
在我的电脑的得到的结果是这样的,这里有两个很重要的参数,Gateway(网关)
,Genmask(掩码)
,网关和掩码是什么呢?网关就是我们连接上外网的关键,掩码就是区分内网外网的钥匙。
子网是什么呢?你可以看做是IP与掩码的按位与运算得到新IP,比如说我们上面第一个192.168.1.1
与0.0.0.0
的运算结果是为0.0.0.0
,而且你会发现所以的IP跟0.0.0.0
得到结果都是一样的0.0.0.0
,这说明对于网关来说,所有的外网IP都是属于同一子网,接下来我们看看第二行,这个网关为0.0.0.0
说明这个是局域网,当我们的IP与这个局域网掩码运算后得到的地址与这个局域网IP相同时,说明这个IP属于局域网,我们可以看到我们子网大小为256,由于我用的是路由器,所以说明这个路由器最多可以允许254(.255为广播地址)台设备连接
接下来我们看看在我的云服务器上的路由表
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.10.6.1 0.0.0.0 UG 0 0 0 eth0
10.15.6.0 0.0.0.0 255.255.192.0 U 0 0 0 eth0
你可以清楚的看到在第二行我们的内网的大小约为16128=256*(255-192)
,如果你感兴趣对子网计算,可以看看我下面引用,在这里我就不解释太多计算细节,你可以看到,通过改变内网掩码,我们可以轻轻松松的将局域网分成不同的大小。
由于IPV4数量较少,所以在局域网内每个主机并不能都分到单独的独立IP,只有网关需要一个独立IP来访问互联网,在局域网内我们一般使用本地局域网IP(组织特地保留下来不分配给运营商,只在局域网内使用)。所以我们这就能解释第一个问题,traceroute
第一个发送的地址不是我们单独IP(路由器IP),而是发送给局域网上的网关。
包的逐级转发 #
解决上面第一个问题之后,我们知道在一个局域网内我们能够通过子网掩码知道当前局域网的子网范围,接下来的包的“旅途”是什么呢,为什么在traceroute
的路径中发现那么多IP地址呢。
回答这个问题前,我们从物理角度上先了解互联网是怎么搭建起来的。
当第一台计算机出现的时候,我们不需要互联网,但是随着计算机原来越多,我们想把计算机都用网线连接起来,一开始电脑都放在一起,只需要找一些长长的网线把他们连接起来,但是随着全球各地的人都有个人电脑,这时候只能靠网络运营商,也就是比如电信、移动、联通这些运营商,他们埋光钎搭网线,慢慢的将网络在各地连接起来,最后将子网络连接到骨干网,最后互联网就这么连接起来了
但是就像送信举的例子一样,如果邮递员能够直接把信从街头送到街尾,那么直接节省了很长一段在路上的花的时间。所以运营商就在各个分支网络搭建大大小小的“局域网”,就一层层代理一样,当一个包请求过来,首先先查看这个IP是否属于当前地区的局域网,如果是就查表找到地址发送过去,如果没有就发送到它的更高一级代理(网关),最终这个IP包到达机房区域的局域网的主机上。
所以我们能在traceroute
查看到一个IP包要传递的那么多的IP地址,那些IP地址都是勤劳的网关,不过相比我们第一个网关,也就是我们在网上冲浪的IP地址,那些网关更像一个一个交通指挥员,指导着我们的发送的“信”一步一步走到指定地点。
总结 #
互联网就像一个乐高拼成的巨人,刚开始不了解它,远远的观察它,它就像文明遗迹一样让人赞不绝口,等到你慢慢走进它,你就会发现它的组成其实也很普通,也就是一个一个乐高模块组成,但就是这种无数普通搭建我们的“万里长城”,这或许就是互联网的伟大之处。