1. 网络层概述
简介
- 网络层的主要任务是实现网络互连,进而实现数据包在网络之间的传输。
- 要实现网络层任务,需要解决以下的主要问题:
1)网络层向下层提供怎样的服务(“可靠传输” or “不可靠传输”)
2)网络层寻址问题
3)路由选择问题
- 因特网是目前全世界用户数量最多的互联网,它使用TCP/IP协议栈。
- 由于TCP/IP协议栈的网络层使用网际协议IP,它是整个协议栈的核心协议,因此在TCP/IP协议栈中网络层通常称为网际层。
2. 网络层提供的两种服务
- 面向连接的虚电路服务
1)可靠通信由网络层来保证
必须建立网络层的连接—虚电路VC(Virtual Circuit)
2)通信双方沿着已建立的虚电路发送分组
3)目的主机的地址仅在连接建立阶段使用,之后每个分组的首部只需要携带一条虚电路的编号(构成虚电路的每一段链路都有一个虚电路编号)
4)这种通信方式如果再使用可靠传输的网络协议,就可使所发送的分组最终正确到达接收方(无差错按序到达、不丢失、不重复)
5)通信结束后,需要释放之前所建立的虚电路
6)很多广域分组交换网都使用面向连接的虚电路服务。eg. 曾经的X.25和逐渐过时的帧中继FR、异步传输模式ATM等。
- 无连接的数据报服务
1)可靠通信应当由用户主机来保证
2)不需要建立网络层连接
3)每个分组可走不同的路径
4)每个分组的首部必须携带目的主机的完整地址
5)这种通信方式所传送的分组可能误码、丢失、重复和失序
6)由于网络本身不提供端到端的可靠传输服务,这就使网络中的路由器可以做的比较简单,而且价格低廉(与电信网的交换机相比较)
7)因特网采用了这种设计思想,也就是将复杂的网络处理功能置于因特网的边缘(用户主机和其内部的运输层),而将相对简单的尽最大努力的分组交付功能置于因特网核心。
- 虚电路服务与数据报服务的对比 | 对比的方面 | 虚电路服务 | 数据报服务 | | —- | —- | —- | | 思路 | 可靠通信应当由网络来保证 | 可靠通信应当由用户主机来保证 | | 连接的建立 | 必须有 | 不需要 | | 终点地址 | 仅在连接建立阶段使用,每个分组使用短的虚电路号 | 每个分组都有终点的完整地址 | | 分组的转发 | 属于同一条虚电路的分组均按照同一路由进行转发 | 每个分组独立选择路由进行转发 | | 当结点出故障时 | 所有通过出故障的结点的虚电路均不能工作 | 出故障的结点可能会丢失分组,一些路由可能会发生变化 | | 分组的顺序 | 总是按发送顺序到达终点 | 到达终点时不一定按发送顺序 | | 端到端的差错处理和流量控制 | 可以由网络负责,也可以由用户主机负责 | 由用户主机负责 |
3. 网际协议IP
网际协议IP 是 TCP/IP 体系中两个最主要的协议之一。
与 IP 协议配套使用的还有三个协议:
- 地址解析协议ARP(Address Resolution Protocol)
- 网际控制报文协议ICMP(Internet Control Management Protocol)
- 网际组管理协议IGMP(Internet Group Management Protocol)
3.1 ARP 协议
ARP协议的用途:从网络层使用的IP地址,解析出在数据链路层使用的MAC地址
我们知道,网络层使用的是IP地址,但在实际网络的链路上传送数据帧时,最终还是必须使用该网络的硬件地址。但IP地址和下面的网络的硬件地址之间由于格式不同而不存在简单的映射关系。此外,在一个网络上可能会有新的主机加进来,或撤走一些主机。更换网络适配器也会使主机的硬件地址发生改变。
而ARP协议解决这个问题的方法就是在主机ARP高速缓存中存放一个从IP地址到硬件地址的映射表,并且这个映射表还经常动态更新(新增或超时删除)。
ARP高速缓存表当主机B要给主机C发送数据包时,
会首先在自己的ARP高速缓存表中查找主机C的IP地址所对应的MAC地址,
但未找到,因此,主机B需要发送ARP请求报文,来获取主机C的MAC地址
``` ARP请求报文有具体的格式,上图的只是简单描述
ARP请求报文被封装在MAC帧中发送,目的地址为广播地址
主机B发送封装有ARP请求报文的广播帧,总线上的其他主机都能收到该广播帧

收到ARP请求报文的主机A和主机C会把ARP请求报文交给上层的ARP进程
主机A发现所询问的IP地址不是自己的IP地址,因此不用理会
主机C的发现所询问的IP地址是自己的IP地址,需要进行相应
<br /><br /><br />动态与静态的区别:<br /><br />**ARP协议只能在一段链路或一个网络上使用,而不能跨网络使用**<br /><br />ARP协议的使用是逐段链路进行的
<a name="Hzw8K"></a>
### 3.2 小结

<a name="I2bl0"></a>
## 4. IPv4
<a name="NYUZM"></a>
### 4.1 IPv4地址概述
- IPv4地址就是给因特网上的每一台主机(或路由器)的每一个接口分配一个在全世界范围内是唯一的32比特的标识符。
- IPv4地址的编址方法经历了如下三个阶段:

- 32位比特的IPv4地址不方便阅读,记录以及输入等,因此IPv4采用十进制表示方法以方便用户使用。

<a name="x5QVR"></a>
### 4.2 分类编址的IPv4地址
- 分类编址的IPv4地址分为A、B、C、D、E五类
- 每一类地址都由两个固定长度的字段组成,其中一个字段是**网络号 net-id**,它标志主机(或路由器)所连接到的网络,而另一个字段则是**主机号 host-id**,它标志该主机(或路由器)。
- 主机号在它前面的网络号所指明的网络范围内必须是唯一的。
- 注意:
1)只有A类、B类和C类地址可分配给网络中的主机或路由器的各接口<br />2)主机号为"全0"的地址是网络地址,不能分配给主机或路由器的各接口<br />3)主机号为"全1"的地址是广播地址,不能分配给主机或路由器的各接口<br />A类地址:<br />网络号的最高位固定为0<br />
<br />B类地址:<br />网络号的最高位固定为10<br />
<br />C类地址:<br />网络号的最高位固定为110<br />
<br />D类地址:<br />网络号的最高位固定为1110<br /><br />E类地址:<br />网络号的最高位固定为1111<br /><br />

例题:<br />
<a name="sIBGs"></a>
### 4.3 小结
**IP 地址的指派范围:**<br /><br />**一般不使用的特殊的 IP 地址:**<br /><br />**IP 地址的一些重要特点:**<br />(1)**IP 地址是一种分等级的地址结构**。分两个等级的好处是:
- **第一**,IP 地址管理机构在分配 IP 地址时只分配网络号,而剩下的主机号则由得到该网络号的单位自行分配。这样就方便了 IP 地址的管理。
- **第二**,路由器仅根据目的主机所连接的网络号来转发分组(而不考虑目的主机号),这样就可以使路由表中的项目数大幅度减少,从而减小了路由表所占的存储空间。
(2)**实际上 IP 地址是标志一个主机(或路由器)和一条链路的接口**。
- 当一个主机同时连接到两个网络上时,该主机就必须同时具有两个相应的 IP 地址,其网络号 net-id 必须是不同的。这种主机称为**多归属主机** (multihomed host)。
- 由于一个路由器至少应当连接到两个网络(这样它才能将 IP 数据报从一个网络转发到另一个网络),因此**一个路由器至少应当有两个不同的 IP 地址**。
(3)**用转发器或网桥连接起来的若干个局域网仍为一个网络**,因此这些局域网都具有同样的网络号 net-id。<br />(4)**所有分配到网络号 net-id 的网络,无论是范围很小的局域网,还是可能覆盖很大地理范围的广域网,都是平等的。**
<a name="SgJmm"></a>
### 4.4 划分子网的IPv4地址
<a name="vtZE0"></a>
#### 4.4.1 如何划分子网
基本思路
- 划分子网纯属一个**单位内部的事情**。单位对外仍然表现为没有划分子网的网络。
- 从主机号**借用**若干个位作为**子网号** subnet-id,而主机号 host-id 也就相应减少了若干个位。

- 凡是从其他网络发送给本单位某个主机的 IP 数据报,仍然是根据 IP 数据报的**目的网络号** net-id,先找到连接在本单位网络上的路由器。
- 然后**此路由器**在收到 IP 数据报后,再按**目的网络号** net-id 和**子网号** subnet-id 找到目的子网。
- 最后就将 IP 数据报直接交付目的主机。
**划分为三个子网后对外仍是一个网络**<br /><br />**优点:**
1. 减少了 IP 地址的浪费
2. 使网络的组织更加灵活
3. 更便于维护和管理
- **划分子网纯属一个单位内部的事情,对外部网络透明**,对外仍然表现为没有划分子网的一个网络。
<a name="DqCnw"></a>
#### 4.4.2 子网掩码
32位比特的子网掩码可以表明分类IP地址的主机号部分被借用了几个比特作为子网号
- 子网掩码使用连续的比特1来对应网络号和子网号
- 子网掩码使用连续的比特0来对应主机号
- 将划分子网的IPv4地址与其相应的子网掩码进行逻辑与运算就可以得到IPv4地址所在子网的网络地址
<br />**重要:(IP 地址) AND (子网掩码) = 网络地址**
**例子:**<br />例题1.<br />
例题2.<br />
<a name="syzb3"></a>
#### 4.4.3 默认子网掩码

<a name="xaNdb"></a>
#### 4.4.4 小结

- 子网掩码是一个网络或一个子网的重要属性。
- 路由器在和相邻路由器交换路由信息时,必须把自己所在网络(或子网)的子网掩码告诉相邻路由器。
- 路由器的路由表中的每一个项目,除了要给出目的网络地址外,还必须同时给出该网络的子网掩码。
- 若一个路由器连接在两个子网上,就拥有两个网络地址和两个子网掩码。
<a name="Vbe3U"></a>
### 4.5 无分类编址的IPv4地址
<a name="TYlpT"></a>
#### 4.5.1 为什么使用无分类编址?
**无分类域间路由选择 CIDR** (Classless Inter-Domain Routing)。<br /><br />**CIDR 最主要的特点:**
- CIDR使用各种长度的“**网络前缀**”(network-prefix)来代替分类地址中的网络号和子网号。
- **IP 地址从三级编址(使用子网掩码)又回到了两级编址**。
<a name="ycalw"></a>
#### 4.5.2 如何使用无分类编址?
<br />举例:<br />
<a name="GGYYP"></a>
#### 4.5.3 路由聚合(构造超网)
**路由聚合的方法:找共同前缀**<br /><br />例题1:<br /><br />例题2:<br />
<a name="W4YNt"></a>
#### 4.5.4 小结

<a name="bhDZ6"></a>
### 4.6 IPv4地址的应用规划
给定一个IPv4地址块,如何将其划分成几个更小的地址块,并将这些地址块分配给互联网中不同网络,进而可以给各网络中的主机和路由器接口分配IPv4地址。
<a name="rGQHq"></a>
#### 4.6.1 定长的子网掩码FLSM
定长的子网掩码FLSM(Fixed Length Subnet Mask)
- 使用同一个子网掩码来划分子网
- 子网划分方式不灵活:只能划分出2^n个子网(n是从主机号部分借用的用来作为子网号的比特数量)
- 每个子网所分配的IP地址数量相同,容易造成IP地址浪费
**划分子网的IPv4就是定长的子网掩码**<br />举例:<br /><br /><br />
通过上面步骤分析,就可以从子网1 ~ 8中任选5个分配给左图中的N1 ~ N5
采用定长的子网掩码划分,只能划分出2^n个子网, 其中n是从主机号部分借用的用来作为子网号的比特数量, 每个子网所分配的IP地址数量相同
但是也因为每个子网所分配的IP地址数量相同,不够灵活,容易造成IP地址的浪费
<a name="PTUUB"></a>
#### 4.6.2 变长的子网掩码VLSM
变长的子网掩码(Variable Length Subnet Mask)
- 使用不同的子网掩码来划分子网
- 子网划分方式灵活:可按需分配
- 每个子网所分配的IP地址数量可以不同,尽可能减少对IP地址的浪费
**无分类编址的IPv4就是变长的子网掩码**<br />
在该地址块中给左图所示的网络N1~N5分配子块,分配原则是“每个子块的起点位置不能随意选取,只能选取块大小整数倍的地址作为起点”。**建议先给大的子块分配**。<br />
<a name="vwwzg"></a>
## 5. IP数据报的发送和转发过程
IP数据报的发送和转发过程包含以下两部分:
- 主机发送IP数据报
- 路由器转发IP数据报
注意:为了将重点放在TCP/IP协议栈的网际层发送和转发IP数据报的过程上,在之后的举例中,我们忽略使用ARP协议来获取目的主机或路由器接口的MAC地址的过程以及以太网交换机自学习和转发帧的过程。<br />**举例:**<br /><br /><br />源主机如何知道目的主机是否与自己在同一个网络中,是直接交付,还是间接交付?<br />
可以通过目的地址IP和源地址的子网掩码进行【逻辑与】运算得到【目的网络地址】
-如果目的网络地址和源网络地址 相同,就是在同一个网络中,属于【直接交付】
-如果目的网络地址和源网络地址 不相同,就不在同一个网络中,属于【间接交付】, 传输给主机所在网络的默认网关(路由器——下图会讲解),由默认网关帮忙转发
主机C如何知道路由器R的存在?<br />
用户为了让本网络中的主机能和其他网络中的主机进行通信, 就必须给其指定本网络的一个路由器的接口,由该路由器帮忙进行转发, 所指定的路由器,也被称为默认网关
例如。路由器的接口0的IP地址192.168.0.128做为左边网络的默认网关
<br /><br />主机A会将该IP数据报传输给自己的默认网关,也就是图中所示的路由器接口0
**路由器收到IP数据报后如何转发?**
- **检查IP数据报首部是否出错:**
- 若出错,则直接丢弃该IP数据报并通告源主机
- 若没有出错,则进行转发
- **根据IP数据报的目的地址在路由表中查找匹配的条目:**
- 若找到匹配的条目,则转发给条目中指示的吓一跳
- 若找不到,则丢弃该数据报并通告源主机
**假设IP数据报首部没有出错,路由器取出IP数据报首部各地址字段的值**<br /><br />**接下来路由器对该IP数据报进行查表转发**<br />
逐条检查路由条目, 将目的地址与路由条目中的地址掩码进行逻辑与运算得到目的网络地址, 然后与路由条目中的目的网络进行比较, 如果相同,则这条路由条目就是匹配的路由条目,按照它的下一条指示, 图中所示的也就是接口1转发该IP数据报。

**路由器是隔离广播域的,如果因特网中数量巨大的路由器收到广播IP数据报后都进行转发,则会造成巨大的广播风暴,严重浪费因特网资源。**<br /><br />例题:<br />


**小结:**<br />
<a name="kQFZU"></a>
## 6. 静态路由配置及其可能产生的路由环路问题
<a name="WKShy"></a>
### 6.1 概念
- 静态路由配置是指用户或网络管理员使用路由器的相关命令给路由器人工配置路由表。
- 这种人工配置方式简单、开销小。但不能及时适应网络状态(流量、拓扑等)的变化。
- 一般只在小规模网络中采用。
- 使用静态路由配置可能出现以下导致产生路由环路的错误
- 配置错误
- 聚合了不存在的网络
- 网络故障
<a name="aKRsJ"></a>
### 静态路由配置

<a name="E4Svu"></a>
### 默认路由
<br />由于因特网中包含了众多的网络,如果我们给R1添加针对这些网络的每一条路由条目,则会给人工配置带来巨大的工作量,并且使R1的路由表变得非常大,降低了查表转发的速度。<br />实际上,对于具有相同下一跳的不同目的网络的路由条目,我们可以用一条默认路由条目来替代。
<a name="TbmUS"></a>
### 特定主机路由
- 有时候,我们可以给路由器添加针对某个主机的特定主机路由条目
- 一般用于网络管理人员对网络的管理和测试
- 在需要考虑某种安全问题时也可以采用特定主机路由

多条路由可选,匹配路由最具体的
<a name="jJVVV"></a>
### 静态路由配置错误导致路由环路
举例:<br />
假设将R2的路由表中第三条目录配置错了下一跳<br />这导致R2和R3之间产生了路由环路<br />
<a name="kSEHl"></a>
### 聚合了不存在的网络而导致路由环路
举例:<br />**正常情况**<br />

**错误情况**<br />
**解决方法**<br /><br />在R2路由表中添加针对所聚合的、不存在的网络的黑洞路由。黑洞路由的下一跳为null0,这是路由器内部的虚拟接口,可以把它形象地堪称一个”黑洞“,IP数据报进入它后就有去无回了。也就是路由器丢弃了该IP数据报,而不是转发该IP数据报。

<a name="XH2xu"></a>
### 网络故障所导致的路由环路
举例<br />

**解决方法:添加故障的网络为黑洞路由**<br /><br />
假设一段时间后故障网络恢复了,R1又自动地得出了其接口0的直连网络的路由条目,则针对该网络的黑洞网络会自动失效。<br />
如果又发生故障,则生效该网络的黑洞网络<br />
**小结**<br />
<a name="ssmEF"></a>
## 7. 路由选择协议
<a name="HnT9X"></a>
### 概述
<br />**因特网所采用的路由选择协议的主要特点**<br />
<a name="EiFrL"></a>
### 因特网采用分层次的路由选择协议
- **自治系统AS:**自治系统AS是在单一技术管理下的一组路由器,而这些路由器使用一种自治系统内部的路由选择协议和共同的度量。一个AS对其他AS表现出的是一个单一的和一致的路由选择策略。
在目前的互联网中,一个大的ISP就是一个自治系统。这样,互联网就把路由选择协议划分为两大类,即:**内部网关协议 IGP、外部网关协议 EGP**<br />
- 自治系统之间的路由选择也叫**域间路由选择**
- 在自治系统内部的路由选择叫做**域内路由选择**
<br />**网关协议也可称为路由协议**
<a name="iiYE7"></a>
### 常见的路由选择协议

<a name="D0eVS"></a>
### 路由器的基本结构
- 路由器是一种具有多个输入端口,和输出端口的专用计算机,其任务是转发分组
<br />**整个路由器接口可划分为两大部分:**
1. **路由选择部分**
1. **核心部件:路由选择处理机,其任务是根据所使用的路由选择协议周期性的与其他路由器进行路由信息的交互,来更新路由表**
如果送交给输入端口的网络层的分组是路由器之间交换路由信息的路由报文,则把这种分组送交给路由选择处理机,路由选择处理机根据分组的内容来更新自己的**路由表。**<br />路由选择处理机还会周期性地给其他路由器发送自己所知道的路由信息。<br />
2. **分组转发部分**
1. **交换结构**
2. **一组输入端口:**
信号从某个输入端口进入路由器<br />
物理层将信号转换成比特流,送交数据链路层处理<br /><br />数据链路层从比特流中识别出帧,去掉帧头和帧尾后,送交网络层处理<br /><br />如果送交网络层的分组是普通待转发的数据分组,则根据分组首部中的目的地址进行查表转发<br /><br />若找不到匹配的转发条目,则丢弃该分组;否则,按照匹配条目中所指示的端口进行转发
3. **一组输出端口**
网络层更新数据分组首部中某些字段的值,例如将数据分组的生存时间减1,然后送交数据链路层进行封装<br /><br />数据链路层将数据分组封装成帧,交给物理层处理<br /><br />物理层将帧看成比特流将其变换成相应的电信号进行发送
**路由器的各端口还会有输入缓冲区和输出缓冲区**
- 输入缓冲区用来暂存新进入路由器但还来不及处理的分组
- 输出缓冲区用来暂存已经处理完毕但还来不及发送的分组

<a name="aH0i0"></a>
### 路由信息协议RIP


<a name="PVDWO"></a>
#### RIP的工作过程

<a name="qFZwE"></a>
#### RIP的路由条目的更新规则

路由器C的路由表到达各目的网络的下一跳都记为问号, 可以理解为其他路由器并不需要关心路由器C的这些内容
假设路由器C的RIP更新报文发送周期到了, 则路由器C将自己路由表中的相关路由信息封装到RIP更新报文中发送给路由器D
```
路由器C能到达这些网络,说明路由器C的相邻路由器也能到达,只是比路由器C的距离大1,于是根据距离的对比,路由器D更新自己的路由表
例题:
RIP存在“坏消息传播得慢”的问题
- 假设R1到达其直连网络N1的链路出了故障,当R1检测出该故障后,会将到达N1的路由条目中的距离修改为16,表示N1不可达,并等待RIP更新周期到时后,发送该路由信息给R2;而R2中的路由表信息仍然是通过RIP协议获取到的,也就是到达N1的距离为2,下一跳由R1转发。
- 假设R2的RIP更新周期先到时,也就是R2的这条路由信息先到达R1,而R1的这条路由信息后到达R2。
- 当R1收到R2的这条路由信息后,就会被该谣言误导,认为可以通过R2到达N1,距离为3。并在自己的RIP更新周期到时后,将这条信息发送给R2。R2收到该路由信息后,也被该信息误导。
- 当 R1 和 R2 的路由表中到达N1的路由条目中的距离都增加到16后,R1 和 R2 才都知道N1 不可达,也就是才收敛。该过程中,R1 和 R2 之间会出现路由环路,时间长达数分钟。
解决方法
但是,这些方法也不能完全解决“坏消息传播得慢”的问题,这是距离向量的本质决定。
小结
开放最短路径优先
注意:OSPF 只是一个协议的名字,它并不表示其他的路由选择协议不是“最短路径优先”。
概念
问候(Hello)分组
IP数据报首部中协议号字段的取值应为89,来表明IP数据报的数据载荷为OSPF分组
发送链路状态通告LSA
洪泛法有点类似于广播,就是从一个接口进来,从其他剩余所有接口出去
链路状态数据库同步
OSPF五种分组类型
OSPF的基本工作过程
OSPF在多点接入网络中路由器邻居关系建立
如果不采用其他机制,将会产生大量的多播分组;若DR出现问题,则由BDR顶替DR
为了使OSPF能够用于规模很大的网络,OSPF把一个自治系统再划分为若干个更小的范围,叫做区域(Area)
- 在该自治系统内,所有路由器都使用OSPF协议,OSPF将该自治系统再划分成4个更小的区域
- 每个区域都有一个32比特的区域标识符
- 主干区域的区域标识符必须为0,主干区域用于连通其他区域
- 其他区域的区域标识符不能为0且不相同
- 每个区域一般不应包含路由器超过200个
- 划分区域的好处就是,利用洪泛法交换链路状态信息局限于每一个区域而不是自治系统,这样减少整个网络上的通信量
小结
边界网关协议BGP(了解)
BGP(Border Gateway Protocol) 是不同自治系统的路由器之间交换路由信息的协议
8. IPv4数据报的首部格式
- 一个 IP 数据报由首部和数据两部分组成。
- 首部的前一部分是固定长度,共 20 字节,是所有 IP 数据报必须具有的。
- 在首部的固定部分的后面是一些可选字段,其长度是可变的。
首部:
- 固定部分是指每个IP数据报首部都必须包含的部分
- IP数据报的首部常以32个比特为单位进行描述,图中的每一行都由32个比特(也就是4个字节)构成。
- 每个小格子称为字段或域,每个字段或某些字段的组合用来表达IP协议的相关功能
版本、首部长度、可选字段、填充字段
IP数据报的首部长度一定是4字节的整数倍
因为首部中的可选字段的长度从1个字节到40个字节不等,那么,当20字节的固定部分加上1到40个字节长度不等的可变部分,会造成首部长度不是4字节整数倍时,就用取值为全0的填充字段填充相应个字节,以确保IP数据报的首部长度是4字节的整数倍
区分服务、总长度
标识、标志、片偏移
注意:片偏移量必须为整数,并且以8个字节为单位
对IPv4数据报进行分片
现在假定分片2的IP数据报经过某个网络时还需要进行分片
生存时间
协议
首部检验和
源IP地址和目的地址
例题:
第一题:
第二题:
小结
9. 网际控制报文协议ICMP
为了更有效地转发IP数据报和提高交付成功的机会,在网际层使用了网际控制报文协议。
ICMP 不是高层协议(看起来好像是高层协议,因为 ICMP 报文是装在 IP 数据报中,作为其中的数据部分),而是 IP 层的协议
ICMP 报文的格式
- 主机或路由器使用ICMP来发送ICMP差错报告报文和ICMP询问报文。
- ICMP报文被封装在IP数据报中发送
ICMP差错报告报文共有以下5种:
- 终点不可达
- 源点抑制
- 时间超过
- 参数问题
- 改变路由(重定向)
不应发送ICMP差错报告报文情况
常用的ICMP询问报文:
ICMP应用举例
小结
10. 虚拟专用网VPN与网络地址转换NAT