为什么需要网络层
数据链路层解决了同⼀局域⽹(直连⽹络)计算机间帧的传输问题,但还需要网络层解决不同网络间的主机通信的问题(跨局域网的通信)。
网络层提供的服务
网络层只提供简单高效的、无连接的、尽最大努力交付(不可靠传输)的数据报服务。
⽹络层不提供可靠服务指所传送的分组可能出错、丢失、重复和失序(不按序到达终点),当然也不保证分组传送的时限。
分组就是指IP数据报,一个IP数据报可能会被分割为多个分片。
网络层的两个层面
网络层可以抽象的划分为 数据层面 和 控制层面。
一个网络内的两个主机(直接网络)可以无需通过路由器直接通信,而两个跨网络主机的通信需要经过一个或多个路由器的转发才能让数据报到达目的地。路由器的转发功能依赖于查询路由表实现,路由表是由网络中许多的路由器按照共同选定的路由选择协议,经过多次的相互交换路由信息而得到的。
因此路由器之间传送的信息有以下两⼤类:
第⼀类:转发主机之间所传送的数据包,这属于路由器数据层面的职责
第⼆类:多个路由器间传送路由信息,这属于路由器控制层面的职责
数据层⾯:
每个路由器独立工作,根据收到IP分组的⽬的地址,按转发表转发⾄下⼀跳路由器;
转发通过硬件实现,速度快(纳秒数量级,10−9秒)。
控制层⾯:
路由器间合作工作,交换路由信息。
运⾏路由选择协议,⽣成和更新路由表,路由选择算法的执行通过软件实现,耗时⻓,秒级;
数据层的工作比较简单,只需独立地根据路由表转发分组;而控制层面的实现要难得多,需要多个路由器协调工作。
在制造路由器时,路由选择的通信模块就被嵌入路由器中。
IP地址
IP地址是一个主机的虚拟地址,含义是指哪个网络的哪个主机(或路由器)。它包含了两个信息,主机所在的网络和主机在这个网络中的内部地址。
IP地址长32位,采用了两级结构,由两个字段组成:n位的网络号(标识主机所在的网络) 和 32-n位的主机号(标识主机在该网络中的唯一地址或标识)。一个IP地址的网络号表明,如果一个主机不连网,那么就没有IP地址。
IP地址的传统分类
在传统意义上,IP地址根据 n位网络号 的长度划分了5类IP地址:A~E类地址,每个类的地址都有一个开头的类别位。
A类地址:8位网络号,类别位是0;
B类地址:16位网络号,类别位是10;
C类地址:24位网络号,类别位是0;
D类地址:多播地址;
E类地址:保留地址;
A~C是单播地址(一对一通信的地址),D是多播地址。
32位的IP地址空间有2^32(接近43亿)个地址。A类地址的主机数量占了50%。
IP地址中网络号为127的地址保留作为本地软件测试本机进程和进程之间通信的用途(如127.0.0.1),不会指派,也不会把数据发送到任何网络中。网络号和主机号全0的IP用于表示默认网关,不会指派。
网络地址和主机地址
一个IP地址可能是一个网络地址/主机地址/广播地址。
主机号全为0或者1(是指主机号的位全为1,而不是字节为1)的地址则不指派给某个主机。主机号全为0的IP地址表示某个网络,是一个网络地址。主机号全为1的IP地址表示这个网络所有的主机,是一个广播地址,访问这个地址相当于向这个网络内所有主机广播。
这个规则对CIDR编址的网址也有效。
例如:5.6.7.8是一个A类地址,是一个主机M的主机地址。5.0.0.0是主机M所在的网络的网络地址,5.255.255.255是一个主机M所在网络的广播地址。
无分类编址CIDR
传统的IP地址分类是按照每8位网络号递增来划分的。
CIDR依旧根据划分网络号和主机号来对IP编址,但不限定网络号的位数n是固定的位数,而是可以为任意的位数(0~32)。
CIDR使用斜线记法,就是在IP地址后加一个 /n。n表示这个IP地址的网络号(又称网络前缀)的位数。CIDR 把⽹络前缀都相同的所有连续的 IP 地址组成“CIDR 地址块”,一个地址块就是一个网络,可以通过把一个主机地址的主机号全置为0的方式来表示这个地址块(地址块也是网络地址);
例如:
128.14.35.7是IP地址,但未指明⽹络前缀⻓度,因此不知道⽹络地 址是什么;
128.14.35.7/20是IP地址,同时指明了⽹络前缀为20位。如下:
128.14.35.7/20 = 10000000 00001110 00100011 00000111
其中加粗部分就是 128.14.35.7/20 这个主机地址的网络号。因此这个主机的网络地址(地址块)为(将主机号全部置为0,即红色部分):
10000000 00001110 00100000 00000000 = 128.14.32.0/20
由此可导 出其⽹络地址为 128.14.32.0/20;(我们不能用 128.14.32.0 来表示一个网络地址,因为不知道它的网络号有几位。)
地址掩码(子网掩码)
计算机无法识别斜线记法,如果计算机想要知道一个主机地址的网络地址,需要使用子网掩码。子网掩码就是网络号位全为1,主机号位全为0的32位串。斜线后面的数字就是地址掩码。
例如 128.14.32.0/20的子网掩码是:
111111111 11111111 11110000 00000000 = 255.255.240.0
子网掩码 & 主机地址 = 网络地址,这就是计算机计算网络地址的方式。
一个网络号 128.14.32.0/20 就是一个网络,里面包含的主机有 2^(32-20) - 2= 2^16 - 2台主机,这些IP地址范围在 128.14.32.0~128.14.47.255之间。
这个范围内的IP中,左右两边界不能作为主机地址(128.14.32.0(网络地址)和128.14.47.255(广播地址)不能作为主机地址),其他都可以作为主机地址。
特殊的地址块
前缀 n = 32,即32位IP地址都是网络号,没有主机号。这其实就是⼀个主机的IP地址。这个特殊地址⽤于主机路由;
前缀 n = 31,这个地址块中只有两个IP地址,其主机号分别为0 和1,分别是广播地址和网络地址。这个地址块⽤于点对点链路(即两个路由器直接连接,这两个路由器之间没有任何主机);
前缀 n = 0,即0.0.0.0/0。这⽤于默认路由。
IP地址采用两级结构的好处
1、IP 地址管理机构在分配 IP 地址时只分配⽹络号, ⽽剩下的主机号则由得到该⽹络号的单位⾃⾏分配。这样 就⽅便了 IP 地址的管理;
2、路由器仅根据⽬的主机所连接的⽹络号来转发分组 (⽽不考虑⽬的主机号),这样就可以使路由表中的行数⼤幅度减少(即路由表的目标地址字段只记录网络号不记录具体IP地址),从⽽减⼩了路由表所占的存储空间。
子网划分
一个网络地址就代表一个网络,或者说一个局域网,一个局域网内包含0个或多个路由器。
一个局域网里的所有主机的网络号都是相同的。每一个不再划分的局域网(最小单位的局域网)中含有0个路由器。每个局域网和局域网之间通过路由器连接。
一个大的网络地址可以划分为多个小的网络地址(通过把网络号的位数变长),这样就可以将一个大的局域网划分为多个小的局域网,称为子网划分。
互联网中的某个ISP(网路运营商)可看做是一个庞大的局域网,它的网络地址是206.0.64.0/18,内含主机(和路由器)数量为 2^14 - 2个。
现在某大学需要800个IP,ISP就将 206.0.64.0/18这个大的网络切一个小的网络206.0.68.0/22 (包含2^10=1024)给它用,这个学校有4个学院,每个学院的网络需要隔离开来,于是学校又将 206.0.68.0/22 这个网络划分为以下子网:
206.0.68.0/23
206.0.70.0/24
206.0.71.0/25
206.0.71.128/25
某个IP 206.0.71.111它既是三院局域网的主机(206.0.71.111/25),也可以是大学局域网的主机(206.0.71.111/24),也可以是该ISP局域网的主机(206.0.71.111/18),但是最能精准描述该主机所处局域网的IP是 206.0.71.111/25。
使用CIDR编址的好处是,需要划分子网的时候,可以根据每个区域或主体(例如学校,公司,家庭)所需的主机数量灵活的分配网络大小和IP数量。
总结IP地址重要特点
每⼀个IP地址都由⽹络前缀(网络号)和主机号两部分组成:IP地址管理机构只分配⽹络前缀,主机号由得到该⽹络前缀单位⾃⾏分配;
路由器根据⽬的主机所连接的⽹络前缀转发分组;
⽤集线器或交换机连接起来的多个机器集合是⼀个⽹络,因此这些机器都具有 同样的⽹络前缀;
用路由器连接起来的多个主机集合是多个网络(多个局域网),一个网络连向路由器的一个接口,这个路由器有多少个接口就连着多少个网络。
一个设备必须连接入一个网络才会有一个该网络分配给它的IP地址,如果没有连接网络的设备或主机就没有IP地址,而如果连接了多个网络(比如路由器,或者一些连接多个网络的主机)就会被分配多个IP地址
所有分配到⽹络前缀的⽹络,⽆论是范围很⼩的局域⽹,还是可能覆盖很⼤地理 范围的⼴域⽹,都是平等的。
如下图所示:
图中是一个大局域网,划分为了6个小局域网(红色是3个,灰色是3个,每个灰色的链路是路由器直接相连的,不含任何主机的局域网,也就是前面说的点对点链路)。
图中每个路由器总是具有两个或两个以上的IP地址,并且每⼀个接⼝都有⼀个不同网络号的IP地址。
两个路由器直接相连的两个端口可以分配IP也可以不分配IP(就可以省下2个IP),如果不分配IP,则这两个路由器间的网络又称匿名网络。