计算机网络 – 网络层(中)
这篇文章是网络层介绍上篇的后续部分。
网际控制报文协议 ICMP
为了更有效地转发 IP 数据报和提高交付成功的机会,在网际层使用了网际控制报文协议 ICMP (Internet Control Message Protocol)。ICMP 允许主机或路由器报告差错情况和提供有关异常情况的报告。
虽然 ICMP 报文是装在 IP 数据报中,作为其中的数据部分,但是 ICMP 仍然是 IP 层的协议,而非高层协议。
ICMP 报文的种类有两种,即 ICMP 差错报告报文和 ICMP 询问报文。ICMP 报文的前 4 个字节是统一的格式,共有三个字段:即类型、代码和检验和。接着的 4 个字节的内容与 ICMP 的类型有关。
详细的 ICMP 报文的分类可见维基百科
ICMP 差错报告报文
ICMP 差错报告报文可分为以下几种类型
终点不可达(Destination Unreachable)
时间超过(Time Exceeded)
参数问题
改变路由(重定向)(Redirect)
我们先以“终点不可达”报文为例对于 ICMP 差错报告报文的组成有一个比较直观的了解。
ICMP 询问报文
ICMP 询问报文可分为以下几种类型
回送请求和回答报文
时间戳请求和回答报文
ICMP 的应用举例
PING
PING (Packet InterNet Groper)用来测试两个主机之间的连通性。使用了 ICMP 回送请求与回送回答报文。PING 是应用层直接使用网络层 ICMP 的例子,它没有通过运输层的 TCP 或 UDP。
我们打开电脑的终端,便可以 Ping 自己想要访问的主机 IP 地址(域名),测试一下连通性。比如,我们可以 ping 一下 segmentfault.com
Traceroute
Traceroute 用来跟踪一个分组从源点到终点的路径。它利用 IP 数据报中的 TTL 字段和 ICMP 时间超过差错报告报文实现对从源点到终点的路径的跟踪。
我们同样可以在终端测试:
互连网的路由选择协议
分层次的路由选择协议
互联网采用分层次的路由选择协议。原因是:
互联网的规模非常大。如果让所有的路由器知道所有的网络应怎样到达,则这种路由表将非常大,处理起来也太花时间。
许多单位不愿意外界了解自己单位网络的布局细节和本部门所采用的路由选择协议(这属于本部门内部的事情),但同时还希望连接到互联网上。
自治系统 AS (Autonomous System)
定义:在单一的技术管理下的一组路由器,而这些路由器使用一种 AS 内部的路由选择协议和共同的度量以确定分组在该 AS 内的路由,同时还使用一种 AS 之间的路由选择协议用以确定分组在 AS 之间的路由。尽管一个 AS 使用了多种内部路由选择协议和度量,但重要的是一个 AS 对其他 AS 表现出的是一个单一的和一致的路由选择策略。
两大类路由选择协议
“路由器”和“网关”在这里可以视作同义词。
内部网关协议 IGP (Interior Gateway Protocol)
在一个自治系统内部使用的路由选择协议
具体的协议有多种,如接下来会介绍的 RIP 和 OSPF
外部网关协议 EGP (External Gateway Protocol)
用于将路由选择信息传递到另一个自治系统中
目前使用的最多的是 BGP-4
内部网关协议 RIP
路由信息协议 RIP (Routing Information Protocol) 是内部网关协议 IGP 中最先得到广泛使用的协议。RIP 是一种分布式的、基于距离向量的路由选择协议。
RIP 协议中的“距离”也称为“跳数”(hop count),因为每经过一个路由器,跳数就加 1。(这里的“距离”实际上就是指“最短距离”)
RIP 允许一条路径最多只能包含 15 个路由器。“距离”的最大值为 16 时即相当于不可达。
RIP 协议的特点
仅和相邻路由器交换信息
交换的信息是当前本路由器所知道的全部信息,即自己的路由表
按固定的时间间隔交换路由信息
*“好消息传播得快,坏消息传播得慢”
RIP 报文
以目前广泛使用的 RIP version2 为例,简单了解一下 RIP 报文的组成:![RIPv2 报文]()
路由表的建立与更新
距离向量算法
路由器收到相邻路由器(其地址为 X)的一个 RIP 报文:(1) 先修改此 RIP 报文中的所有项目:把“下一跳”字段中的地址都改为 X,并把所有的“距离”字段的值加 1。(2) 对修改后的 RIP 报文中的每一个项目,重复以下步骤:
若项目中的目的网络不在路由表中,则把该项目加到路由表中。
否则
若下一跳字段给出的路由器地址是同样的,则把收到的项目替换原路由表中的项目。
否则
若收到项目中的距离小于路由表中的距离,则进行更新,
否则,什么也不做。
(3) 若 3 分钟还没有收到相邻路由器的更新路由表,则把此相邻路由器记为不可达路由器,即将距离置为 16(表示不可达)。(4) 返回。
文字叙述看着有点累,不过理解了“不同路径选短的,同样路径选新的”的思路就会很容易。
RIP 只与相邻路由交换信息不可避免会带来路由更新的一类延迟,及之前提到的“好消息传得快,坏消息传得慢”。
“好消息传得快,坏消息传得慢”实际上是信息传送延迟造成路由器的“误判”例如:R1 原本直接连接 NET-A(可直接交付),但 NET- A 突然出故障,变为不可达。R1 中关于 NET- A 不可达的更新还没有传递给连接着 R1 的路由 R2,此时 R2 仍以为可以通过 R1 达到 NET-A,便向 R1 发送 <NET-A,2,R2> 的路由表;R1 收到后以为 R2 可以到达 NET-A(其实已经不行了),便更新自己的路由表为 <NET-A,3,R2>,并将更新发送出去;R2 收到更新后将自己的路由表更新为 <NET-A,4,R1>,并将更新发送出去;如此来来回回直到两个路由器的路由表跳数都更新至 16 才确定了 NET- A 不可达。
为了克服 RIP 的缺点,我们便开发出了 OSPF 协议。
内部网关协议 OSPF
开放最短路径优先协议,即 OSPF(Open Shortest Path First),如上所述,是为克服 RIP 的缺点在 1989 年开发出来的。
OSPF 协议的特点
向本自治系统中所有路由器发送信息,这里使用的方法是洪泛法
发送的信息就是与本路由器相邻的所有路由器的链路状态,但这只是路由器所知道的部分信息“链路状态”就是说明本路由器都和哪些路由器相邻,以及该链路的“度量”(metric)。
只有当链路状态发生变化时,路由器才用洪泛法向所有路由器发送此信息
OSPF 的更新过程收敛得快,这是它非常重要的一个优点,也是它弥补 RIP 不足的关键。
链路状态数据库(link-state database)
由于各路由器之间频繁地交换链路状态信息,因此所有的路由器最终都能建立一个链路状态数据库。这个数据库实际上就是全网的拓扑结构图,它在全网范围内是一致的(这称为链路状态数据库的同步)。
同时,为了使 OSPF 能够用于规模很大的网络,OSPF 将一个自治系统再划分为若干个更小的范围,叫做区域。
划分区域后,利用洪泛法交换链路状态信息的范围局限于每一个区域而不是整个的自治系统。在一个区域内部的路由器只知道本区域的完整网络拓扑,而不知道其他区域的网络拓扑的情况。OSPF 使用层次结构的区域划分。在上层的区域叫做主干区域 (backbone area)。主干区域的标识符规定为 0.0.0.0,用来连通其他在下层的区域。
OSPF 还有一点与 RIP 不同,即 OSPF 不用 UDP 而是直接用 IP 数据报传送。OSPF 构成的数据报很短,这样做可减少路由信息的通信量。
OSPF 有五种分组类型下图简单说明了 OSPF 的五种分组类型以及它们所能完成的操作
外部网关协议 BGP
BGP 是不同自治系统的路由器之间交换路由信息的协议。默认为当前较新的版本 BGP-4。
互联网的规模太大,使得自治系统之间路由选择非常困难。对于自治系统之间的路由选择,要寻找最佳路由是很不现实的。因此,边界网关协议 BGP 只能是力求寻找一条能够到达目的网络且比较好的路由(不能兜圈子),而并非要寻找一条最佳路由。
BGP 发言人
每一个自治系统的管理员要选择至少一个路由器作为该自治系统的“BGP 发言人”(BGP speaker)。通过它与其他自治系统(中的 BGP 发言人)交换路由信息。
BGP 交换路由信息
一个 BGP 发言人与其他自治系统中的 BGP 发言人要交换路由信息,就要先建立 TCP 连接,然后在此连接上交换 BGP 报文以建立 BGP 会话 (session),利用 BGP 会话交换路由信息。使用 TCP 连接交换路由信息的两个 BGP 发言人,彼此成为对方的邻站(neighbor) 或对等站(peer)。
BGP 所交换的网络可达性的信息就是要到达某个网络所要经过的一系列 AS。当 BGP 发言人互相交换了网络可达性的信息后,各 BGP 发言人就根据所采用的策略从收到的路由信息中找出到达各 AS 的较好路由。
在众多路由选择协议中,BGP 是为数不多的使用 TCP 作为传输协议的路由选择协议。
BGP 有四种分组类型
打开 (OPEN) 报文,用来与相邻的另一个 BGP 发言人建立关系。
更新 (UPDATE) 报文,用来发送某一路由的信息,以及列出要撤消的多条路由。
保活 (KEEPALIVE) 报文,用来确认打开报文和周期性地证实邻站关系。
通知 (NOTIFICATION) 报文,用来发送检测到的差错。
路由器的构成
路由器大家肯定已经不陌生了,在 [概论]() 部分便提到它是实现“分组交换”的重要工具;本章前面也花了大篇幅讨论路由路径的选择。简而言之,路由器的工作就是将某个输入端口收到的分组,按照分组要去的目的地(即目的网络),把该分组从路由器的某个合适的输出端口转发给下一跳路由器。也就是我们所说的“转发分组”。
整个的路由器结构可划分为两大部分:
路由选择部分
分组转发部分
路由选择部分
也叫做控制部分,其核心构件是路由选择处理机
路由选择处理机的任务是根据所选定的路由选择协议(即上面提到的各种网关协议)构造出路由表,同时经常或定期地和相邻路由器交换路由信息而不断地更新和维护路由表。
分组转发部分
由三部分组成:
交换结构 (switching fabric):又称为交换组织,其作用是根据转发表 (forwarding table) 对分组进行处理
输入端口
输出端口
“转发”(forwarding)与“路由选择”(routing)的区别“转发”(forwarding) 就是路由器根据转发表将用户的 IP 数据报从合适的端口转发出去。“路由选择”(routing) 则是按照分布式算法,根据从各相邻路由器得到的关于网络拓扑的变化情况,动态地改变所选择的路由。
输入端口
路输入端口里面装有物理层、数据链路层和网络层的处理模块。数据链路层剥去帧首部和尾部后,将分组送到网络层的队列中排队等待处理。这会产生一定的时延。输入端口中的查找和转发功能在路由器的交换功能中是最重要的。
输出端口
输出端口里面装有物理层、数据链路层和网络层的处理模块。在网络层的处理模块中设有一个缓冲区(队列)。当交换结构传送过来的分组的速率超过输出链路的发送速率时,来不及发送的分组就必须暂时存放在这个队列中。数据链路层处理模块将分组加上链路层的首部和尾部,交给物理层后发送到外部线路。
交换结构
交换结构负责把分组从一个输入端口转移到某个合适的输出端口。
有三种常用的交换方法
通过存储器
通过总线
通过纵横交换结构(互联网络)
下一节会介绍 IPv6 和虚拟专用网等相关知识,later~