第四章
4.1 网络层概述
- 网络层的主要任务是实现网络互连,进而实现数据包在各网络之间的传输
- 要实现网络层任务,需要解决以下主要任务:
- 网络层向运输层提供怎样的服务("可靠传输"还是"不可靠传输")
- 网络层寻址问题
- 路由选择问题
- 因特网 (Internet)是目前全世界用户数量最多的互连网,它使用TCP/IP协议栈
- 由于TCP/IP协议栈的网络层使用网际协议IP ,它是整个协议栈的核心协议,因此TCP/IP协议栈中网络层通常称为网际层
4.2 网络层提供的两种服务
面向连接的虚电路服务
- 可靠通信由网络来保证
- 必须建立网络层的连接------虚电路VC(Virtual Circuit)
- 通信双方沿着已建立的虚电路发送分组
- 目的主机的地址仅在连接建立阶段使用,之后每个分组的首部只携带一条虚电路的编号(构成虚电路的每一段链路都有一个虚电路编号)
- 这种通信方式如果再使用可靠传输的网络协议,就可使所发送的分组最终正确到达接收方(无差错按序到达、不丢失、不重复)
- 通信结束后,需要释放之前所建立的虚电路
无连接的数据报服务
- 可靠传输应当由用户主机来保证
- 不需要建立网络层连接
- 每个分组可走不同的路径
- 每个分组的首部必须携带目的主机的完整地址
- 这种通信方式所传送的分组可能误码、丢失、重复和失序
- 由于网络本身不提供端到端的可靠传输服务,这就使网络中的路由器可以做得比较简单,而且价格低廉(与电信网的交换机相比较)
- 因特网采用了这种设计思想,也就是将复杂的网络处理功能置于因特网的边缘(用户主机和其内部的运输层),而将相对简单的尽最大努力的分组交付功能置于因特网核心
虚电路和数据报的对比
4.3 IPv4地址概述
4.3.1 IPv4地址概述
-
在TCP/IP体系中,IP地址是一个最基本的概念
-
IPv4地址 就是给因特网(internet)上的每一台主机(或路由器)的每一个接口 分配一个在全世界范围内是唯一的32比特的标识符
-
IPv4地址的编码方式经历了如下三个历史阶段:
-
由于32bits的IPv4地址不方便阅读、记录以及输入等,因此IPv4地址采用点分十进制表示方法 以方便用户使用:每八位数字分为一组,换算成十进制的形式
4.3.2 分类编址的IPv4地址
地址分类情况:
注意事项:
- 只有A类、B类和C类地址可分配给网络中的主机或路由器的各接口
- 主机号 为"全0"的地址是网络地址,不能分配给主机或路由器的各接口
- 主机号 为"全1"的地址是广播地址,不能分配给主机或路由器的各接口
A类地址的细节
- 最小网络号0,保留不指派(0.0.0.0是一个特殊的网络地址,表示"所有地址"或"任何地址",它有一些很特殊的用法,这里不展开说明)
- 第一个可指派的网络地址为1.0.0.0,其网络号为1
- 最大网络号为127 ,作为本地环回测试地址 ,不指派:
- 最小的本地环回测试地址为127.0.0.1
- 最大的本地环回测试地址为127.255.255.254
- 最后一个可指派 的网络号为126 ,网络地址为126.0.0.0
B类地址的细节
- 最小网络号也是第一个可指派的网络号128.0,网络地址为128.0.0.0
- 最大网络号也是最后一个可指派的网络号191.255,网络地址为191.255.0.0
- 可指派的网络数量:
2 ( 16 − 2 ) = 16384 2^{(16-2)} = 16384 2(16−2)=16384 - 每个网络中可分配的IP地址数量为:
2 16 − 2 = 65543 2^{16}-2 = 65543 216−2=65543
(减2的原因是除去主机号全为0的网络地址和全为1的广播地址)
C类地址的细节
- 最小网络号也是第一个可指派的网络号:192.0.0,网络地址为192.0.0.0
- 最大网络号也是最后一个可指派的网络号223.255.255,网络地址为223.255.255.0
- 可指派的网络数量为:
2 24 − 3 = 2097152 2^{24-3}=2097152 224−3=2097152
每个网络中可分配的IP地址数量为:
2 8 − 2 = 254 2^8-2 = 254 28−2=254
总结
因此,我们根据点分十进制的IP地址的第一位数就能够知道该IP地址属于哪一类:
- 小于127:A类
- 128~191:B类
- 192~223:C类
而根据网络类别,我们还能够找出地址中的网络号部分和主机号部分(A类地址网络号为左起第一个字节,B类地址网络号为左起前两个字节,C类地址网络号为左起前三个字节)。
也有特殊情况,以下三种情况的地址不能指派给主机或路由器接口:
- A类网络号0和127
- 主机号为"全0",这是网络地址
- 主机号为"全1",这是广播地址
例:
4.3.3 划分子网的IPv4地址
- 32bits的子网掩码可以表明分类IP地址的主机号部分被借用了几个比特作为子网号
- 子网掩码使用连续的比特1来对应网络号和子网号
- 子网掩码使用连续的比特0来对应主机号
- 将子网划分为IPv4地址 与其相对应的子网掩码 进行逻辑与运算 就可得到IPv4地址所在子网的网络地址
例:
- 默认的子网掩码是指在未划分子网的情况下使用的子网掩码
4.3.4 无分类编址的IPv4地址
-
划分子网在一定程度上缓解了因特网在发展中遇到的困难,但是数量巨大的C类网 因为其地址空间太小 并没有得到充分使用 ,而因特网的IP地址仍在加速消耗,整个IPv4地址空间面临全部耗尽的威胁
-
1993年,IETF发布了无分类域间路由选择CIDR(classlesss Inter-Domain Routing)的RFC文档
- CIDR消除了传统的A类、B类、C类地址,以及划分子网的概念
- CIDR可以更加有效地分配IPv4地地址空间,并可以在新的IPV6使用之前允许因特网地规模继续增长
-
CIDR使用"斜线记法 ",或称CIDR记法 。即在IPv4地址后面加上斜线"/ ",在斜线后面写上网络前缀所占的比特数量
-
CIDR实际上是将网络前缀都相同的连续的IP地址组成一个"CIDR地址块"
-
我们只要知道CIDR地址块中的任何一个地址,就可以知道该地址块的全部细节
- 地址块的最小地址
- 地址块的最大地址
- 地址块中的地址数量
- 地址块聚合某网络(A类、B类或C类)的数量
- 地址掩码(也可继续成为子网掩码)
-
路由聚合(构造超网):![[.../图片资源/计算机网络/路由聚合.png]]
- 网络前缀越长,地址块越小,路由越具体
- 若路由器查表转发分组时发现有多条路由可选,则选择网络前缀最长的那条,这称为最长前缀匹配,因为这样的路由更具体
4.3.5 IPv4地址的应用规划
划分方式可分为两种:定长的子网掩码FLSM (Fixed Length Subnet Mask)和变长的子网掩码VLSM(Variable Length Subnet Mask)
定长的子网掩码
- 使用同一个子网掩码来划分子网
- 每个子网所分配的IP地址数量相同,会造成IP地址浪费
变长的子网掩码
- 使用不同的子网掩码来划分子网
- 每个子网所分配的IP地址数量可以不同,尽可能减少对IP地址的浪费
4.4 IP数据报的发送和转发过程
- IP数据报的发送和转发过程包含以下两个部分:
- 主机发送IP数据报
- 路由器转发IP数据报
主机发送IP数据报
判断目的主机是否与自己在同一网络
- 若是在同一网络 ,则属于直接交付
- 若是不在同一网络 ,则属于间接交付 ,传输给主机所在网络的默认网关(路由器),由默认网关帮忙转发
路由器转发IP数据报
- 检查IP数据报首部是否出错
- 若出错,则直接丢弃该IP数据报并通告源主机
- 若没有出错,则进行转发
- 根据IP数据报的目的地址在路由表钟查找匹配的条目
- 若找到匹配的条目,则转发给条目中指示的下一跳
- 若找不到,则丢弃该IP数据报并通告源主机
![[.../图片资源/计算机网络/计网中各设备的作用.png]]
4.5 静态路由配置及其可能产生的路由环路问题
- 静态路由配置是指用户或网络管理员使用路由器的相关命令给路由器人工配置路由表
- 这种人工配置方式简单、开销小,但不能及时适应网络状态(流量、拓扑等)的变化
- 一般只在小规模网络中采用
- 使用静态路由配置可能出现以下导致路由环路 的问题:
- 配置错误
- 聚合了不存在的网络
- 网络故障
- 路由条目的类型:
- 直连网络
- 静态路由(人工配置)
- 动态路由
- 特殊的静态路由条目:
- 默认路由(目的网络0.0.0.0,地址掩码0.0.0.0)
- 特定主机路由(目的网络为特定主机的IP地址,地址掩码为255.255.255.255)
- 黑洞路由(下一跳为null0)
4.6 路由选择协议
4.6.1 路由选择协议概述
路由选择协议总体分为两种:静态路由选择 和动态路由选择
因特网所采用的路由选择协议的主要特点:自适应 、分布式 、分层次。
- 自适应:动态路由选择,能较好地适应网络状态的变化
- 分布式:路由器之前交换路由信息
- 分层次:将整个因特网划分为许多较小的自治系统AS (Autonomous System)
常见的路由选择协议:
路由器的基本结构:
路由器之间会传递路由报文 ,路由报文交给路由选择处理机 处理,会得到路由表:
- 路由表一般仅包含从目的网络倒下一跳的映射
- 路由表需要对网络拓扑结构的辩护计算最优化
- 转发表是由路由表得出的
- 转发表的结构应当使查找过程最优化
4.6.2 路由信息协议RIP的基本工作原理
- 路由信息协议RIP(Routing Information Protocol)是内部网关协议IGP中最先得到广泛使用的协议之一
- RIP要求自治系统AS内的每一个路由器都要维护从它自己到AS内其他每一个网络的距离记录。这是一组距离,称为"距离向量D-V(Distance_Vector)"
- RIP使用跳数 (Hop Count)作为度量来衡量到达目的网络的距离
- 路由器到直连网络的距离定义为1
- 路由器到非直连网络的距离定义为所经过的路由器数加1
- 允许一条路径最多只能包含15个路由器。"距离"等于16时相当于不可达。因此,RIP只适用于小型互连网。
- RIP认为好的路由就是"距离短"的路由,也就是所通过路由器数量最少的路由
- 当到达同一目标网络有多条"距离相等"的路由时,可以进行等价负载均衡
- RIP包含以下三个要点:
- 和谁交换信息?仅和相邻路由器交换信息
- 交换什么信息?自己的路由表
- 何时交换信息?周期性交换
- RIP的基本工作过程:
- 路由器刚开始工作时,只知道自己到直连网络的距离为1
- 每个路由器仅和相邻路由器周期性地交换并更新路由信息
- 若若干次交换和更新信息后,每个路由器都知道到达本AS内各网络的最短路径和下一跳地址,称为收敛
- RIP存在"坏消息传播得慢"的问题,该问题又被成为路由环路 或距离无穷计数 问题,这是距离向量算法的一个固有问题。可以采取多种措施减少出现该问题的概率或减小该问题带来的危害
- 限制最大路径为15(16表示不可达)
- 当路由表发生变化时就立即发送更新报文(即"触发更新),而不仅是周期性发送
- 让路由器记录收到某特定路由信息的接口,而不让同一路由信息再通过此接口向反方向传送(即:水平切割)
4.6.3 开放最短路径优先OSPF的基本工作原理
-
开放最短路径优先OSPF (Open Shortest Path First),是为克服RIP的缺点在1989年开发出来的
- "开放"表明OSPF协议不是手某一家厂商控制,而是公开发表的
- "最短路径优先"是因为使用了Dijkstra提出的最短路径算法SPF
-
OSPF是基于链路状态的,而不是像RIP那样是基于距离向量的
-
OSPF采用SPF算法发计算路由,从算法上保证了不会产生路由环路
-
OSPF不限制网络规模,更新效率高,收敛速度快
-
链路状态 是指:本路由器都和哪些路由器相邻,以及相邻链路的"代价" (cost)
- "代价"用来表示费用、距离、时延、带宽等等,这些都由网络管理人员来决定
-
OSPF相邻路由器之间通过交互问候(Hello)分组 ,建立和维护邻居关系
-
Hello分组封装在IP数据报中,发往组播地址224.0.0.5
-
发送周期为10s
-
40s未收到来自邻居路由器的Hello分组,则认为该邻居路由器不可达
-
-
使用OSPF的每个路由器都会产生链路状态通过LSA (Link State Advertisement),它包含以下内容:
- 直连网络的链路状态信息
- 邻居路由器的链路状态信息
-
LAS背封装在链路状态更新分组LSU 中,采用洪泛法发送
-
使用OSPF的每个路由器都有一个链路状态数据库LSDB,用于存储LSA
-
通过各路由器泛洪发送封装有自己LSAS的LSU分组,各路由器的LSDB最终将达到一致
-
使用OSPF的各路由器基于LSDB进行最短路径优先SPF计算,构建出各自达到其他路由器的最短路径,即构建各自的路由表
-
OSPF有以下五种分组类型:
- 问候(Hello)分组:用来发现和维护邻居数据库的可达性
- 数据库描述(Database Description)分组:向邻居路由器请求发送某些链路状态数据库中的所有链路状态项目的摘要信息
- 链路状态请求(Link State Request)分组:向邻居路由器给出自己的链路状态项目的详细信息
- 链路状态更新(Link State Update)分组:路由器使用这种分组将其路由器状态进行洪泛发送,即用洪泛法对全网更新链路状态信息
- 链路状态确认(Link State Acknowledgment):这是对链路状态更新分组的确认分组
-
OSPF协议的基本工作过程:![[.../图片资源/计算机网络/OSPF协议的基本工作过程.png]]
-
OSPF在多点接入网络中路由邻居关系的建立![[.../图片资源/计算机网络/OSPF在多点接入网络中路由邻居关系的建立.png]]
- 选举指令路由DR (Designated Router)和备用的指定路由器BDR(Backup Designated Router)
- 所有的非DR/BDR只与DR/BDR建立邻居关系
- 非DR/BDR之间通过DR/BDR交换信息
-
为了使OSPF能够用于规模很大的网络,OSPF把一个自治系统再划分为若干个更小的范围,叫做区域 (Area)
4.6.4 边界网关协议BGP的基本工作原理
-
因特网采用分层次的路由选择协议
-
内部网关协议IGP(例如路由器信息协议RIP或开放最短路径优先OSPF)
- 设法使分组在一个自治系统内尽可能有效地从源网络传输到目的网络
- 无需考虑自治系统外部其他方面的策略
-
外部网关协议EGP(例如边界网关协议BGP)
- 在不同自治系统中,度量路由的"代价"(距离、带宽、费用等)可能不同,因此,对于自治系统的路由选择,使用"代价"作为度量来寻找最佳路由使不行的
- 自治系统之间的路由选择必须考虑相关策略(经济、政治、安全等)
-
在配置BGP时,每个自治系统的管理员要选择至少一个路由器作为该自治系统的"BGP发言人 "
-
不同自治系统的BGP发言人要交换路由信息,首先必须建立TCP连接。端口号为179
- 在此TCP连接上,交换BGP报文,建立BGP会话
- 利用BGP会话交换路由信息(例如:增加新的路由,或撤销过时的路由,以及报告出错的情况)
- 使用TCP连接交换路由信息的两个BGP发言人,彼此称为对方的临站 (neighbor)或对等站(peer)
-
BGP发言人除了运行BGP外,还必须运行自己所在自治系统使用的内部网关协议IGP,例如OSPF或RIP
-
BGP发言人交换网络可达性的信息(要到达某个网络所要经过的一系列自治系统)
-
当BGP发发言人互相交换网络可达性的信息后,各BGP发言人就根据采用的策略 从收到的路由信息中找出达到各自治系统的较好的路由。也就是构造出树形结构、不存在回路的自治系统连通图
-
BGP-4有以下四种报文:
- OPEN(打开)报文:用来与相邻的另一个BGP发言人建立关系,使通信初始化
- UPDATE(更新)报文:用来通告某一路由的信息,以及列出要撤销的多条路由
- KEEPALIVE(保活)报文:用来周期性地证实临站的连通性
- NOTIFICATION(通知)报文:用来发送检测到的差错
4.7 IPv4数据报的首部格式
-
版本:
- 占4比特,表示IP协议的版本号
- 通信双方使用的IP协议的版本必须一致。目前还在广泛使用的IP协议版本号为4(即IPv4)
-
首部长度:
- 占4比特,表示IP数据报首都的长度。该字段的取值以4字节为单位
- 最小十进制取5,表示IP数据报首部只有20字节固定部分
- 最大十进制取15,表示IP数据报首部包含20字节固定部分和最大40字节可变部分
-
可选字段:
- 长度从1字节到40字节不等。用来支持排错、测量以及安全等措施
- 可选字段增加了IP数据报的功能,但这同时也使得IP数据报的首部长度变为可变的。这就增加了每一个路由器处理的IP数据报的开销。实际上可选字段很少被使用
-
填充字段:确保首部长度为4字节的整数倍,使用全0进行填充
-
区分服务:
- 占8比特,用来获得更好的服务
- 该字段在旧标准中叫做服务类型,但是实际上一直没有使用过
- 利用该字段的不同数值可提供不同等级的服务质量,只有在区分服务时,该字段才起作用。一般情况下都不使用该字段
-
总长度:
- 占16比特,表示IP数据报的总长度(首部+数据载荷)
- 取最大值为十进制的65535,以字节为单位
-
标识 、标志 、片偏移 共同用于IP数据报分片
- 标识:
- 占16比特,属于同一个数据报的各分片数据报应该具有相同的标识
- IP软件维持一个计数器,每产生一个数据报,计数器的值+1,并将此值赋值给标识字段
- 标志:
- 占3比特,各比特含义如下:
- DF位:1标识不允许分片,0标识允许分片
- MF位:1表示"后面还有分片",0表示"这是最后一个分片"
- 保留位:必须设置为0
- 占3比特,各比特含义如下:
- 片偏移:
- 占13比特,指出分片数据报的数据载荷部分偏移在其原数据报的位置有多少个单位
- 片偏移以8字节为单位
- 标识:
-
生存时间TTL:
- 占8比特,最初以秒为单位,最大生存周期为255秒;路由器转发IP数据报时,将IP数据报首部中该字段的值减去IP数据报在本路由器上锁耗费的时间,若不为0就转发,否则就丢弃
- 现在以"跳数"为单位,路由器转发IP数据报时,将IP数据报首部中的该字段的值-1,若不为0就转发,否则就丢弃
-
协议:
-
占8比特,指明IPv4数据报的数据部分是何种协议数据单元,常用的协议数据单元的值如下:
协议名称 ICMP IGMP TCP UDP IPv6 OSPF 协议字段值 1 2 6 17 41 89
-
-
首部检验和:
- 占16比特,用来检测首部在传输过程中是否出现差错。比CRC校验简单,称为因特网校验和
- IP数据报每经过一个路由器。都要重新计算首部检验和
- 由于IP层本身并不提供可靠的传输服务,并且绩点首部校验和是一项耗时的操作,因此在IPv6中,路由器不再计算首部校验和,从而更快地转发IP数据报
-
源IP地址和目的IP地址:
- 各占32比特,用来填写发送该IP数据报的源主机地址和接收该IP数据报的目的主机的IP地址
4.8 网际控制报文协议ICMP
- 为了更有效地转发IP数据报和提高交付的机会,在网际层使用了网际控制报文协议ICMP(Internet Control Message Protocol)
- 主机或路由器使用ICMP来发送差错报告报文 和询问报文
- ICMP报文被封装在IP数据报中发送
- ICMP差错报告报文 共有以下五种:
- 终点不可达:放路由器或主机不能交付数据报时,就向源点发送终点不可达报文。具体可再根据ICMP的代码字段细分为目的网络不可达、目的主机不可达、目的协议不可达、目的端口不可达、目的网络未知、目的主机未知等13种错误
- 源点抑制:当路由器或主机由于拥塞而丢弃数据报时,就向源点发送源点抑制报文,使源点能知道应当把数据报的发送速率放慢
- 时间超过:当路由器收到一个目的IP地址不是自己的IP数据报,会将其生存时间TTL字段的值-1。若结果不为0,则将该IP数据报转发出去。若结果为0,除丢弃该IP数据报外,还要向源点发送时间超过报文。若是当终点再预先规定时间内不能收到一个数据报的全部数据片时,就把已收到的数据报片全都丢弃,也会向源点发送时间超过报文
- 参数问题:当路由器或目的主机收到IP数据报后,根据其首部中的检验和字段发现首部在传输过程中出现了误码,就丢弃该数据报,并向源点发送参数问题报文
- 改变路由(重定向):路由器把改变路由报文发送给主机,让主机知道下次应将世俗举报发送给另外的路由器(可通过更好的路由)
- 以下情况不应发送ICMP差错报告报文:
- 对ICMP差错报告报文不再发送ICMP差错报告报文
- 对第一个分片的数据报片的所有后续数据报片都不发送ICMP差错报告报文
- 对具有多播地址的数据报都不发送ICMP差错报告报文
- 对具有特殊地址(如127.0.0.0或0.0.0.0)的数据报不发送ICMP差错报告报文
- 常用的ICMP询问报文 有以下两种:
- 回送请求和回答 :ICMP回送请求报文是由主机或路由器向一个特定的目的主机发出的询问。收到此报文的主机必须给源主机或路由器发送ICMP回送回答报文。这种询问报文用来测试目的站是否可达及了解有关状态
- 时间戳请求和回答 :ICMP时间戳请求保卫五年社死请某个主机或路由器回答当前的日期和时间。在ICMP时间戳回答报文中有一个32比特的字段,其中写入的整数代表从1900年1月1日起到当前时刻一共有多少秒。这种报文用来进行时钟同步和测量时间
ICMP举例应用:
- 分组网间探测PING (Package InetrNet Groper)
- 用来测试主机或路由器的连通性
- 应用层直接使用网际层的ICMP(没有通过运输层的TCP或UDP)
- 使用ICMP回送请求和回答报文
- 跟踪路由traceroute
- 用来测试IP数据报从源主机到达目的主机要经过哪些路由器
- Windows版本:
- tracert命令
- 应用层直接使用网际层ICMP
- 使用了ICMP回送请求和回答报文以及差错报告报文
- Unix版本:
- traceroute命令
- 在运输层使用UDP协议
- 仅使用哦个ICMP差错报告报文
4.9 虚拟专用网VPN与网络地址转换器
虚拟专用网VPN(Vitual Private Network)
利用公用的因特网作为本机构各专用网之间的通信载体,这样的专用网又称为虚拟专用网 ,由于IPv4地址的紧缺,一个机构能够申请到的IPv4地址数量往往小于本机构拥有的主机数量。因此,虚拟专用网中的各主机所分配的地址应该是本机构可自由分配的专用地址,而不是需要申请的、在因特网上使用的共有地址
网络地址转换NAT
虽热因特网采用了无分类编制的发放时来减缓IPv4地址空间耗尽的速度,但是由于因特网用户数目的激增。特特别是大量小型办公室网络和家庭网络接入因特网的需求不断增加,IPv4地址空间即将面临耗尽的危险仍然没有被解除。
1994年提出了一种网络地址转换NAT的方法再次缓解了IPv4地址空间即将耗尽的问题。
NAT能使大量使用内部专用地址的专用网络用户共享少量外部全球地址来访问因特网上的主机和资源。
绝大多数的网络应用都是使用运输层协议TCP或UDP类传送数据,因此可以利用运输层的端口号和IP地址一起进行转换。这样,用一个全球IP地址就可以使多个拥有本地地址的主机同时和因特网上的主机进行通信。这种端口号和IP地址一起转换的技术叫做网络地址与端口号转换NAPT(Network Address and Port Translation)