计算机网络——网络层
概述
网络层的主要任务是实现网络互连,进而实现数据包在各网络之间的传输。
解决的主要问题:
- 网络层向运输层提供怎样的服务(“可靠传输”还是“不可靠传输”)
- 网络层寻址问题
- 路由选择问题
因特网(Internet)是目前全世界用户数量最多的互联网,它使用 TCP/IP 协议栈。
由于 TCP/IP 协议栈中的网络层使用网际协议 IP,它是整个协议栈的核心协议,因此在 TCP/IP 协议栈中网络层常称为网际层。
网络层提供的两种服务
面向连接的虚电路服务
核心思想:
- 可靠通信由网络来保证
- 必须建立网络层的连接——虚电路 VC(Virtual Circuit)
- 通信双方沿着已建立的虚电路发送分组
- 目的主机的地址仅在连接建立阶段使用,之后每个分组的首部只需携带一条虚电路的编号(构成虚电路的每一段链路都有一个虚电路编号)。
- 这种通信方式如果再使用可靠传输的网络协议,就可使所发送的分组最终正确到达接收方(无差错按需到达、不丢失、不重复)。
- 通信结束后,需要释放之前所建立的虚电路。
无连接的数据报服务
核心思想:
- 可靠通信应当由用户主机来保证
- 不需要建立网络层连接
- 每个分组可走不同的路径
- 每个分组的首部必须携带目的主机的完整地址
- 这种通信方式所传送的分组可能误码、丢失、重复和失序。
- 由于网络本身不提供端到端的可靠传输服务,这就使网络中的路由器可以做得比较简单,而且价格低廉。
IPv4 地址
概述
IPv4 地址就是给因特网(Internet)上的每一台主机(或路由器)的每一个接口分配一个在全世界范围内的唯一 32 比特的标识符。
表示方法
点分十进制表示方法
32 比特 IPv4 地址 0 0 0 0 1 0 1 0 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 0 1 0 1 0 1 0
每 8 位分为 1 组 00001010
11110000
00001111
10101010
写出每组的十进制数 10
240
15
170
写出点分十进制形式 10.240.15.170
分类编址的 IPv4 地址
A 类地址
前 8 比特:网络号(第 1 比特固定为 0)
后 24 比特:主机号
最小网络号为 0,保留不指派(没有 0.*.*.*
地址)
第一个可指派的网络号为 1,网络地址为 1.0.0.0
最大网络号为 127,作为本地环回测试地址,不指派
- 最小的本地环回地址为
127.0.0.1
- 最大的本地环回地址为
127.255.255.254
最后一个可指派的网络号为 126,网络地址为 126.0.0.0
可指派的网络数量为 \(2^{(8-1)} - 2 = 126\)
每个网络可分配的 IP 地址数量为 \(2^{24} - 2 = 16777214\)
地址 0.0.0.0
是一个特殊的 IPv4 地址,只能作为源地址使用,表示“在本网络上的本主机”。封装有 DHCP Discovery 报文的 IP 分组的源地址使用 0.0.0.0
以 127 开头且后面三个字节非“全 0”或“全 1”的 IP 地址是一类特殊的 IPv4 地址,既可以作为源地址使用,也可以作为目的地址使用,用于本地软件环回测试,例如常用的环回测试地址 127.0.0.1
B 类地址
前 16 比特:网络号(前 2 比特为 10)
后 16 比特:主机号
最小网络号也是第一个可指派的网络号 128.0,网络地址为 128.0.0.0
最大网络号也是最后一个可指派的网络号 191.255,网络地址为 191.255.0.0
可指派的网络数量为 \(2^{(16-2)} = 16384\)
每个网络可分配的 IP 地址数量为 \(2^{16} - 2 = 65534\)
C 类地址
前 24 比特:网络号(前 3 比特为 110)
后 8 比特:主机号
最小网络号也是第一个可指派的网络号 192.0.0,网络地址为 192.0.0.0
最大网络号也是最后一个可指派的网络号 223.255.255,网络地址为 223.255.255.0
可指派的网络数量为 \(2^{(24-3)} = 2097152\)
每个网络可分配的 IP 地址数量为 \(2^{8} - 2 = 254\)
D 类地址
多播地址,最高 4 位固定为 1110
E 类地址
保留地址,最高 4 位固定为 1111
地址 255.255.255.255
是一个特殊的 IPv4 地址,只能作为目的地址使用,表示“只在本网络上进行广播(各路由器均不转发)”。
只有 A 类、B 类和 C 类地址可分配给网络中的主机或路由器的各接口。
主机号为“全 0”的地址是网络地址,不能分配给主机或路由器的各接口。
主机号为“全 1”的地址是广播地址,不能分配给主机或路由器的各接口。
划分子网的 IPv4 地址
32 比特的子网掩码可以表明分类 IP 地址的主机号部分被借用了几个比特作为子网号。
- 子网掩码使用连续的比特 1 来对应网络号和子网号
- 子网掩码使用连续的比特 0 来对应主机号
- 将划分子网的 IPv4 地址与其相应的子网掩码进行逻辑与运算就可得到 IPv4 地址所在子网的网络地址
默认子网掩码是指在未划分子网的情况下使用的子网掩码。
如 A 类地址的默认子网掩码 255.0.0.0
B 类地址的默认子网掩码 255.255.0.0
C 类地址的默认子网掩码 255.255.255.0
无分组编址的 IPv4 地址
无分类域间路由选择 CIDR(Classless Inter-Domain Routing)
- CIDR 消除了传统的 A 类、B 类和 C 类地址,以及划分子网的概念;
- CIDR 可以更加有效地分配 IPv4 的地址空间,并且可以在新的 IPv6 使用之前允许因特网的规模继续增长。
CIDR 使用 “斜线记法”,或称 CIDR 记法。即在 IPv4 地址后面加上斜线“/”,在斜线后面写上网络前缀所占的比特数量。
例如:128.14.35.7/20
网络前缀占用的比特数量:20
主机编号占用的比特数量:32-20=12
CIDR 实际上是将网络前缀都相同的连续的 IP 地址组成一个“CIDR地址块”。
路由聚合(构造超网)
方法:找共同前缀
将共同前缀保持不变,而剩余的比特全部取 0,然后写成点分十进制形式。
如:
IP | 拆分以显示共同前缀 |
---|---|
172.1.4.0/25 | 172.1.000001 00.0 |
172.1.4.128/25 | 172.1.000001 00.128 |
172.1.5.0/24 | 172.1.000001 00.0 |
172.1.6.0/24 | 172.1.000001 10.0 |
172.1.7.0/24 | 172.1.000001 11.0 |
则聚合后为 172.1.4.0/22
网络前缀越长,地址块越小,路由越具体;
若路由器查表转发分组时发现有多条路由可选,则选择网络前缀最长的那条,这称为最长前缀匹配,因为这样的路由更具体。
IPv4 地址的应用规划
定长的子网掩码 FLSM(Fixed Length Subnet Mask)
规划方法:考虑题目所需子网数、每个子网上需求的 IP 地址数量。进而考虑从主机号部分借用子网号的比特数量。
此方法使用同一个子网掩码来划分子网,每个子网所分配的 IP 地址数量相同,会造成 IP 地址的浪费。
变长的子网掩码 VLSM(Variable Length Subnet Mask)
使用不同的子网掩码来划分子网,每个子网所分配的 IP 地址数量可以不同,尽可能减少对 IP 地址的浪费。
规划方法:分别考虑每个子网需求的 IP 地址数量,进而确定主机号位数,其余部分作为网络前缀位数。最后按照地址块从大到小依次将申请到的地址块包含的地址分配给各网络。
分配原则:每个子块的起点位置不能随意选取,只能选取块大小整数倍的地址作为起点。建议先给大的子块分配。
IP 数据报的发送和转发路径
IP 数据报的发送和转发过程包含以下两部分:主机发送 IP 数据报、路由器转发 IP 数据报。
主机发送 IP 数据报
判断目的主机是否与自己在同一个网络,
将自己的主机 IP 地址与自己的子网掩码相与,得到自己的网络地址。
将目的主机的 IP 地址与自己的子网掩码相与,得到目的网络地址。
若在同一个网络,则属于直接交付;
若不在同一个网络,则属于间接交付,传输给主机所在网络的默认网关(路由器),由默认网关帮忙转发。
路由器转发 IP 数据报
- 检查 IP 数据报首部是否出错;
若出错,则直接丢弃该 IP 数据报并通告源主机;
若没有出错,则进行转发; - 根据 IP 数据报的目的地址在路由表中查找匹配的条目。
静态路由配置及其可能产生的路由环路问题
静态路由配置:是指用户或网络管理员使用使用路由器的相关命令给路由器人工配置路由表。
-
这种人工配置方法简单、开销小。但不能及时适应网络状态(流量、拓扑等)的变化。
-
一般只在小规模网络中采用。
使用静态路由配置可能出现一下产生路由环路的错误:
- 配置错误
为了防止 IP 数据报在路由环路中永久兜圈,在 IP 数据报首部设有生存时间 TTL 字段。IP 数据报进入路由后,TTL 字段的值减 1。若 TTL 的值不等于 0,则被路由器转发,否则被丢弃。 - 聚合了不存在的网络
配置黑洞路由,下一跳为虚拟接口 \(null0\),即为丢弃该数据报。 - 网络故障
出现故障后,不只删除,同时添加对于该目的网络的黑洞路由。
路由选择协议
概述
-
静态路由选择
-
由人工配置的网络路由、默认路由、特定主机路由、黑洞路由等都属于静态路由。
-
这种人工配置方法简单、开销小。但不能及时适应网络状态(流量、拓扑等)的变化。
-
一般只在小规模网络中采用。
-
-
动态路由选择
- 路由器通过路由选择协议自动获取路由信息。
- 比较复杂,开销比较大。
- 能较好地使用网络状态的变化。
- 适用于大规模网络。
因特网所采用的路由选择协议的主要特点:
- 自适应
动态路由选择,能较好地适应网络状态的变化 - 分布式
路由器之间交换路由信息 - 分层次
将整个互联网划分为许多较小的自治系统 AS(Autonomous System)
路由表:
- 路由表一般仅包含从目的网络到下一条的映射
- 路由表需要对网络拓扑变化的计算最优化
- 转发表是从路由表得出的
- 转发表的结构应当使查找过程最优化
路由信息协议 RIP 的基本工作原理
路由信息协议 RIP(Routing Information Protocol)是内部网关协议 IGP 种最先得到广泛使用的协议之一。
RIP 要求自治系统 AS 内的每一个路由器都要维护从它自己到 AS 内其他每一个网络的距离记录。这是一组距离,称为“距离向量 D-V”(Distance-Vector)
RIP 使用跳数(Hop Count)作为度量(Metric)来衡量到达目的网络的距离。
- 路由器到直连网络的距离定义为 1
- 路由器到非直连网络的距离定义为所经过的路由数加 1
- 允许一条路径最多只能包含 15 个路由器。“距离”等于 16 时相当于不可达。因此,RIP 之适用于小型互联网。
RIP 认为好的路由就是“距离短”的路由,也就是所通过路由数量最少的路由。(不考虑路由带宽,可能并不是最好的路由)
当到达同一目的网络有多条“距离相等”的路由时,可以进行等价负载均衡。
RIP 包含以下三个要点:
- 和谁交换信息:仅和相邻路由表交换信息
- 交换什么信息:自己的路由表
- 何时交换信息:周期性交换(例如每 30 秒)
开放最短路径优先 OSPF 的基本原理
OSPF(Open Shortest Path First)克服 RIP 的缺点
- 开放:公开发表
- 最短路径优先:Dijkstra 提出的最短路径算法 SPF
OSPF 是基于链路状态的,而不是像 RIP 那样是基于距离向量的。
OSPF 采用 SPF 算法计算路由,从算法上保证了不会产生路由环路。
OSPF 不限制网络规模,更新效率高,收敛速度快。
链路状态是指本路由都和哪些路由相邻,以及相应链路的“代价”(cost)。“代价”用来表示费用、距离、时延、带宽等等。这些都由网络管理人员来决定。
OSPF 相邻路由器之间通过交互问候(Hello)分组,建立和维护邻居关系。
使用 OSPF 的每个路由器都会产生链路状态通告 LSA(Link State Advertisement)。LSA 中包含以下内容:
- 直连网络的链路状态信息
- 邻居路由器的链路状态信息
LSA 被封装在链路状态更新分组 LSU 中,采用洪泛法发送。
使用 OSPF 的每个路由器都有一个链路状态数据库 LSDB,用于存储 LSA。
通过各路由器洪泛发送封装有自己 LSA 的 LSU 分组,各路由器的 LSDB 最终将达到一致。
使用 OSPF 的各路由器基于 LSDB 进行最短路径优先 SPF 计算,构建出各自到达其他各路由器的最短路径,即构建各自的路由表。
OSPF 有以下 5 种分组类型:
- 问候(Hello)分组
用来发现和维护邻居路由器的可达性。 - 数据库描述(Database Description)分组
向邻居路由器给出自己的链路状态数据库中的所有链路状态项目的摘要信息。 - 链路状态请求(Link State Request)分组
向邻居路由器请求发送某些链路状态项目的详细信息。 - 链路状态更新(Link State Update)分组
路由器使用这种分组将其链路状态进行洪泛发送,即用洪泛法对全网更新链路状态。 - 链路状态确认(Link State Acknowledgment)分组
这是对链路状态更新分组的确认分组。
边界网关协议 BGP 的基本工作原理
内部网关协议 IGP(例如路由选择协议 RIP 或开放最短路径优先 OSPF)
- 设法使分组在一个自治系统内尽可能有效地从源网络传输到目的网络
- 无需考虑自治系统外部其他方面的策略
外部网关协议 EGP (例如边界网关协议 BGP)
- 在不同自治系统内,度量路由的“代价”(距离,带宽,费用等)可能不同。
因此,对于自治系统之间的路由选择,使用“代价”作为度量来寻找最佳路由是不行的。 - 自治系统之间的路由选择必须考虑相关策略(政治,经济,安全等)
- BGP 只能是力求寻找一条能够到达目的网络且比较好的路由(不能兜圈子),而并非要寻找一条最佳路由
看不下去了。。TODO
IPv4 数据报的首部格式
-
版本
占 4 此特,表示IP协议的版本。
通信双方使用的 IP 协议的版本必须一致。目前广泛使用的 IP 协议版本号为 4(即IPv4)。 -
首部长度
占 4 比特,表示 IP 数据报首部的长度。该字段的取值以 4 字节为单位。(即如果首部长度是 1,代表首部长度为 4 个字节)
最小十进制取值为 5,表示 IP 数据报首部只有 20 字节固定部分;
最大十进制取值为 15,表示 IP 数据报首部包含 20 字节固定部分和最大 40 字节可变部分。 -
可选字段
长度从 1 个字节到 40 个字节不等。用来支持排错、测量及安全等措施。
可选字段增加了 IP 数据报的功能,但这同时也使得 IP 数据报的首部长度成为可变的。这就增加了每一个路由器处理 IP 数据报的开销。实际上可选字段很少被使用。 -
填充字段
确保首部长度为 4 字节的整数倍。使用全 0 进行填充。 -
区分服务
占 8 比特,用来获得更好的服务。
该字段在旧标准中叫作服务类型,但实际上一直没有被使用过。
1998 年,因特网工程任务组 IETF 把这个字段改名为区分服务。
利用该字段的不同数值可提供不同等级的服务质量。
只有在使用区分服务时,该字段才起作用。一般情况下都不使用该字段。 -
总长度
占 16 比特,表示 IP 数据报的总长度(首部+数据载荷)。 -
标识、标志和片偏移共同用于 IP 数据报分片
标识:占 16 比特,属于同一个数据报的各分片数据报应该具有相同的标识。IP 软件维持一个计数器,每产生一个数据报,计数器值加 1,并将此值赋给标识字段。
标志:占 3 比特,各比特含义如下:
- DF 位:1 表示不允许分片;0 表示允许分片
- MF 位:1 表示“后面还有分片”;0 表示“这是最后一个分片”
- 保留位:必须为 0
片偏移:占 13 比特,指出分片数据报的数据载荷部分偏移其在原数据报的位置有多少个单位。片偏移以 8 个字节为单位。
-
生存时间 TTL
占 8 比特,最初以秒为单位,最大生存周期为 255 秒;路由器转发 IP 数据报时,将 IP 数据报首部中的该字段的值减去 IP 数据报在本路由器上所耗费的时间,若不为 0 就转发,否则就丢弃。
现在以“跳数”为单位,路由器转发 IP 数据报时,将 IP 数据报首部中的该字段的值减 1,若不为 0 就转发,否则就丢弃。 -
协议
占 8 比特,指明 IPv4 数据报的数据部分是何种协议数据单元。 -
首部检验和
占 16 比特,用来检测首部在传输过程中是否出现差错。比 CRC 检验码简单,称为因特网检验和。
IP 数据报每经过一个路由器,路由器都要重新计算首部检验和,因为某些字段(生存时间、标志、片偏移等)的取值可能发生变化。
由于 IP 层本身并不提供可靠传输的服务,并且计算首部校验和是一项耗时的操作,因此在 IPv6 中,路由器不再计算首部校验和,从而更快转发 IP 数据报。 -
源 IP 地址和目的 IP 地址
各占 32 比特,用来填写发送该 IP 数据报的源主机的 IP 地址和接收该 IP 数据报的目的主机的 IP 地址。
网际控制报文协议 ICMP
为了更有效地转发 IP 数据报和提高交付成功的机会,在网际层使用了网际控制报文协议 ICMP(Internet Control Message Protocol).
主机或路由器使用 ICMP 来发送差错报告报文和询问报文。
ICMP 报文被封装在 IP 数据报中发送。
ICMP 差错报告报文
终点不可达
当路由器或主机不能交付数据报时,就向源点发送终点不可达报文。
源点抑制
当路由器或主机由于拥塞而丢弃数据报时,就向源点发送源点抑制报文,使源点知道应当把数据报的发送速率变慢。
时间超过
当路由器收到一个目的 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 日起到当前时刻—共有多少秒。
这种询问报文用来进行时钟同步和测量时间。
典型应用
分组网间探测 PING(Packet InterNet Groper)
用来测试主机或路由器间的连通性
应用层直接使用网际层的 ICMP(没有经过运输层的 TCP 或 UDP)
使用 ICMP 回送请求和回答报文
跟踪路由 trace route
用来测试 IP 数据报从源主机到达目的主机要经过哪些服务器
- Windows 版本
- tracert 命令
应用层直接使用网际层 ICMP
使用了 ICMP 回送请求和回答报文以及差错报告报文
- tracert 命令
- Unix 版本
- traceroute 命令
在运输层使用 UDP 协议
仅使用 ICMP 差错报告报文
- traceroute 命令
虚拟专用网 VPN 和网络地址转换 NAT
虚拟专用网 VPN(Virtual Private Network)
利用公用的因特网作为本机构各专用网之间的通信载体,这样的专用网又称为虚拟专用网。由于 IPv4 地址的紧缺,一个机构能够申请到的 IPv4 地址数量往往远小于本机构所拥有的主机数量。因此,虚拟专用网中的各主机所分配的地址应该是本机构可自由分配的专用地址,而不是需要申请的,在因特网上使用的公有地址。
-
同一机构内不同部门的内部网络所构成的虚拟专用网 VPN 又称为内联网 VPN。
-
有时一个机构的 VPN 需要有某些外部机构(通常就是合作伙伴)参加进来。这样的 VPN 就称为外联网 VPN。
-
在外地工作的员工需要访问公司内部的专用网络时,只要在任何地点接入到因特网,运行驻留在员工 PC 中的 VPN 软件,在员工的 PC 和公司的主机之间建立 VPN 隧道,即可访问专用网络中的资源。这种 VPN 称为远程接入 VPN。
网络地址转换 NAT(Network Address Translation)
虽然互联网采用了无分类编址方式来减缓 IPv4 地址空间耗尽的速度,但由于因特网用户数目的激增,特别是大量小型办公室网络和家庭网络接入互联网的需求不断增加,IPv4 地址空间即将面临耗尽的危险仍然没有被解除。
1994 年提出了一种网络地址转换 NAT 的方法再次缓解了 IPv4 地址空间即将耗尽的问题。
NAT 能使大量使用内部专用地址的专用网络用户共享少量外部全球地址来访问互联网上的主机和资源。
内网给因特网发送消息,由 NAT 路由器从自己的全球 IP 地址池中分配一个临时的 IP 地址,记录在 NAT 转换表中。
收到因特网的消息,从 NAT 转换表中查找消息的目的地址对应的内网 IP 地址。
该转换方法存在一个问题:如果 NAT 路由器具有 N 个全球 IP 地址,那么至多只能有 N 个内网主机能够同时和因特网上的主机通信。
由于绝大多数的网络应用都是使用运输层协议 TCP 或 UDP 来传送数据,因此可以利用运输层的端口号和 IP 地址一起进行转换。
这样,用一个全球 IP 地址就可以使多个拥有本地地址的主机同时和因特网上的主机进行通信。这种将端口号和 IP 地址一起进行转换的技术叫做网络地址与端口号转换 NAPT(Network Address and Port Translation)。
使用这种技术,外网主机不能首先发起通信。(路由器收到来自外网的 IP 数据报后,在 NAPT 转换表中找不到相应的记录)
对于一些 P2P 网络应用,需要外网主机主动与内网主机进行通信,在通过 NAT 时会遇到问题,需要网络应用自己使用一些特殊的 NAT 穿越技术来解决问题。
另外,由于 NAT 对外网屏蔽了内网主机的网络地址,能为内网的主机提供一定的安全保护。