前言
在计网学习笔记(二):主机间如何实现互联互通文章中,我们始终没有触及到网络层,但当数千万台PC需要实现互联互通,网络层就是必要的本文主要关注的内容是:IP地址为什么这样设计,都经历了哪些阶段?
先简单下介绍IP层
网络层:IP
IP,Internet Protocol,网际互连协议。
为什么要有IP层
数据链路层已经能够通过多个交换机连接许多个节点,但一旦我们希望千万级别的主机互通,那一个ARP报文就会造成千万级别的额外资源浪费。实际上这和Vlan要解决的问题一样嘛,只不过网络层是真实地隔离了不同的网络,而Vlan是只对虚拟机来说,两个主机属于不同网络。
前面的场景我们想要ping通,有个大前提:就是网段相同。跨网段的设备仅靠前两层是绝对无法通信的,而IP层就提供了跨网段通信的功能,也就是跳出局域网和别的局域网通信。IP用于寻址,从一个IP到另一个IP。IP实现主机到主机的通信服务。
与MAC类似,网络层也需要一个标识来代表主机,叫做IP地址。IP可以标识主机所在位置。每个网卡都有一个IP,因此通常一个主机有多个网卡,也就有多个IP地址。
IP地址
一个IP地址共32位,每 8 位一组,每组用 . 分隔开来。并且为了方便人记忆,不会用二进制而是十进制来表示,形如:127.0.0.1,192.168.1.1。
IP地址的意义
IP地址表达的是:「网络号」 + 「主机号」
网络号用于网络层路由,从一个网络传输到另一个网络
主机号用于数据链路层定位,通过ARP协议拿到MAC地址
站在高处思考IP地址的设计
早期,IP地址的高8位固定为网络位,这当然是不够用的,因此首先进行了IP地址分类,包括ABCDE五种,其中D用于多播,E是预留的,我们只关心ABC。你当然可能听说过CIDR,但是,假如回到没有CIDR的年代,假想我们负责重新设计IP地址,该如何设计呢?
首先我们需要明白旧分类是怎么分的,以及旧分类的缺点:
早期的分类地址
| 类别 | 起始位 | 开始 | 结束 |
|---|---|---|---|
| A | 0 | 0.0.0.0 | 127.0.0.0 |
| B | 10 | 128.0.0.0 | 191.255.0.0 |
| C | 110 | 192.0.0.0 | 223.255.255.0 |
- A:IP的第一位为0,后7位为网络号
- B:IP的第一位为1,第二位为0,后14位为网络号
- C:IP的第一位为1,第二位为1,第三位为0,后21位为网络号
实际上,标识属于哪类的位(如C类地址的前三位)也可以被算作网络号的一部分,两种说法都是可以的。
因此在分辨ABC时,只需要看IP地址的第一个字节:
- 小于等于127,为A
- 非A,小于等于191,为B
- 非AB,小于等于223,为C
请注意,你也许知道子网掩码,但分类地址时期是没有子网掩码的概念的,因为不需要。拿到一个IP只需要看前三位就可以确定是哪类地址,而确定了属于哪类地址就可以知道:哪些位属于网络位,哪些位属于主机位。早期又没有子网超网的概念,子网掩码根本就没有用。
分类地址的不足
这种分类地址,我们会发现:一个A类地址提供了千万数量级的主机数,B类是六万多,而C类仅有254个。这种分类是死的,每个网络的主机数量固定,并且还只有三种分类,跨度极大。对于一般的公司而言,C类太少,B类又太多,这种情况下,该怎么给它分配IP地址呢?我们假定这家公司需要数千个IP地址。
方案一:直接给个B类地址
一个B类地址,六万多个主机号,却只被使用了几千个,这会导致「IP地址使用不充分」,况且随着网络世界的膨胀,IP地址会逐渐变得不富裕。
方案二:分配多个C类地址
给这家公司分配数十个C类地址,这会导致「路由表膨胀」,比起只使用一个B类地址,路由器需要额外维护数十个路由表表项,这会降低整个网络的速度。
由上,我们足以发现:重新设计IP地址的必要性。
当然这种早期的分类网络已经被CIDR替代。分类网络的概念只在一些网络软件和硬件组件的默认配置参数中保留,尤其是在子网掩码的默认配置中。
我们重新设计IP地址的目标是:所有申请分配IP的时候,我们都可以从容地「按需分配」,并且不会造成「路由膨胀」。那么第一步就是:推翻早期的固定位数的网络号。 我们需要的新的IP地址的网络号是灵活的,不再是固定的8,16,24位,而可以是20位,19位等等。那过去我们直接通过前几位确定网络号,现在不行了,我们必须用一个额外的东西去表示网络号,这个东西就是「子网掩码」。
子网掩码:确定网络号
我们保留过去高位为网络号,低位为网络号的设计,要表达子网掩码,有两种形式:
- 我们用一个十进制数字x,表达高x位就是网络号。
- 为了计算机更迅速地计算出网络号,想到了位运算,因此用形如IP地址的形式,通过与IP地址进行与运算,从而计算出网络号, 形如:
255.255.255.0,与运算的原理?这里就不细说了。
有了子网掩码,我们就有了灵活的网络号的表示方法。那么我们就可以:
- 将一个大网络(B类)划分成多个小网络,每个小网络都有自己的网络号
- 将多个小网络(C类)用一个网络号表示,避免路由表膨胀
这分别解决了上述两种方案的不足之处。那么我们继续看,具体是怎么做的:
针对方案一:子网划分
子网划分之前,我们得有个原始网络吧,得基于一个网络再去划分,那这个原始网络,就叫「主类网」。
主类网
虽然早期的ABCDE式分类已经被CIDR所取代,但是这些原本的分类网络,它们自身有个特点:即在有了子网掩码的概念后,你会发现它们的子网掩码都是8的倍数。这个特性是非常好的,并且要考虑历史兼容性,因此我们可以直接将那些根据ABC分类的IP地址,作为「主类网」,即划分子网的开端。
由IP地址求主类网
对于任意一个IP地址,我们都能够知道它的主类网段,依据就是早期分类地址。举个例子:156.10.10.1,先看IP地址的第一个字节,十进制为156,属于B类地址,因此它的主类网就是:156.10.0.0。
子网就是指将一个主类网继续进行划分得出的网络。
子网
用IP的术语来说,互联这主机接口与路由器接口的网络形成一个子网(subnet) [RFC950]。在因特网文献中,子网也可以直接称为网络。
为了帮助你更直观地认识子网,我们还是来举个例子:
看这个IP:156.10.10.1/16
上面已经说过,通过该IP可求主类网IP:156.10.0.0。
通过子网掩码可求得:该IP所属的网络号为:156.10.0.0。
发现网络号 = 主类网,那这个网络有没有进行子网划分呢?不知道。这也是子网掩码的妙处:不管网络有没有划分子网,只要把子网掩码和IP地址进行逐位的“与”运算即可得出网络地址来。
再看一个:156.10.10.1/17
主类网仍然是156.10.0.0,但这个网络号就需要计算一下了:
00001010 & 1000000 = 00000000,因此网络号仍然是:156.10.0.0,那这个网络有没有进行子网划分呢?一定有。因为子网掩码是17啊,肯定不是主类网嘛,说明这个网络一定是个子网。那划分了几个子网?不知道。你再想想,我们为什么要划分子网?为什么仅仅有子网掩码不行?因为我们需要网络有「层次关系」,使得一个网络能代表多个网络,从而减少路由表表项。因此,一个IP地址,主类网是B类,子网掩码17个1,虽然看似是只多了一位网络位,但可能这个子网又被划分。
当然我们可以继续往后划分子网,也就是一个18还能继续划分成两个19,以此类推。
看到这里,你也明白了为啥确定网络号的术语叫「子网掩码」,因为这些灵活的网络不是凭空而生的,是根据主类网进行子网划分得来的。
子网划分的缺陷
还是无法充分利用C类地址。
针对方案二:路由聚合
路由聚合,也叫构造超网,我们先看一下超网的概念。
超网
讲了子网那肯定要将超网。超网和子网是相反的概念。
路由聚合:就是将若干个IP地址取共同前缀,记共同前缀的位数为CIDR的斜线后的数,其余为取0。
CIDR:无类型地址
CIDR不分类,而是直接划分IP地址为两个部分:网络号,主机号。
举个例子,IP地址为: a.b.c.d/x,其中 /x 表示高 x 位表达了一个IP地址的网络,这个x也被叫做网络前缀, x 的范围是 0 ~ 32,剩下的就是主机号。
举个例子192.168.0.1/24,网络号为192.168.0.0,主机号为1。
《计算机网络》谢希仁书中提到:CIDR彻底去掉了前面ABCDE分类,以及子网划分的概念。尽管如此,我们往往还是会在路由聚合时,用子网来指代被聚合的网段。
广播地址
对于一个IP地址,主机号全为0代表的是网络,而主机号全为1,则代表是一个广播地址。向广播地址发送数据,处于该网络的所有主机都会收到数据。
为什么有了IP地址还需要MAC地址
观点一:IP是住址,MAC是身份证?
不考虑NAT的话,可能IP中的网络号更像那个住址,而主机号已经足够标识你是住址中的「几号成员」,这个「几号成员」在同网络内是不会冲突的。
观点二:IP工作在网络层,MAC工作在数据链路层。
对。但是没有强调关键点。那IP既然已经表达了主机号,为什么还需要MAC呢?
层与层之间的独立性
下面是《计算机网络-自顶向下方法》的原文:
主机和路由器接口除了网络层地址之外还有MAC地址,这有如下几个原因。首先,局域网是为任意网络层协议而设计的,而不只是用于IP和因特网。如果适配器被指派IP地址而不是“中性的” MAC地址的话,则适配器将不能够方便地支持其他网络层协议(例如,IPX) 其次,如果适配器使用网络层地址而不是MAC地址的话,网络层地址必须存储在适配器的RAM中,并且在每次适配器移动(或加电)时要重新配置。另一种选择是在适配器中不使用任何地址,让每个适配器将它收到的每帧数据(通常是IP数据报)沿协议栈向上传递。然后网络层则能够核对网络地址层是否匹配。这种选择带来的一个问题是,主机将被局域网上发送的每个帧中断,包括被目的地是在相同广播局域网上的其他节点的帧中断。总之,为了使网络体系结构中各层次成为极为独立的构建模块,不同的层次需要有它们自己的寻址方案。我们现在已经看到3种类型的地址:应用层的主机名、网络层的IP地址以及链路层的MAC地址。
简单来说,网络层协议并非只有IP协议一种,我们需要保证层与层之间的独立性,层与层之间也需要解耦,即:MAC不应该依赖IP来工作,或者说数据链路层不应该强依赖于IP层。
参考文档
《计算机网络》.谢希仁
TCP/IP详解,卷一
《计算机网络-自顶向下方法》