文章目录
1. 网络层的定义
书本上是这样子定义网络层的:网络层向上只提供简单灵活的、无连接的、尽最大努力交付的 数据报服务,但不提供服务质量的承诺,即所传递的分组可能出错、丢失、重复和失序。
网络层主要任务是:
- 通过路由选择算法,为报文或分组通过通信子网选择最适当的路径。
该层控制数据链路层与传输层之间的信息转发,建立、维持和终止网络的连接。具体地说,数据链路层的数据在这一层被转换为数据包,然后通过路径选择、分段组合、顺序、进/出路由等控制,将信息从一个网络设备传送到另一个网络设备。
一般地,数据链路层是解决同一网络内节点之间的通信,而网络层主要解决不同子网间的通信。例如在广域网之间通信时,必然会遇到路由(即两节点间可能有多条路径)选择问题。
在实现网络层功能时,需要解决的主要问题如下:
- 交换:规定不同的信息交换方式。常见的交换技术有:存储转发技术,存储转发技术又包括报文交换技术(数据报服务)和分组交换技术(虚电路)。
- 寻址:数据链路层中使用的物理地址(MAC地址)仅解决网络内部的寻址问题。在不同子网之间通信时,为了识别和找到网络中的设备,每一子网中的设备都会被分配一个唯一的地址,由于各子网使用的物理技术可能不同,因此这个地址应当是逻辑地址(如IP地址)。
- 路由算法:当源节点和目的节点之间存在多条路径时,本层可以根据路由算法,通过网络为数据分组选择最佳路径,并将信息从最合适的路径由发送端传送到接收端。
- 连接服务:与数据链路层流量控制不同的是,前者控制的是网络相邻节点间的流量,后者控制的是从源节点到目的节点间的流量。其目的在于防止阻塞,并进行差错检测。
2. 交换服务
我们先来了解一下网络层向上提供了什么信息交换服务,网络层向上提供了两种服务:
-
虚电路
虚电路是分组交换的两种传输方式中的一种,其提供 面向连接 的通信服务。在两个节点或应用进程之间建立起一个逻辑上的连接或虚电路后,就可以在两个节点之间依次发送每一个分组,接收端收到分组的顺序必然与发送端的发送顺序一致,因此接收端无须负责在接收分组后重新进行排序。
虚电路协议向高层协议隐藏了将数据分割成段,包或帧的过程。虚电路是建立一条逻辑连接,发送方与接收方不需要预先建立连接。
-
数据报服务
当端系统要发送数据时,网络层给该数据附加上地址、序号等信息,然后作为数据报发送给网络节点(路由器),目的端系统收到数据报可能是不按照顺序到达,也有可能出现数据报丢失。网络层于此只需尽最大努力持续交付即可。数据报服务与OSI的无连接网络服务类似。
下为两种服务的对比图
现在基本上都是使用数据报服务。
3. 寻址问题
为了解决寻址问题,网络层有使用了 网际协议IP 来给每台设备标识一个唯一的软地址,这个根据协议生成的软地址我们也叫 IP地址,与网际协议IP 配套使用的还有三个协议:
-
地址解析协议 ARP
用于生成IP地址对应的MAC地址
-
网际控制协议 ICMP
允许主机和路由器报告差错情况和提供有关异常情况的报告
-
网际组管理协议 IGMP
是用来在接收者主机和与其所在网段直接相邻的组播路由器之间建立、维护组播组成员关系的协议。
四个协议之间的关系如下图:
3.1 虚拟互连网络
我们可以利用这几个协议来构成虚拟互联网,我们来了解一下 虚拟互连网络 的概念
虚拟网络把复杂的Internet看成一个网络,化简问题。虚拟互联网络就是逻辑互联网络,意思是互联起来的各种物理网络的异构性本来就是客观存在的, 但是我们利用IP协议就可以使这些性能各异的网络从用户看起来好像是一个统一的网络,而不用考虑具体的网络异构细节。这些利用IP协议的虚拟互联网络可简称为IP网。他们互联的中间设备就是 路由器。
3.2 IP地址
下面我们来介绍一下IP地址, IP地址 就是用来唯一标识全球连接在互联网上的主机的 接口 的标识符。IP地址由网络号和主机号组成,是一种分等级的地址结构,分等级的好处有:
- IP地址管理机构在分配IP地址时只分配网络号,而剩下的主机号则由得到该网络号的单位自行分配
- 路由器仅根据目的主机所连接的网络号来转发分组,这样可以减少路由表所占的存储空间以及查找路由表的时间
常见的IP地址
常见的IP地址有以下几类
- IP地址的前5位用于标识地址的类型, 据此将IP地址划分为A类,B类,C类,D类和E类。如第一位为0代表A类地址,前两位为10代表B类地址,前三位为110代表C类地址
- A/B/C类地址叫做主类地址,为用户使用的地址。D/E类地址叫做次类地址。
- 如上图所示,可以看到从A ->B -> C ,在IP地址中, 主机地址所占位数越来越少,而网络地址所占位数越来越多。因此,从A到C,IP地址所能允许的网络数量越来越多, 而每个网络里所能容纳的主机数则越来越少。
下图是A、B、C类三种地址的指派范围:
有一些IP地址很特殊,不会分配使用
IP地址是标志一台主机/路由器和一条联络的接口。当一台主机同时连在两个网络上时,该主机就必须同时具有两个相应的IP地址,其网络号必须是不同的。
在IP地址中,所有分配到网络号的网络应该是平等的,即互联网同等地对待每一个IP地址。IP地址是二级结构。
划分子网
主类IP地址可以分为A,B,C类,但这种固定的分类方式导致了IP地址的浪费,例如:一个需要1万个IP地址的机构,若使用C类地址显然不能满足需要(使用C类地址的网络最多容纳256个主机),但使用B类地址则又造成了5.5万个IP地址的浪费!(使用C类地址的网络最多容纳6万5千个主机) IP地址的利用率将低于20%。
这时候,我们意识到一个问题: 我们需要细分出比A/B/C类更细粒度的网络, 而完成这项工作的,就是 子网掩码。我们叫这个比A/B/C类更细粒度的网络叫做 子网。
划分子网纯属一个单位内部的事情,该单位对外表现为一个网络,除了本单位以外的网络,无法知道该单位有多少子网。
子网掩码的作用是屏蔽IP地址的一部分,从而更加灵活地指定网络地址的长度,实现网络地址和主机地址的进一步细分,用于划分子网, 具体:
- 凡是IP地址的网络和子网地址部分, 用 1表示
- 凡是IP地址的主机地址部分, 用 0表示
子网划分后,IP地址变为三级结构。注意,子网划分后只是将IP地址主机号这一部分再划分,而不改变IP地址原本的网络号。凡是从其他网络发送给本单元某台主机的IP报文,仍然是根据IP地址找到连接在本单元的路由器上。路由器接收到了IP数据报后,再按照目的网络号和子网号找到目的网络,把IP数据报交付给目的主机。
如下图,(a)的IP地址是145.13.3.10,转化为二进制就是1001 0001 0000 1101 0000 0011 0000 1010,按照上面的分类,对应的就是B类IP地址,得出其的网络号就是 145.13,根据该网络号找到对应的路由器。
路由器根据子网掩码算出子网号,根据子网号进行转发。若子网掩码是 255.255.0.0,那么求出的子网号还是145.13;如果子网掩码是255.255.255,求出的子网号是 145.13.3,能十分容易地求出子网号。
构造超网
可以用子网掩码重新划分IP地址,一定程度上减少了IP地址的浪费。划分子网一定程度上缓解了网络地址不足的困难,但是没办法解决该问题,科学家们又想出一种方法解决地址不足的问题,那就是 构造超网 CIDR。
CIDR最主要的特点有两个
-
CIDR消除了传统的A类、B类和C类地址以及划分子网的概念,因而能更加有效地分配IPv4的地址空间,并且在新的IPv6使用之前容许互联网的规模继续增长。
CIDR把32位的IP地址划分为前后两个部分。前面部分是 网络前缀,用来指明网络,后面部分则用来指明主机。因此CIDR使IP地址从三级编址(使用子网掩码)又回到了两级编址,但这已是无分类的两级编址。其记法是:IP地址 ::= {<网络前缀>,<主机号>}
CIDR还使用 斜线记法,或称为CIDR记法,即在IP地址后面加上斜线“/”,然后写上网络前缀所占的位数。
-
CIDR把网络前缀都相同的连续的IP地址组成一个 CIDR地址块。我们只要知道CIDR地址块中的任何一个地址,就可以知道这个地址块的起始地址(即最小地址)和最大地址,以及地址块中的地址数。
为了更方便地进行路由选择,CIDR使用32位的 地址掩码,地址掩码由一串1和一串0组成,而1的个数就是网络前缀的长度。虽然CIDR不使用子网了,但由于目前仍有一些网络还使用子网划分和子网掩码,因此CIDR使用的地址掩码也可继续称为子网掩码。例如:/20地址块的地址掩码是:11111111 11111111 11110000 00000000 (20个连续的1)。斜线记法中,斜线后面的数字就是地址掩码中1的个数。
由于一个CIDR地址块中有很多地址,所以在路由表中就利用CIDR地址块来查找目的网络。这种地址的聚合常称为 路由聚合 ,它使得路由表中的一个项目可以表示原来传统分类地址的很多个(例如上千个)路由。路由聚合也称为构成超网。
4. 路由算法
IP地址是一种逻辑地址,转发器以及网桥无法识别,所以网络层将来自运输层的数据报传递给数据链路层的同时,要将源地址和目的地地址的MAC地址也附上,封装成MAC帧传递给数据链路层。
注意:在网络层以及以上网络只能看到IP数据报,在局域网的链路层,只能看到MAC帧
4.1 ARP协议
网络层如何知道IP地址对应的MAC地址呢?ARP协议就是解决这个问题的,ARP协议的工作原理如下:
- 为了实现IP地址与MAC地址的查询与转换,ARP协议引入了 ARP缓存表 的概念,每台主机或路由器在维护着一个ARP缓存表,这个表包含IP地址到MAC地址的映射关系,表中记录了<IP地址,MAC地址>对,他们是主机最近运行时获得关于其他主机的IP地址到MAC地址的映射。ARP缓存表包含一个 寿命值(TTL,也称作生存时间),它将记录每个映射关系h的生存时间,生存时间到了就会从缓存表中删除。
- 当需要发送数据的时候,主机就会根据数据报中的目标IP地址信息,然后在ARP缓存表中进行查找对应的MAC地址,最后通过网卡将数据发送出去。
- 如果没有找到这个IP地址,那么这个数据就没法立即发送,电脑会先在局域网上广播一个 ARP请求,广播的ARP请求发出后,处于同一局域网内的所有主机都会接收到这个请求,如果目标IP地址与接收到ARP请求的主机自身IP地址吻合就会返回一个 ARP应答,告诉请求者(即我的电脑)自身的MAC地址,同时,也在自己的ARP缓存表中添加该广播信息。当我的电脑收到这个ARP应答后,就会在ARP缓存表中存储相关信息,并且重新将数据发送出去。
请注意,上述我们描述的过程都是在同一个局域网内进行的,ARP协议是解决 同一个局域网 上的主机或路由器的IP地址和MAC地址的映射问题。ARP协议无法解析不在同一局域网的主机的MAC地址,事实上,我们也不需要解析。主机A想向不在同一个局域网内的主机B发送数据,主机A只需要利用ARP协议解析出连接本局域网的路由器,向其发送数据报,路由器根据转发表找出目的路由的地址,进行转发。目的路由接收到数据后,利用ARP协议生成MAC地址,将数据报传输给目的主机。
4.2 IP数据报
TCP/IP协议定义了一个在因特网上传输的包,称为 IP数据包,而 IP数据报(IP Datagram) 是个比较抽象的内容,是对数据包的结构进行分析。 由首部和数据两部分组成,其格式如图所示:
4.3 转发分组机制
在这里,我们先屏蔽掉下层复杂的细节,只在网络层上讨论问题。
在互联网上转发分组,是从一个路由器转发到下一个路由器。路由器中存在一张表,叫做路由表,路由表存储着指向特定网络地址的路径,可以由管理员设置,也可以自己动态生成。
在路由表中,对于每一条路由最主要的是目的网络地址和下一跳地址这两条信息。
路由器分组转发算法
- 从数据报的首部提取目的主机的 IP 地址 D, 得出目的网络地址为N
- 若网络N 与此路由器直接相连,则把数据报直接交付目的主机D;否则是间接交付,执行 (3)
- 若路由表中有目的地址为 D 的特定主机路由,则把数据报传送给路由表中所指明的下一跳路由器;否则,执行 (4)
- 若路由表中有到达网络 N 的路由,则把数据报传送给路由表指明的下一跳路由器;否则,执行 (5)
- 若路由表中有一个默认路由,则把数据报传送给路由表中所指明的默认路由器;否则,执行 (6)
- 报告转发分组出错
在使用 CIDR 时,由于采用了网络前缀这种记法,所以路由表中的内容也相应地改变,由 “网络前缀” 和 “下一跳地址” 构成。在查找路由表时,可能会匹配到不止一个结果,这时候我们要选择 最长网络前缀 的路由。
4.4 ICMP协议
IP协议是一种面向无连接的数据报协议,它是一种不可靠的协议,它不提供任何差错检验。因此网际报文控制协议(Internet Control Message Protocol)ICMP出现了,ICMP协议用于IP主机、路由器之间 传递控制消息,这里的控制消息可以包括很多种:数据报错误信息、网络状况信息、主机状况信息等,虽然这些控制消息虽然并不传输用户数据,但对于用户数据报的有效递交起着重要作用。
从TCP/IP的分层结构看ICMP属于网络层,它配合着IP数据报的提交,提高IP数据报递交的可靠性。ICMP是封装在IP数据报中进行发送的,从这点看来,ICMP协议又有点像一个传输层协议,其实不然,因为ICMP报文的目的不是目的主机上的某个应用程序,它不为应用程序提供传输服务,ICMP报文的目的是目的主机上的网络层处理软件。
简单的来说,ICMP协议就像奔波于网络中的一名医生,它能及时检测并汇报网络中可能存在的问题,为解决网络错误或拥塞提供了最有效的手段。
常见的ICMP报文
ICMP报文作为IP数据报的数据字段发送给源点,下图是ICMP差错报文的内容:
4.5 互联网路由选择协议
现在的互联网采用分层次的路由选择协议,因为
- 互联网规模非常大
- 许多单位不愿意外界了解自己单位网络的布局细节和本部门所采用的路由选择协议,但是同时还希望连接到互联网上
在目前的互联网中,一个大的ISP就是一个自治系统。互联网将路由选择协议划分为两大类:
- 内部网关协议IGP
- 路由信息协议 RIP
- 开放最短路径优先 OSPF
- 外部网关协议EGP
下面逐一讲解这三个协议
RIP协议
RIP是一种分布式的基于距离向量的路由选择协议,其最大的优点就是简单,其的缺点是好消息传的快,坏消息传的慢。RIP 还限制了网络的规模,它能使用的最大距离为 15(16 表示不可达)
有以下的特点:
- 仅和相邻的路由器交换信息
- 路由器交换的信息是当前路由器所知道的全部消息,即自己现在的路由表
- 按固定的时间间隔交换路由信息
下图是书本说介绍的距离向量算法:
可以结合下面的题目来理解该算法。
题目:假定网络中路由器B的路由表有以下项目:
目的网络 | 距离 | 下一条路由 |
---|---|---|
N1 | 7 | A |
N2 | 2 | C |
N6 | 8 | F |
N8 | 4 | E |
N9 | 4 | F |
现在B收到C发过来的路由信息
目的网络 | 距离 |
---|---|
N2 | 4 |
N3 | 8 |
N6 | 4 |
N8 | 3 |
N9 | 5 |
求出路由器B更新后的路由表:
目的网络 | 距离 | 下一条路由 | 解释 |
---|---|---|---|
N1 | 7 | A | C中没有N1的信息,不需要更新 |
N2 | 5 | C | 下一跳相同,更新且距离+1 |
N3 | 9 | C | B中没有N3的信息,添加用户 |
N6 | 5 | C | C中到N6的距离为4,小于B到N6的距离8,需更新 |
N8 | 4 | E | B、C到N8的距离相同,不更新 |
N9 | 4 | F | B到N9的距离为4,小于C到N9的距离5,不更新 |
总结起来就是有一个表中没有的直接写,下一跳相同的更新,下一跳不相同选距离(C更新后的表)短的
下面是RIP报文的格式:
RIP协议使用运输层的用户数据报UDP进行传送
OSPF协议
OSPF最主要的特征就是使用分布式的链路状态协议,其主要特点:
- 使用洪泛法向本自治系统中所有路由器发送信息。
- 发送的信息是与本路由器相邻的所有路由器的链路状态,但这只是路由器所知道的部分信息。
- 只有当链路状态发生变化时,路由器才用洪泛法向所有路由器发送此信息。
OSPF协议使用IP数据报进行传送,下面是OSPF分组的格式:
OSPF具有五种分组类型,分别是:
- 问候分组:维持可达性
- 数据库描述分组:请求邻站链路数据库所有链接的摘要信息;
- 链路状态请求分组:球球某些链路状态项目的具体信息;
- 链路状态更新分组:洪泛法;
- 链路状态确定分组:对链路更新分组的确认;
OSPF具体流程:
- 新路由器上电:
- 相互发送问候分组;
- 多次数据库描述分组,使数据库达到一致;
- 相互间链路状态请求、更新、确认;
- 路由信息发生改变:
- 洪泛法群发;
- 收到更新后发回确认(重复的更新分组,只回复一次确认);
BGP协议
BGP是不同自治系统的路由器之间交换路由信息的协议,它采用路径向量路由选择协议,其主要特点:
- 自治系统AS之间的路由选择必须考虑有关策略。
- BGP只能力求寻找一条能够到达目的网络且比较好的路由,而并非要寻找一条最佳路由。