第5章 网络层
向传输层提供的服务
网路层的必要性:
- 相距较远的局域网之间的互联互通需要有结构化的统一的地址编排,而 MAC
地址是硬件地址,与位置无关,无法用来路由。 -
二层交换机不隔离广播域,网络规模较大时易形成广播风暴。
网络层设计目标: - 向上提供的服务应该独立于路由器技术。 - 应该向传输层屏蔽路由器的数量、类型和拓扑关系。 - 传输层可用的网络地址应该有一个统一的编址方案,甚至可以跨越 LAN 和 WAN。
争论: - 网络层提供面向连接的服务还是无连接的服务。
无连接服务/面向连接服务的实现
OSI 的网络层提供两种服务 - 面向连接:虚电路 - 无连接:数据报
数据报网络
所有的数据包都被独立地注入到网络中,并且每个数据包独立路由,不需要提前建立任何设置。
特点: - 如果分组的寻路是独立的,可以合理利用网路资源。 - 如果途中一个节点或一条链路发生故障,能给分组重选路由。 - 分组头需要包含地址字段,会增加开销。 - 各分组途经的路径可能不同,又肯出现先发后到现象。 - 分组必须有生存时间限制,当生存期满时,分组则被抛弃;避免在网络内死转。
虚电路网络
在发送数据包之前,必须首先建立起一条从源路由器到目标路由器之间的路径。
每个数据包包含一个标识符,指明了它属于哪一条虚电路。
特点: - 一条物理链路可以对应多条逻辑信道。 - 一条虚电路由各物理链路上的逻辑信道级联而成,占用了节点上的一条逻辑信道实际上就是占用了该节点上缓存器内的一个存储空间。 - 分组考逻辑信道号 (LCN) 选择路由;因 LCN 只有局部意义,所以减少了分组头标的开销和处理的复杂度。 - 能有效防止拥塞。
二者对比
问题 | 数据报网络 | 虚电路网络 |
---|---|---|
连接建立 | 不需要 | 需要 |
路由与转发 | 每个分组都包含源/目的地址,独立路由;路由器根据分组的目的地址进行路由转发 | 建立连接时需要路由,一旦建立逻辑通道,后续分组都根据分组头的逻辑通道号转发 |
路由器状态 | 不保留分组路由过的状态信息 | 路由器需要保留每个连接的状态信息,一遍后续分组的转发 |
分组路径与到达顺序 | 同一流的分组可能沿不同的路径到达目的端,有可能乱序 | 同一流的分组沿建立好的虚电路按序到达目的端 |
路由器故障影响 | 通过相邻节点的路由表更新,能迂回故障节点 | 故障路由器上所有的连接都将中断 |
服务质量 | 较难提供 | 易于在建立连接时在路径上的各个节点预留资源 |
拥塞控制 | 较难提供 | 在建立连接时,可根据网络的资源选择路径,避免网络拥塞 |
路由算法
网络层的主要功能是根据分组目的地址选择路径。
路由算法是网络层软件的一部分,负责确定一个入境数据包应该被发送到哪一条输出线路上。 - 对数据报,路由器针对每一个到达的数据包重新选择路径。 - 对虚电路,只有当建立一条新的虚电路时才需要做路由决策。
路由算法可以分成两大类: - 非自适应算法: - 不会根据当前测量或者估计的流量和拓扑结构,来调整它们的路由决策。 - 路由表固定,也称为静态路由。 - 简便、可靠、易行,适用于负荷稳定、拓扑结构变化不大的网络。 - 自适应算法: - 根据拓扑结构的变化、流量的变化情况改变路由决策。 - 路由表定时刷新,也称为动态路由。 - 算法复杂,会增加网络负担,但能根据网络状态动态调整路由表,改善网络的性能。
路由器上可以同时运行多个路由协议,当有到达同一个目的地址的多条路由时,可以根据优先级的大小,选择其中一个优先级数值最小的作为最优路由。
优化原则
最优化原则:如果路由器 J 在从路由器 I 到路由器 K 的最优路径上,那么从 J 到 K 的最优路径也必定遵循同样的路由。
汇集树:从所有的源到一个指定目标的最优路径的集合构成了一棵以目标节点为根的树。
所有路由算法的目标是为所有路由器找到这样的汇集树,并根据汇集树来转发数据包。
最短路径算法
Dijkstra
在全双工链路连接的网络上,每条链路的每个方向上都有一个与之相关的权值。两个节点之间一条路由的代价是它所经过的链路权值之和。这两个节点间的最佳路由为其所有可能路径中具有最小代价的那条路径。
标示路径长短的度量可以有:跳数、物理距离、带宽、平均流量、通信成本、平均延迟等。
eg. 整个图的状态(空格表示没有直接连接): | | A | B | C | D | E | F | |:-:|:-:|:-:|:-:|:-:|:-:|:-:| | A | - | 4 | | | 5 | | | B | 4 | - | 2 | | | 6 | | C | | 2 | - | 3 | 1 | | | D | | | 3 | - | | 7 | | E | 5 | | 1 | | - | 8 | | F | | 6 | | 7 | 8 | - |
求解从 A 出发到其他节点的最短路径。
初始化,除源节点 (A) 外,所有节点均为临时节点(表示未找到到该点的最短路径)。
除了与自身相邻的节点外,源节点到其余节点的距离都为无穷(实际编程时用一个很大的数表示)。目的节点 性质 路径 距离 B 临时 B 4 C 临时 \(\infty\) D 临时 \(\infty\) E 临时 E 5 F 临时 \(\infty\) 从所有临时节点中找到距离最短的 (B) ,将其变为永久节点(表示已经找到到该点的最短路径)。
从该节点 (B) 出发,寻找源节点到其余临时节点是否有更近的路径。目的节点 性质 路径 距离 B 永久 B 4 C 临时 B + C 6 D 临时 \(\infty\) E 临时 E 5 F 临时 B + F 10 重复上述过程,直到所有节点都成为永久节点。
目的节点 性质 路径 距离 B 永久 B 4 C 临时 B + C 6 D 临时 \(\infty\) E 永久 E 5 F 临时 B + F 10 目的节点 性质 路径 距离 B 永久 B 4 C 永久 B + C 6 D 临时 B + C + D 9 E 永久 E 5 F 临时 B + F 10 目的节点 性质 路径 距离 B 永久 B 4 C 永久 B + C 6 D 永久 B + C + D 9 E 永久 E 5 F 临时 B + F 10 目的节点 性质 路径 距离 B 永久 B 4 C 永久 B + C 6 D 永久 B + C + D 9 E 永久 E 5 F 永久 B + F 10
Bellman Ford
eg. 整个图的状态(空格表示没有直接连接): | | A | B | C | D | E | F | |:-:|:-:|:-:|:-:|:-:|:-:|:-:| | A | - | 4 | | | 5 | | | B | 4 | - | 2 | | | 6 | | C | | 2 | - | 3 | 1 | | | D | | | 3 | - | | 7 | | E | 5 | | 1 | | - | 8 | | F | | 6 | | 7 | 8 | - |
初始状态路由表中每两个路由器间的距离都为无穷。
第一次交换可以得到相邻节点的信息(距离和转发节点): | | A | B | C | D | E | F | |:-:| :-: | :-: | :-: | :-: | :-: | :-: | | A | - | 4/B | | | 5/E | | | B | 4/A | - | 2/C | | | 6/F | | C | | 2/B | - | 3/D | 1/E | | | D | | | 3/C | - | | 7/F | | E | 5/A | | 1/C | | - | 8/F | | F | | 6/B | | 7/D | 8/E | - |
其中列表示源节点,行表示目标节点,表格中的值为 距离/出口节点。
每一行为对应路由器中路由表存储的内容。第二次交换更新相邻节点当前具有的信息,从相邻节点处获得到达新节点的路径,并比较几条路径选出最短的:
| | A | B | C | D | E | F | |:-:| :-: | :-: | :-: | :-: | :-: | :-: | | A | - | 4/B | 6/B | | 5/E | 10/B | | B | 4/A | - | 2/C | 5/C | 3/C | 6/F | | C | 6/B | 2/B | - | 3/D | 1/E | 8/B | | D | | 5/C | 3/C | - | 4/C | 7/F | | E | 5/A | 3/C | 1/C | 4/C | - | 8/F | | F | 10/B | 6/B | 8/B | 7/D | 8/E | - |第三次交换,同上:
| | A | B | C | D | E | F | |:-:| :-: | :-: | :-: | :-: | :-: | :-: | | A | - | 4/B | 6/B | 9/B | 5/E | 10/B | | B | 4/A | - | 2/C | 5/C | 3/C | 6/F | | C | 6/B | 2/B | - | 3/D | 1/E | 8/B | | D | 9/C | 5/C | 3/C | - | 4/C | 7/F | | E | 5/A | 3/C | 1/C | 4/C | - | 8/F | | F | 10/B | 6/B | 8/B | 7/D | 8/E | - |至此路由表更新完成。
泛洪算法
将每一个数据包发送到除了该数据包到达的那条线路以外的每条出境线路。
为了抑制数据包泛滥,可以: -
在每个数据包的头中设置一个跳计数器,每经过一跳该计数器减一,当计数器到达
0 时就丢弃该数据包。
理想情况下,跳计数器的初始值应该等于从源端到接收方之间路径的长度。
如果发送方不知道该路径有多长,可以将计数器的初始值设置为最坏情况下的长度,即网络的直径。
- 每个源路由器在接收来自主机的数据包时填上一个序号,每个路由器为每个源路由器准备一张表,记录已经观察到的来自源路由器的序号。如果入境数据包在该表中,它就不能再被泛洪到其他路由器。
每个表使用一个计数器 k 作为参考,它表示直到 k 的所有序号都已经观察到了。
距离矢量 (Distance Vector) 路由算法
使用 Bellman Ford 算法。
- 每个路由器维护一张路由表,它以网络每个路由器为索引,并且每个路由器对应一个表项,包含:
- 到达该目标路由j器的首选出境线路;
- 到达该目标路由器的距离估计值
- 每个路由节点定期地向它的相邻路由节点交换路由表。
- 每个节点根据收到的相邻节点的路由信息更新自己的路由表,最终发现到每个目标的最佳估计值。
存在问腿
收敛:整个网络最佳路径寻找的过程。
对于距离矢量路由算法,它总是能收敛到正确的答案,但速度可能非常慢。它对好消息的反应非常迅速,而对于坏消息的反应异常迟缓。
无穷计算问题:当路由器 A 停机或 A、B 之间的链路断开时,路由器 B 认为可以从 C 到达 A,但实际上 C 的路线是经过 B 的,无法到达 A。逐渐地,所有的路由器都会趋向无穷大,但是所需的交换次数依赖于代表无穷大的数值。
解决方案:水平分割算法。
防止路由器向邻居返回一个从该邻居获得的最佳路径。
链路状态 (Link State) 路由算法
也叫最短路径优先 (SPF) 算法。
发现邻居节点,了解其网络地址。
当一个路由器启动时,在每一条点到点线路上发送一个特殊的 HELLO 数据包。线路另一端的路由器返回一个应答说明自己是谁。
对于广播 LAN,可以视作一个新的人造节点,LAN 上的一个指定路由器被选中替代该节点运行路由协议。设置到每个邻居节点的距离或成本度量值。
常用的选择是使成本与链路带宽成反比。
如果网络在地理上分散,链路的延迟可作为成本的组成部分(发送 ECHO 数据包获得延迟估算值)。构造一个包含所有刚刚获知的链路信息包。
该数据包的内容首先是发送方的标识符,接着使一个序号和年龄,以及一个邻居列表。对于每个邻居,同时要给出到这个邻居的延迟。
可以周期性地创建数据包,也可以每当发生某些重要的使其时才创建数据包。将这个包发送给所有其他的路由器,并接收来自所有其他路由器的信息包。
基本思路是使用泛洪算法将链路状态数据包分发给所有路由器。
每个数据包包含一个序号,序号随着每一个新数据包发出而逐一递增。
序号之后包含一个年龄字段,每秒中将年龄减一,为 0 时丢弃该数据包。计算出到每个其他路由器的最短路径。
在路由器本地运行 Dijkstra 算法。
与距离矢量算法比较
- 需要更多的内存和计算,在大型网络中运行存在问题。
- 没有慢收敛问题。
- 可扩展性好,可靠。
层次路由 (Hierarchical Routing)
路由表项大小与网络规模成正比,当网络规模变大时,路由表也变大,消耗更多的内存、带宽、查找时间。
采用层次化路由解决问题: - 将网络分区域,区域内的路由器只负责本区域内的分组转发,目的地址不在本区域内的分组都发给指定的区域路由器(边界路由器)去处理。 - 路由信息的交换旨在域内进行,路由器内部需存储的路由表项大大减少。 - 对于大型网络,可以分成多层次结构,每一层次的边界路由器相互之间交流路由信息。
缺点:选择的路由可能不是最佳的,增加了路径长度。
对于一个包含 N 个路由器的网络,最优的层数是 lnN,每个路由器所需的路由表项是 elnN 个
拥塞控制算法
拥塞:当大量分组进入通信子网,超出了网络的处理能力时,就会引起网络局部或整体性能下降。 - 路由器的队列溢出,分组丢失。 - 后果:使许多分组重传;导致更多的业务量,直至崩溃。 - 原因:路由器的处理速度、存储空间、带宽不匹配,网络负载的不平衡。
拥塞控制: - 网络负载的不均衡。 - 是全局问题,涉及的节点包括主机、路由器。 - 由网络层和传输层共同承担。
流量控制: - 接收端或所在网络的接受速度小于发送端的发送速度。 - 是局部问题,只涉及收发两端。
指示网络拥塞的参数: - 分组丢失率 - 平均队列长度 - 分组重传率 - 评价分组延时
开环控制
基于良好的设计,进行业务量整形。
漏桶算法
无论流入漏桶的水的速率多大,只要漏桶中还有水,那么水流出桶的速率为恒定速率
R;如果桶内没有水,则流出桶的速率降为 0。
一旦桶内的水达到桶的容量
B,任何额外进入桶的水都会沿着桶侧分流,最终流失。
每个主机在连接到网络的接口中包含一个漏桶。为了向网络发送数据包,漏桶必须由空余。
如果桶满时有数据包到达,那么该数据包必须排入队列等待漏桶空出来时再接纳,或者被丢弃。
令牌桶算法
水龙头向水桶中灌水。水龙头速率为 R,水桶容量为 B。
为了发送一个数据包,必须能够从桶内掏出水或令牌。桶内只能积累固定数量的令牌,即
B。
如果桶是空的,必须等待更多的令牌到达才能发送另一个数据包。
最大突发长度:清空令牌桶所需时间。
假设突发长度为 S 秒,最大输出率为 M B/s,令牌桶的容量为 B
字节,令牌到达率为 R B/s。
则 \(B + RS = MS\)。
闭环控制
基于反馈概念。
- 检测到拥塞时,就发一个分组给源端,或向所有主机广播。
- 在每个分组头中保留一个位或域,当拥塞超过一定值时,路由器就在该位或域上填上拥塞信息通知网络节点。
- 由主机或路由器发送询问分组查询拥塞情况。
虚电路中的拥塞控制
采用准入控制 (Admission Control) 的三种策略: -
一旦出现拥塞的信号,就不再创建任何虚电路,直至拥塞解除。 -
允许建立新的虚电路,但要仔细选择路由,以便所有新的虚电路绕过拥塞的区域。
- 在虚电路建立时,子网与主机对所需服务质量进行协商。
若不能满足主机最低要求,则拒绝建立连接;反之则保留连接所需的多种资源,避免拥塞发生。
数据报中的拥塞控制
抑制分组 (Choke Packet):
每个路由器监视本节点的资源利用情况,若某个方向的资源利用率超过一定的门限,则该路由器向有关源节点发送抑制分组,源节点相应减少发往该方向的数据量,直至该方向的拥塞解除。随机早期检测 (RED):
路由器维护一个运行队列长度的平均值。当某条链路上的平均队列长度超过某个阈值时,该链路就被认为即将拥塞,路由器随机丢弃一小部分数据包。
服务质量
从一个源端发到一个接收方的数据包流称为一个流。 -
面向连接网络:一个连接上的全部数据包。
- 无连接网络:从一个进程发到另一个进程的所有数据包。
每个流要求的服务质量 (QoS) 可由四个主要参数来表示: - 带宽 - 延迟 - 抖动:延迟的变化或数据包到达时间的变化 - 丢失
网络互连
网络如何不同
项目 | 不同处 |
---|---|
提供的服务 | 无连接与面向连接 |
寻址 | 不同大小,扁平或层次 |
广播 | 提供或缺乏 |
数据包尺寸 | 每个网络有自己的最大尺寸 |
有序性 | 有序和无序传递 |
服务质量 | 提供或缺乏,种类不同 |
可靠性 | 丢包的不同级别 |
安全性 | 隐私规则,加密等 |
参数 | 不同超时值,流规范等 |
记账 | 按连接时间、包数、字节数或不收费 |
网络如何连接
源端接受来自传输层的数据,并生成一个带有公共网络层的头(IP头)。
网络层的头包含了最终的接收方地址,这个地址用来确定数据包应该通过第一个路由器发送。数据包被封装在 802.11 帧内,帧的目标地址是第一个路由器的地址。
在路由器,数据包从帧的数据字段中被提取出来,802.11 帧头被丢弃。
路由器检查数据包的 IP 地址,并依此决定将数据包转发给第二个路由器。第一个路由器建立一条到第二个路由器的 MPLS 虚电路,并且用 MPLS 报头封装该数据包。
在远端,MPLS 头被丢弃,并在此检查 IP 地址以便寻找下一跳网络层。
互联网路由
采用两级路由算法。
在每个网络中,使用一个域内或内部网关协议进行路由。
为了让数据包跨越构成互联网的网络,需要域间或外部网关协议。
网络可能全部使用不同的域内协议,但必须使用相同的域间协议。
在 Internet 上,域间路由协议称为边界网关协议 (BGP)。
自洽系统 (AS):每个网络都独立于所有其他网络运行。
数据包分段
路径最大传输单元 (MTU)。
透明分段
当一个超大的数据包到达 G1,该路由器将它分割成多个段;每个段都发向同样的出口路由器 G2,在这里这些段被重新组合起来。
问题: - 每个分段中必须提供一个计数字段或者一个数据包结束标志位。 - 所有数据包必须经过同一个出口路由器才能重组,路由受到限制,损失一些性能。 - 路由器需要做大量的工作。
不透明分段
IP 采用这种方式工作。
给每个段一个数据包序号、一个数据包内的绝对字节偏移量和一个指明是否到达数据包末尾的标志位。段到达目的地后被放置在一个缓冲区中以便重组
问题: - 增加头开销。 - 数据包的丢失概率增加。
路径 MTU 发现
每个 IP
数据包发出时在头设置一个比特,指示不允许对该数据包实施分段操作。
如果一个路由器接收的数据包太大,它就生成一个报错数据包并发给源端,然后丢弃该数据包。
当源端收到报错数据包,它就使用报错数据包携带的信息重新将出错数据包分段,每个段足够小到报错路由器能处理。
如果沿路径前进又遇到一个 MTU 更小的路由器,则重复上述过程。
Internet 的网络层
Internet 是一个基于 IP 的分组交换网络,根据 IP 协议信息(主要是目的地址)来转发分组。
IP 提供尽力传送 (best-effort) 服务 - 不可靠:无连接,无确认;不保证分组可靠到达目的地,可能出现分组的丢失。 - 乱序:分组可能不是按照发送顺序到达目的地。
所有接入到 Internet 的节点都必须运行 IP 协议。
- 向上,可以互联采用各种通信技术的网络; -
向下,可以承载各种类型网络业务。
IPv4 协议
每个 IP 数据报包含两部分,一个头和一个正文(有效净荷)。头由一个20字节的定长部分和一个可选的变长部分组成。
IP 数据报头依次有: - 版本 (Version):4-bit
记录数据报属于协议的哪个版本。
IPv4 填 4,IPv6 填 6。
IHL:4-bit
指明头的长度。
IHL 的最小值为 5,表明头没有可选项;最大值为 15,把头的长度限制为最大 60 字节。区分服务 (Differentiated services):8-bit
- 最初称为服务类型 (Type of service),包含 6
位。
其中 3 位表示优先级,3 位代表主机最关心的是延迟、吞吐量或可靠性中的哪一种。 - 现在,前 6 位用来标记数据包的服务类别,后 2 位用来携带显示拥塞通知信息。
- 最初称为服务类型 (Type of service),包含 6
位。
总长度 (Total length):16-bit
描述数据报总长度,包括头和数据。
最大长度是 65535 个字节。标识 (Indentification):16-bit
用于让目标主机确定一个新到达的分段属于哪一个数据报。
同一个数据报的所有段包含相同的标识值。莫名其妙空了 1 位。
DF (Don't Fragment):1-bit
不分段标志位,不允许路由器分割该数据报。
可用于发现路径 MTU 过程中。MF (More Fragments):1-bit
更多的段标志位,使接收方知道什么时候一个数据报的所有分段都到达了。
除了最后一个段以外其他所有段都要设置这一位。分段偏移量 (Fragment offset):13-bit
指明了该段在当前数据报中的位置。
除了数据报的最后一个段以外,其他所有段的长度必须是 8 字节的倍数。
每个数据报的第一个段的偏移量为 0,后面的段为前面所有段数据总字节数除以 8。
由于该字段有 13 位,所以每个数据报最多有 8192 个段。生存期 (TTL):8-bit
用于限制数据包生存期的计数器。
单位为秒,故最大生存期为 255 秒。
在每一跳上该计数器递减,而且当数据报在一台路由器上排队时间较长时,该计数器必须多倍递减。递减到 0 时,该数据包就被丢弃。协议 (Protocol):8-bit
表示高层协议类型,指明该将数据包交给哪个传输进程(如 TCP、UDP)。
协议的编号在整个 Internet 是全球统一的。头校验和 (Header checksum):16-bit
- 计算校验和:先将头校验和字段置为 0,然后将整个 IP 头以 16
位为单位相加求和,溢出的部分加回低位,再将结果取反,得到的数据填入头校验和字段。
- 验算:当数据到达时,同样将整个 IP 头以 16 位为单位相加求和,溢出的部分加回低位后取反,得到的结果如果是 0 则通过校验。
- 计算校验和:先将头校验和字段置为 0,然后将整个 IP 头以 16
位为单位相加求和,溢出的部分加回低位,再将结果取反,得到的数据填入头校验和字段。
源地址 (Source address):32-bit
表示源网络接口的 IP 地址。目标地址 (Destination address):32-bit
表示目标网络接口的 IP 地址。选项 (Options):具有可变长度,最多为 40 字节。
用于包含一些原设计中没有出现的信息,同时也用于将数据报头的长度填充到 4 字节的整数倍。- 安全 (Security):指明了信息的秘密程度。
- 严格源路由 (Strict source
routing):给出了从源到目标的完整路径。
形式是一系列 IP 地址。数据报必须严格遵循这条路线向前传输。 - 松散源路由 (Loose source
routing):要求数据包穿越所指定的路由器列表。
要求按照表中的顺序前进,但是允许在途中经过其他路由器。 - 记录路由 (Record route):使沿途每个路由器附上自己的出口 IP
地址。
便于系统管理员跟踪路由算法中的错误。
最多只记录 9 个 IP 地址。 - 时间戳 (Timestamp):使沿途每个路由器附上自己的 IP 地址和 32 位时间戳。
IPv4 地址
Internet 上的 IP 地址由 IANA (互联网编号分配机构) 负责分配和管理。
IP 地址用于标识主机或网络设备(如路由器)的网络层地址,可用在 IP
数据包的 Source address 和 Destination address 字段,路由器根据目的 IP
地址转发分组。
注意,一个 IP
地址并不真正指向一台主机,而是指向一个网络接口。如果一台主机在两个网络上,它必须有两个
IP 地址。
IP 地址具有层次性,每个 32 位地址由高位的可变长网络(前缀)和低位的主机两部分数据组成。
IP 地址的书写方式是点分十进制表示法。
按此格式,4个字节中的每个写成十进制,取值范围从 0 到 255。
按照惯例,网络地址的书写格式是前缀 IP
地址后跟一个斜线,斜线后是网络部分的位长度。
eg. 32位十六进制地址 80D00297
写成
128.208.2.151
。假设前缀包含 \(2^8\) 个地址,即网络部分包含 \(32 - 8 = 24\) 位,网络地址写成
128.208.0.0/24
。
前缀/子网
同一网络上的所有主机的前缀是相同的。
简单地由长度表述。
如 24 位前缀表示为/24
。前缀长度相当于网络部分中 1 的二进制掩码,称为子网掩码。
如 24 位前缀对应的子网掩码为255.255.255.0
。
子网划分:在内部将一个网络块分成几个部分供多个内部网络,但对外部世界仍然像单个网络一样。
分割一个大型网络得到的一系列结果网络,称作子网。
当数据包到达时,路由器会查看该数据包的目标地址,并检查它属于哪个子网。
具体操作:路由器把数据包的目标地址与每个子网的掩码进行 AND
操作,看结果是否对应于某个前缀。
IP 地址和 MAC 地址
- IP 地址在整个网络中标识不同的节点,而 MAC 地址在链路或者局域网内标识不同的节点。
- IP 地址包含有网络号(前缀),因此节点配置的 IP 地址与其所在的网络相关;而 MAC 地址与节点位置无关,因此一般事先固化在网络设备中。
- 数据帧在链路上传送使用 MAC 地址,源 MAC 地址为发送主机的网络接口的 MAC 地址,而目的 MAC 地址为同一链路上接收主机的网络接口的 MAC 地址。
- IP 分组在 Internet 中传输使用 IP 地址,源 IP 地址为发送 IP 分组主机的 IP 地址,而目的 IP 地址为接收 IP 分组主机的 IP 地址。
- 数据帧在不同链路上传输时,源和目的 MAC 地址变化,而源和目的 IP 地址不变。
区别: | MAC | IP | | --- | -- | | 物理地址(数据链路层地址) |
逻辑地址(网络层地址) | | 局部意义 | 全局意义 | | 随机获得 | 上级分配 |
| 48位(如 08:00:39:00:2f:c3
) | 32位(如
202.38.75.11
)|
IP 寻址
路由表与转发表
路由表 (Routing Table)
路由器根据分组的目的 IP 地址查找路由表,找出分组的下一个中继点。
每一个路由器都有一个路由表。路由表每个表项至少包含两个内容:
- 目的网络(网络号或前缀)/目的主机的地址
- 下一跳地址
在路由器上,一般通过路由协议来动态建立和维护路由表。
转发表 (Forwarding Table)
与路由表相比,转发表包含了更多的信息。
包括包含目的网络的网络号/目的户籍的地址、输出端口,以及一些 MAC 地址等信息。每个节点上都有转发表,节点根据转发表来转发分组。
主机上的转发表一般是手动或者通过 DHCP 等动态配置。路由表是网络设备(通常是路由器)上的数据结构。
转发表是路由表的实际应用,是根据路由表中的信息生成的用于实际数据包转发的表格。
无类域间路由 (CIDR)
路由聚合:把多个小前缀的地址块合并成一个大前缀的地址块。
由此产生的较大前缀地址块有时称为超网。
无类域间路由:同样一个 IP 地址,一台路由器把它当成 /22 的一部分对待(其中包含 \(2^{10}\) 个地址),而另一台路由器把它当作一个更大的 /20 的一部分对待(其中包含 \(2^{12}\) 个地址);每个路由器有相应的前缀信息。
分配地址时: - \(2^n\)个地址的块必须位于 \(2^n\) 的字节边界上,即地址的后 n 位为 0。 -
先分配所需地址更多的地址块。 -
确定子网掩码:首地址和末地址的前几位是相同的。
分配 \(2^n\) 个地址,则子网掩码的长度是
\(32 - n\) - 全 0 和 全 1
的主机号地址一般不用于标识主机或路由器接口。
eg.
有一块地址从 194.24.0.0
开始,可用的 IP 地址有 \(2^{13} = 8192\) 个,即该地址块到
194.24.31.255
(后 13 位为 1)。
假设 A 需要 \(2048 = 2^{11}\) 个地址,B
需要 \(1024 = 2^{10}\) 个地址, C 需要
\(4096 = 2^{12}\) 个地址。 | 区域 |
第一个地址 | 最后一个地址 | 地址数 | 前缀 | | --- | ---------- |
----------- | ------ | ---- | | C | 194.24.0.0
|
194.24.15.255
| 4096 | 194.24.0.0/20
| | A |
194.24.16.0
| 194.24.23.255
| 2048 |
194.24.16.0/21
| | B | 194.24.24.0
|
194.24.27.255
| 1024 | 194.24.24.0/22
| | 空余
| 194.24.28.0
| 194.24.31.255
| 1024 |
194.24.28.0/22
|
A、B、C 三个网络具有一个聚合前缀 192.24.0.0/19
。
前缀允许重叠,规则是数据包按最具体的路由的方向发送,即具有最少 IP 地址的最长匹配前缀。
CIDR 的工作原理:
当一个数据包到达时,路由器扫描路由表以确定目的地是否在前缀的地址块内。
有可能多个具有不同前缀的表项得到匹配,在这种情况下,使用具有最长前缀的表项。
例如有一个匹配 /20
掩码的表项,同时还有一个匹配
/24
掩码的表项,则使用 /24
表项来查询数据包的出境线路。
分类和特殊寻址
分类寻址:IP 地址被分为以下五个类别。 | 类别 |
位数划分 | 主机地址范围 | 网络数量 | 每个网络可容纳主机数 | | ---- |
------- | ----------- | -------- | ----------- | | A 类 |
最高位,0;
网络号,随后 7 位;
主机号,最后 24 位 |
1.0.0.0
到127.255.255.255
| \(2^7 -2\) | \(2^{24} - 2\) | | B 类 |
最高两位,10;
网络号,随后 14 位;
主机号,最后 16 位 |
128.0.0.0
到191.255.255.255
| \(2^{14} -2\) | \(2^{16} - 2\) | | C 类 |
最高三位,110;
网络号,随后 21 位;
主机号,最后 8 位 |
192.0.0.0
到223.255.255.255
| \(2^{21} - 2\) | \(2^8 -2\) | | D 类 |
最高四位,1110;
是组播地址 | 224.0.0.0
到239.255.255.255
| | | | E 类 |
最高四位,1111;
是保留地址 | 240.255.255.255
到255.255.255.255
| | |
具有特殊含义的地址: - IP 地址 0.0.0.0
/ 全 0 的 IP
地址:指当前网络/当前主机。
这个地址允许机器在不知道网络号的情况下访问自己所在的网络(但它们必须知道子网掩码包括多少个
0)。
IP 地址
255.255.255.255
/ 全 1 的 IP 地址:标识指定网络的所有主机。
用于广播。127.xx.yy.zz
形式的地址:保留给回环测试用。
发送到该地址的数据包并没有被真正放在线路上,它们如同入境数据包一样在本地处理。
NAT
网路地址转换 (NAT):实现网络内多个主机共享一个全局的
IP 地址。
基本思想:
ISP (互联网服务提供商) 为每个家庭或公司分配一个(或少量)IP 地址,用这个
IP 地址来传输 Internet 流量。
在客户网络内部,每台计算机有唯一的 IP
地址,该地址主要用来路由内部流量。
当一个数据包需要离开客户网络,需要执行一个地址转换,把唯一的内部 IP
地址转换成共享的公共 IP 地址。
内部网地址有: - 10.0.0.0
- 10.255.255.255
- 172.16.0.0
- 172.31.255.255
-
192.168.0.0
- 192.168.255.255
NAT 技术可以在路由器、防火墙上实现内外地址的翻译工作。
实现方式: - 静态 NAT:
内部地址与外部 IP 地址总是一一对应的。
如 192.168.32.10
(内部地址) 总是翻译成
213.18.123.110
(外部地址)。
动态 NAT:
一组全局 IP 地址与内部 IP 地址对应。
如192.168.32.10
总是翻译成213.18.123.100
到213.18.123.150
范围内第一个可用的 IP 地址。网络地址端口转换 (NAPT):
也是一种动态方式,用一个全局 IP 地址加上端口号实现与内部 IP 地址的翻译。- 内部主机访问互联网:
- 假设公共 IP 地址为
203.0.113.1
。 - 内部主机 A 要访问一个网站,于是发起一个请求到该网站的服务器。
- NAPT 检测到主机 A 的请求,将主机 A 的内部 IP 地址
192.168.1.1
和一个唯一的端口号5001
关联起来。 - NAPT 修改主机 A 的请求,将源 IP 地址改为
203.0.113.1
,源端口号改为5001
,然后将修改后的请求发送到互联网。
- 假设公共 IP 地址为
- 互联网服务器响应:
- 互联网服务器收到请求后,将响应发送回 203.0.113.1:5001。
- NAPT 根据会话表确定这个响应该被转发给内部主机 A。
- NAPT 修改响应,将目标 IP 地址和端口号还原为主机 A 的内部 IP 地址和端口号,然后将响应发送给主机 A。
- 内部主机访问互联网:
IPv6 协议
IPv6 头依次有: - 版本 (Version):4-bit
区分服务 (Differentiated services):8-bit
使用方式与 IPv4 同名字段一样。流标签 (Flow label):20-bit
为源端和接收方提供了一种建立伪连接的方式,即源端和接收方把一组具有同样需求并希望网络同等对待的数据包打赏标记。
每个流由源地址、目标地址和流编号来指定。
流标签的选取最好随机,便于路由器对它们进行哈希处理。有效荷载长度 (Payload length):16-bit
与 IPv4 中的总长度字段,但是 40 字节的头不作为长度的一部分。下一个头 (Next header):8-bit
指明了当前头之后还有哪种扩展头,如果有的话。
如果当前的头是最后一个 IP 头,那么该字段指定了该数据包将被传递给哪个传输协议处理(如 TCP、UDP)。跳数限制 (Hop linit):8-bit
与 IPv4 中的 TTL 字段类似,但不再是以秒为单位。源地址 (Source address):16 字节
目标地址 (Destnation address):16 字节
扩展头
头标值 | 对应扩展头 |
---|---|
0 | 中继点选项 (Hop-by-hop options) |
4 | IP |
6 | TCP |
17 | UDP |
43 | 寻路头标 (Routing) |
44 | 报片头标 (Fragment) |
45 | IDRP (互联域路由协议) |
46 | RSVP (网络通信协议,用于在IP网络中为数据流提供服务质量保证) |
50 | 封装化安全净荷 (Encryption Security Payload) |
51 | 认证头标 (Authentication) |
58 | ICMP (互联网控制报文协议) |
59 | 无下一个头标 |
60 | 信宿选项头标 |
IPv6 地址
16 个字节被分成 8 组来书写,每一组 4
个十六进制数字,组之间用冒号隔开。
如 8000:0000:0000:0000:0123:4567:89AB:CDEF
优化方式: - 在一个组内可以省略前导 0。 - 一组或多组 0
可以用一对冒号来替代。
故上述地址可以写成 8000::123:4567:89AB:CDEF
地址前缀表示:IPv6 地址/前缀长度
与 IPv4: - 兼容 IPv4 的 IPv6 地址:
IPv4 地址写成一对冒号再加上老式的点分十进制数。
如 ::192.31.20.46
- 映射 IPv4 的 IPv6 地址:
将 80 位 0 和随后的 16 位 1 组成的前缀置于 IPv4 地址之前。
如 ::FFFF:192.31.20.46
- IPv6 默认情况下禁用 IPv4
兼容地址。
IPv6 地址即插即用。
工作原理:自动将 48 位 MAC 地址扩展成 64 位,再组合一个 64 位的 IPv6
网络前缀,组成一个 IPv6 地址。
IPv4 的 64 位接口地址可以根据 MAC 地址自动生成,属于 IEEE EUI-64
标准。
分类
单播地址
- 可聚类全局地址
2000::/3
- 3 位前缀:001
- 13 位顶级聚类:TLA
- 32 位次级聚类:NLA
- 16 位网点级聚类:SLA
- 64 位接口标识符:Interface ID
- 本地(局域)单播地址
- 链路局域地址
FE80::/64
包含 64 位前缀和之后的 64 位接口标识符。
用于本地链路上各个相邻接口之间的发现、IPv6 地址自动配置和通信。
包含链路局域地址的分组不会被路由器转发。 - 网点局域地址
FEC0::/48
包含 48 位前缀,16 位子网 ID,64 位接口标识符。
只可以再一个网点内使用。
- 链路局域地址
- 可聚类全局地址
未指明地址
0:0:0:0:0:0:0:0
或表示为::
只能作为尚未获得正式地址的主机的源地址使用,不能将该地址用作信宿地址。环回地址
0:0:0:0:0:0:0:1
组播地址
前 8 位为 1,4 位标志位(000T,T=0 表示永久性组地址),4 位区域位,112 位 Group ID。任播地址:从单薄地址空间中分配
前 n 位为子网前缀,后 128-n 位为 0。
Internet 控制协议
ICMP
Internet 控制消息协议 (ICMP):当路由器在处理一个数据包的过程中发生了意外,通过 ICMP 向数据包的源端报告有关事件。
ICMP 定义了两类报文,差错报文和信息报文: - 差错报文 - 源抑制 (Source quench):抑制发送过多分组的主机。 - 超时 (Time exceeded):分组的 TTL 为 0,或被分片的报文在一定时间内没有收齐。 - 信宿不可达 (Destination unreachable):报告子网、主机不能定位的信宿。 - 重定向 (Redirect):数据包看起来被错误地路由。 - 参数问题 (Parameter problem):分组头参数出错。
- 信息报文
- 回音请求/响应 (Echo request/reply)
- 地址掩码请求/响应 (Address mask request/reply)
- 路由器发现 (Router discovery)
ICMP 的直接应用: - Ping Progarm 用于测试主机的可到达性。
Ping 程序采用 ICMP
的回音请求/响应报文,通过向信宿发送回音请求,返回响应报文,来测试目的主机的可达性。
- Traceroute
通过发送递增的 TTL 值的回音报文,测试目的主机沿途经过的路由器地址。
ARP
地址解析协议 (ARP):解析 IP 地址与 MAC 地址的关系。
- 目的 IP 地址所对应的主机和发送主机在同一个网络内。
每个主机都有 ARP 缓存,用于存放一些 IP 地址与 MAC 地址的对应关系。
通过 ARP 缓存可以减少频繁的 ARP 操作,从而减少网络开销、提高性能。当分组到达时,主机根据分组头上的目的 IP 地址查阅自己的 ARP 缓存;如果没有查到,就向广播地址发送 ARP 请求。
被请求的 IP 地址所对应的主机返回一个 ARP 响应。
主机收到响应后,就可发送数据帧,并将该 IP 地址与 MAC 地址对存放在 ARP 缓存中。
- 目的 IP 地址所对应的主机和发送主机在两个不同的网络内。
发送主机通过查找转发表得到下一跳节点的 IP 地址(第一跳路由器),对该 IP 地址执行上述 ARP 过程,然后发送数据。
发送主机也可以直接用目的 IP 地址执行 ARP,路由器(而不是目的主机)响应该 ARP 请求。
这种解决方式叫 ARP 代理。第一跳路由器查找转发表得到第二跳路由器的 IP 地址,对该 IP 地址执行 ARP 过程,然后发送数据。
\(\cdots\)
目的网络的路由器查找转发表知道目的节点和自己在同一个网络中,对目的 IP 地址执行 ARP 过程,然后将数据发送到目的节点。ARP 过程被限制在同一个网络内,始终是查找转发表得到转发下一跳节点的 IP 地址,然后对该 IP 地址做 ARP。
在数据传输频繁时,ARP 缓存表中一般有对应的表项,节点间不需要交互 ARP 过程。
反向 ARP (RARP):用于查找物理地址所对应的 IP 地址。
帧格式为 802.3 帧格式
前导码 (Preamble):8 字节
目标 MAC 地址:6 字节
源 MAC 地址:6 字节
帧类型 (Type):2 字节
ARP 请求及响应为 0x0806数据:
- 硬件类型:2 字节。指发送者的网络接口类型,如以太网为 1。
- 上层协议类型:2 字节。指发送者所采用的网络层协议类型,如 IP 协议为 0x0800。
- MAC 地址长度:1 字节
- IP 地址长度:1 字节
- 操作类型:2 字节
- ARP 请求:1
- ARP 响应:2
- RARP 请求:3
- RARP 响应:4
- 源 MAC 地址:6 字节
- 源 IP 地址:4 字节
- 目的 MAC 地址:6 字节
- 目的 IP 地址:4 字节
填充
校验和:4 字节,CRC。
DHCP
IP 地址的配置方式有: - 手动配置 - 拨号用户通过 PPP 协议分配 - 基于动态主机配置协议 (DHCP) 的配置
DHCP 过程: - 客户端广播 DHCPDISCOVER
消息。
源 IP 地址为 0.0.0.0
,目的 IP 地址为
255.255.255.255
。
使用 MAC 地址来标识客户端。
DHCP 服务器回应
DHCPOFFER
消息给客户端,其中包含分配的 IP 地址、租用期限和其他配置参数。客户端选择一个 DHCP 服务器并在整个网络上广播
DHCPREQUEST
消息,告诉其他 DHCP 服务器它选择哪个服务器提供的 IP 地址。选定的服务器给客户端回应
DHCPACK
,其中包含配置参数。客户端接收
DHCPACK
,对参数进行最后的检查,然后开始使用分配的 IP 地址。客户端可以通过向
DHCPRELEASE
消息来释放对 IP 地址的租用,其中包含有客户端的 MAC 地址和租用 IP 地址。
Internet 路由协议
自洽系统 (Autonomous System): -
内部管理由独立管理机构完成的一组网关和网络,整个网络由一个(或几个)核心网关与
Internet 相连。 -
交换路由信息的两个网关如果属于不同的自洽系统,则称这两个网关是外部相邻;
如果同属于一个自洽系统,则称为内部相邻。
外部网关协议
(EGP):用于外部相邻的网关之间交换路由信息,也叫域间路由。(BGP)
内部网关协议
(IGP):用于内部相邻的网关之间交换路由信息,也叫域内路由。(RIP,
OSPF)
RIP
路由信息协议 (RIP):一种内部网关协议。
特点: - 采用距离矢量路由算法。
使用跳数 (hop count),即路由器到目的地的路径中经过的路由器数量,作为衡量路径长度的单位。
通过 Split Horizon 机制防止路由环路的产生。
即路由器不会将它已经学到的路由信息再发送回相同的接口。路由器周期性地广播它们的整个路由表,以便告知其他路由器当前网络的可达性。
该广播过程通过 RIP 更新报文完成。使用 Hold-down Timer 来减少路由表更新引起的不稳定。
当路由器检测到某个网络不可达时,它启动 Hold-down Timer,阻止对该网络的更新。使用 UDP 在端口 520 上进行发送和接收路由信息。
OSPF
开放最短路径优先 (OSFP):一种内部网关协议。
借鉴了中间系统到中间系统 (IS-IS)
协议,该协议已经成为一个 ISO 标准。
特点: - 是一种链路状态协议,采用最短路径优先算法 (SPF)。
使用 IP 作为底层传输协议,其中 IP 头的协议字段为 89,表示该数据包用于传输 OSPF 信息。
只有当发生改变时才更新路由表.
要求从每个 LAN 中选举一台路由器作为指定路由器 (DR)。
指定路由器与本 LAN 上所有其他路由器是邻接的,并且与它们交换信息。
有一台备份的指定路由器 (BDR) 总是保持最新的状态数据。使用组播地址来发送 Hello 消息和路由更新。
OSPFv2 使用组播地址224.0.05
(所有 OSPF 路由器)和224.0.06
(DR 和 BDR 选举)
OSPFv3 使用组播地址FF02::5
(所有 OSPF 路由器)和FF02::6
(DR 和 BDR 选举)
5 种数据包: | 消息类型 | 描述 | | ------- | ----- | | Hello | 用来发现所有的邻居 | | Link State Update | 提供发送者到其邻居的成本 | | Link State Ack | 对链路状态更新消息的确认 | | Database Description | 声明发送者的链路状态更新情况 | | Link State Request | 请求链路状态信息 |
BGP
边界网关协议 (BGP):一种外部网关协议。
特点: - 路径矢量协议 (path vector protocol)
升级版距离矢量协议。
根据政策而不是最小距离来选择路由。
路由器不仅维护到每个目的地的成本,而且跟踪所使用的路径。
使用 TCP 协议来保障可靠性,使用端口 179。
使用增量和触发式更新方式。
当网络拓扑发生变化时,只有受到触发事件影响的路由信息才会被更新。定期发送保持活动消息以验证 TCP 连接的连通性。
使用丰富的指标(路径矢量/属性)来描述和选择路由。
包括 AS 路径、AS 路径长度、下一跳等信息。设计用于大规模网络,如 Internet。
路由协议分类与协议栈
路由协议分类: - 基于路由信息流的分类
- 内部网关协议 (IGP) / 域内协议 - RIP - OSPF - IS-IS - 外部网关协议 (EGP) / 域间协议 - BGP
协议栈: | 层 | 协议 | | | | | :-: | :-: | :-: | :-: | :-: | | 应用层 | BGP | RIP | | | | 传输层 | TCP | UDP | OSPF | | | 网络层 | IP | IP | IP | IS-IS | | 链路层 | | | | | | 物理层 | | | | |
Internet 组播
单播 (unicast):1 对 1
组播 (multicast):1 对多,多对多
IP 采用 D 类地址作为组播地址。
每个 D 类地址代表一组主机,共有 28 位可用来标识小组。Internet 支持两类组地址:永久组地址和临时组地址。
永久组地址:
IP 地址
224.0.0.0/24
范围内的地址保留用作本地网络组播。
这种情况下不需要路由协议的支持,带有一个组播地址的数据包被简单广播到局域网上。
局域网上的所有主机接收广播数据包,只有属于组成员的主机对该数据包进行处理。224.0.0.1
:LAN 上的全部系统224.0.0.2
:LAN 上全部路由器224.0.0.5
:LAN 上全部 OSPF 路由器224.0.0.251
:LAN 上全部 DNS 服务器
临时组地址:
需要路由协议,组播路由器需了解哪些主机属于某个组。
Internet 组管理协议 (IGMP):
- 一个进程要求它的主机加入某个指定的组/离开该组。每台主机跟踪记录当前它的进程属于哪些组。当一台主机上的最后一个进程离开一个组时,该主机就不再属于这个组。
- 每个组播路由器定期向它所在 LAN 上的所有主机(使用
224.0.0.1
)发送一个查询数据包,要求这些主机报告自己当前属于哪些组。
- 每个主机收到查询消息后,返回一个响应包,包括了自己感兴趣的所有 D 类地址。
- 一个进程要求它的主机加入某个指定的组/离开该组。每台主机跟踪记录当前它的进程属于哪些组。当一台主机上的最后一个进程离开一个组时,该主机就不再属于这个组。
广播 (broadcast):1 对多
任播 (anycast):1 对多中的一个
组播路由协议
数据包沿着生成树发送,通过修建广播生成树把不通往组成员的链路从树中删掉,得到一棵有效的组播生成树。
- 基于源的组播协议:以发送方为多播树的根,并且包含了所有的组成员。
- 距离矢量组播路由协议 (DVMRP)
- 组播 OSPF (MOSPF)
- 基于共享树的协议:对每个组使用同一颗树。
- 基于核心树 (Core Based Trees)
- 混合以上两种方法的协议
- 协议独立组播协议 (PIM)
- 密集模式 PIM (PIM-DM):创建一颗修建的逆向路径转发树。
- 稀疏模式 PIM (PIM-SM):创建的生成树类似于核心树。
- 协议独立组播协议 (PIM)