第四章重点
五类 IP 地址划分的表格(Ctrl+F 查找 wiki)
例题1:子网划分(查找 1111)
例题2:子网划分与CIDR(查找 2222)
链路状态路由(全局路由):Dijkstra (查找 Dijkstra)
距离向量路由(分布式路由算法):DV (查找 4.5.2)
第四章复习大纲
- 路由器的结构
- IP协议(重点)
- IP 报文格式
- IPv4寻址
- ICMP
- DHCP
- 路由算法(重难点)
- LS(Link State)
- DV(Distance Vector)
- 层次选路
- 路由协议
- RIP(域内,DV)
- OSPF(域内,LS,更优)
- BGP(域间)
- SDN
这一章东西也不少啊
4.1 引言
-
网络层与传输层:
-
有关 报文段 (segment)
- 报文段是传输层的协议数据单元,常见的传输层协议有 TCP 和 UDP。报文段是应用层经过传输层封装后的产物
- 报文段 包含了传输层协议的头部信息,如端口号、序列号、校验和等
-
发送方主机封装 报文段 为 数据报(datagram)
- 在发送方主机,传输层生成的报文段会交给网络层处理,常见的网络层协议是 IP
- 封装时添加网络层头部信息,包括 源IP地址、目的IP地址
-
接收方主机递交报文段给传输层。
-
数据报从发送方主机通过网络传输到接收方主机。
在接收方主机,网络层接收到数据报,然后将其解封装,提取出其中的报文段。
最终,网络层将解封装出来的报文段递交给接收方主机的传输层进行进一步处理。
-
-
在 每个 主机、路由器上都需要运行网络层协议
-
路由器会检查通过它的所有 IP 数据报的头部字段,然后根据目的 IP 地址对数据报进行转发
-
-
网络层的两个主要功能:
- 转发 (forwarding):将分组从路由器的输入端口转移到正确的路由器输出端口。("通过立交桥岔口")
- 通过路由器中的 转发表 确定本路由器上的本地转发
- 路由 (routing):确定分组从发送方传输到接收方的路径。("规划旅行路线")
- 通过路由器中的 路由算法 确定通过网络的端到端路径
- 转发 (forwarding):将分组从路由器的输入端口转移到正确的路由器输出端口。("通过立交桥岔口")
-
网络层被分解成两个相互作用的部分(两个平面):
-
数据平面:决定抵达路由器输入端口的数据报如何转发到输出端口
- 本地的,每个路由器自身的功能
-
控制平面:决定数据报在端到端路径上的路由器之间如何路由
- 整个网络范围
-
-
两种数据平面的实现方式
- 传统的路由算法(和转发功能被实现成一个整体,在路由器内实现)
- 软件定义网络(在远程服务器内实现),置于一台远程控制器
-
如今的因特网网络层不执行连接建立
-
网络层提供的服务:简单 & 尽力而为
-
尽力而为的服务(best-effort service)
-
分组间的定时不能被保证
-
分组的接受顺序与发送顺序不一定相同
-
传送的分组不饿能保证最终交付,即网络可能未向目的地交付分组
确保交付(X)
具有时延上界的确保交付(X)
有序分组交付(X)
确保最小带宽(X)
确保最大时延抖动(X)
- 机制的简单性使Internet得以 广泛部署
- 足够的带宽配置可使实时应用程序(例如交互式语音、视频)的性能在"大部分时间"内"足够好"(UDP效果)
- 可复制的、应用层的分布式服务(数据中心,内容分发网络);连接到客户端的网络附近,从而允许从多个位置提供服务
- "弹性"服务的拥塞控制非常有用
-
4.2 虚电路和数据报网络 (大部分了解 = 大部分不考)
-
数据报转发表
- 如果为每个目的地址建立一个表项,需要大约 40 亿个表项。因此转发表中采用 地址范围 来建立表项。
-
最长前缀匹配(查找 输出端口)
- 第一个:0;第二个:1。(注意是 最长 前缀)
4.3 路由器的工作原理
-
路由器的两个核心功能:
- 运行路由器算法/协议(OSPF,RIP,BGP)
- 将分组从路由器的输入链路传送到正确的输出链路
-
路由器的体系结构:
-
输入端口:
- 功能:
- 第一个 线路终端 模块:将一条物理链路端连接到服务器的物理层
- 第二个 数据链路处理 模块:实现路由器的 数据链路层功能
- 第三个 查找与转发 模块:实现 查找与转发功能 ,以便分组通过路由器交换结构转发到合适的输出端口
- 通过查找 转发表 实现,这里的转发表存储在输入端口的内存中。
- 分布式交换:每个输入端口有一份转发表拷贝,在每个输入端口本地作出交换决策
- 功能:
-
交换结构:将分组从输入端口缓存 转发 到恰当的输出端口缓存中:
-
三种类型:经内存、经总线、经交换矩阵(纵横式)
-
经内存:交换由 选路处理器(CPU) 完成。类似I/O设备。
- 每个分组经过 2 次总线(输入端口 → \rarr → 内存,内存 → \rarr → 输出端口)
-
经总线:不需要 选路处理器 的干预,每次也只能有一个分组通过总线传送。路由器交换带宽受 总线速率 影响。
-
经交换矩阵:
-
纵横式交换机:由 2n 条总线组成,n个输入端口 & n个输出端口连接。
-
到达输入端口的分组 沿水平总线穿行,直至与所希望的输出端口的垂直总线交叉点。
-
若该垂直总线空闲,则直接传送到输出端口;否则在输入端口排队。
-
-
-
-
输出端口:取出存放在输出端口内存中的分组,并将其传输到输出链路上
-
排队:
-
输出端口排队:当交换结构将分组交付给输出端口的速率超过输出链路速率时,就需要 排队与缓存管理功能。缓冲区溢出时会出现延时和丢包。
-
输入端口排队同理
-
线头阻塞(Head-of-the-Line(HOL) Blocking):在队列前面的 被阻塞的数据报 会 阻止🚫队列中的其他数据报被转发!
-
-
缓冲区溢出都会导致 丢包。
- 管理缓存中的数据包------FCFS、优先级、Round Robin、加权公平排队。
-
4.4 网际协议:因特网中的转发和编址(IP协议 ⭐⭐⭐⭐⭐)
-
IP 数据报格式(IPv4)------提供不可靠无连接的数据报传送传输服务
- 其中左边为最高位(0位),右边为最低位(31位)。在网络中传输数据时,先传输0-7位,再8-15位依次类推
- 前五排一共 5*4B=20B,也就是说IP的首部至少长 20B。
-
IP地址:
-
定义:分配给 主机 或 路由器接口 的标识符
-
接口:主机/路由器 与 物理链路 之间的边界
- 一个路由器有多个接口
- 主机可以有多个接口
- 每个接口有一个 IP 地址
-
IP 地址目前分为 IPv4 & IPv6
- IPv4:32位(4字节),常用点分十进制表示
- IPv6:128位(16字节),常用冒号分隔表示
-
早期将 IP 地址分为五类
特点 网络号 IP地址范围 可用IP地址范围 A类 0开头 8位 0.0.0.0~127.255.255.255 1.0.0.1~127.255.255.254 B类 10开头 16位 128.0.0.0~191.255.255.255 128.0.0.1~191.255.255.254 C类 110开头 24位 192.0.0.0~223.255.255.255 192.0.0.1~223.255.255.254 D类 1110开头 - 224.0.0.0~239.255.255.255 - E类 11110开头 - 240.0.0.0~255.255.255.255 - (该表参考 wiki 百科)
(D类和E类 IPv4地址不区分网络地址和主机地址,因为ABC类用来标志主机,D类用于一对多通信,E类保留未来用)
(0,128,192,224,240)
-
划分时的注意点:
-
主机号全0不能分配:主机号全0时,该地址表示整个网络地址(网络地址用于标志网络本身)。
例如,在一个C类网络 192.168.1.0/24 中,192.168.1.0 表示这个网络本身,而非网络中的某一台主机。
-
主机号全1不能分配:主机号全1时,该地址表示广播地址(广播地址用于向网络中的所有主机发送数据报)。
例如,在上一例的网络中,192.168.1.255 是广播地址。
-
特殊用途的地址:
- 私有IP地址:用于本地网络,这些地址不可在公网中路由,通常由 NAT(网络地址转换)设备转换为公共 IP
- A类中的:10.0.0.0~10.255.255.255(10.x.x.x)
- B类中的:172.16.0.0~172.31.255.255(172.16.x.x - 172.31.x.x)
- C类中的:192.168.0.0~192.168.255.255(192.168.x.x)
- 环回地址:
- 127.0.0.0~127.255.255.255(通常127.0.0.1用于本地主机的环回地址)
- 0.0.0.0:用于表示整个网络,标志不清楚的网络和主机(系统遇到无法识别的网络或主机时就归到这个地址)
- 255.255.255.255:本地网络广播,向本地网络中所有主机发送数据包,不涉及路由器的转发。
- 私有IP地址:用于本地网络,这些地址不可在公网中路由,通常由 NAT(网络地址转换)设备转换为公共 IP
-
-
-
划分子网:
-
IP 地址:
- 网络号(高位)
- 主机号(低位)
-
网络号相同的 IP 地址属于同一个网络,而网络还可以划分为若干个子网(subnet)。
-
方法:从主机号中借用若干 bits 作为子网号,剩下的主机位为主机号。
( 网络号 + 高位部分主机号 → \rarr → 子网号 )
-
-
什么是子网:(从 IP 地址的角度看)
-
设备接口的 IP 地址具有同样的网络部分
-
没有路由器的接入,物理上能够相互到达
-
-
子网掩码:为了 确定子网地址 而提出的
-
示例:255.255.255.128 = 1111 1111 1111 1111 1111 1111 1000 0000
其中 1 对应 IP 地址中的网络号和子网号,0 对应主机号。求网络号可以将 IP 地址和子网掩码 按位与。
-
子网划分技术:例题(1111)
-
现有一个网段 202.115.1.1 ~ 202.115.1.254
-
请写出怎样将这个网段划分为 2个、6个、14个子网;
-
假设这些 IP 用于某公司。现公司任一部门最多有30台机器,问应该怎样划分子网?
-
在上一问中,如果公司任一部门最多有49台机器,又将怎么划分?
请写出子网所需的位数、子网掩码和子网号
- 2个子网从主机号中借1位作为子网号,6个借3位,14个借4位 (n个子网就借 c e i l ( l o g 2 n ) ceil(log_{2}n) ceil(log2n) 位)
-
2个子网:
子网号 子网掩码 202.115.1.0 (最后一个字节 ++0++0000000) 255.255.255.128 202.115.1.128(最后一个字节++1++0000000) 255.255.255.128 - 子网范围:202.114.1.1 - 202.114.1.127,202.114.1.128 - 202.114.1.254
-
6个子网
子网号 子网掩码 202.115.1.0 (最后一个字节 ++000++00000) 255.255.255.224 202.115.1.32 (最后一个字节 ++001++00000) 255.255.255.224 202.115.1.64 (最后一个字节 ++010++00000) 255.255.255.224 202.115.1.96 (最后一个字节 ++011++00000) 255.255.255.224 202.115.1.128 (最后一个字节 ++100++00000) 255.255.255.224 202.115.1.160 (最后一个字节 ++101++00000) 255.255.255.224 202.115.1.192 (最后一个字节 ++110++00000) 255.255.255.224 202.115.1.224 (最后一个字节 ++111++00000) 255.255.255.224 划分子网范围方法同上,从这 8 个子网中任取 6 个即可
-
14个子网同理
-
由于全0和全1不可用,所以应当视作有 30 + 2 = 32 台机器。需要5位主机号,剩下的3位可用用作子网号。
-
49 + 2 = 51,需要 6 位主机号。而剩下的2位可用用作子网号。
三种方式解答:
-
子网号+子网掩码:
- 子网号分别为:202.115.1.0,202.115.1.64,202.115.1.128,202.115.1.192。
- 子网掩码都为 255.255.255.192
-
IP地址范围+子网掩码
-
四个子网的地址范围是:
202.115.1.1 ~ 202.115.1.62
202.115.1.65 ~ 202.115.1.126
202.115.1.129 ~ 202.115.1.190
202.115.1.193 ~ 202.115.1.252
(即,起始都是 2 n + 1 2^{n}+1 2n+1 ,结束都是 2 n + 1 − 2 2^{n+1}-2 2n+1−2 )
-
-
CIDR法:
- 四个子网分别为:202.115.1.0/26,202.115.1.64/26,202.115.1.128/26,202.115.1.192/26
-
-
使用子网掩码的分组转发:
-
在不划分子网时,路由表只有 2 项:目的地址 和 下一跳地址。
-
使用子网划分后,路由表中将包含 3 项:目的地址 、 下一跳地址 、子网掩码
-
-
传统 IP 分类方法的问题
- 一个 A 类地址的 IP 地址可以有 24位(看前面那张wiki表) 用于分配主机地址,即可用支持 2 24 − 2 2^{24}-2 224−2 个主机(全0全1的主机号不可分配),但是一个家庭或组织往往不需要这么多地址空间,浪费
- 一个 C 类地址只能支持 2 8 − 2 = 254 2^{8}-2=254 28−2=254 个主机,又不太够用。
- 所以传统 IP 地址分类方式 被 CIDR 技术取代。
-
CIDR(Classless Inter-Domain Routing,无分类域间路由)
- 消除了传统的 A B C 类地址的概念,在IP地址后面加上一个斜线 '/' ,斜线后面用一个数字指定网络前缀的长度。
- CIDR 将网络前缀相同的连续的 IP 地址组成 "CIDR地址块"
- CIDR 地址格式: 网络前缀+主机号
-
构造超网(superneting)
-
一个 CIDR 地址块可以表示分类 IP 的多个分类地址,这种地址的聚合称为 路由聚合 ,又称为 构造超网。
子网划分及 CIDR 练习(2222):
现有一公司已获得网络号为 202.1.1.0/24,如果该公司有 3 个部门
-
如果第一个部门有60台计算机,第二个部门有20台计算机,第三个部门有16台计算机,那么使用分类IP的方法如何分配地址?
-
如果第一个部门有120台计算机,第二个部门有60台计算机,第三个部门有60台计算机,使用分类IP的方法可用分配地址吗?使用CIDR方法如何分配地址?
- 以最多台数的部门为准,需要的最接近数为 2 6 = 64 2^{6}=64 26=64 ,所以要从主机号的 8 位中借 8-6=2 位作为子网号
子网分别为 202.1.1.0,202.1.1.64,202.1.1.128,202.1.1.192 。在这 4 个子网号中任选 3 个即可。
子网掩码均为 255.255.255.192
2. 若以最多台数的部门为准,需要的最接近数为 2 7 = 128 2^{7}=128 27=128 ,所以要从主机号的 8 位中借 8-7=1位作为子网号,那么就只能划分2个子网。所以使用分类IP的方法不可行。使用CIDR方法:
-
首先以最小需求的台数为准,因为 60 + 2 < 64 = 2 6 60+2<64=2^{6} 60+2<64=26 ,此时主机号位数需要 6 位,则子网号位数为 8-6=2位,将子网划分出来,分别为 202.1.1.0,202.1.1.64,202.1.1.128,202.1.1.192。
-
第一个部门选择两个连续的子网 用CIDR合并 作为超网,第二、三个部门任选剩下两个子网。
例如:202.1.1.0,202.1.1.64 给部门一,202.1.1.128给部门二,202.1.1.192给部门三
-
最后将给部门 IP 段用 CIDR 超网形式描述,以便对外发布:
部门1:202.1.1.0/25(最后一个字节最高一位 0,后面 7 位作主机号)
部门2:202.1.1.128/26(最后一个字节最高两位 10,后面 6 位作主机号)
部门3:202.1.1.192/26(最后一个字节最高两位 11,后面 6 位作主机号)
注:考试的时候,不需要分析特别细,给出解答(十进制形式,不要写二进制形式)即可。注意题目要求,一般只会要求用
子网号+子网掩码、IP地址范围+子网掩码、CIDR 这三种方法之一来作答。
然后就是,划分好的子网中,主机号全 0 和全 1 不可拿来分配主机!
-
DHCP:动态主机配置协议(Dynamic Host Configuration Protocol)
-
IP 地址怎样获取------DHCP
- 自动从一个 DHCP 服务器得到 IP 地址
- 方便灵活
-
DHCP 概述:plug-and-play(即插即用)
- 主机广播 "DHCP DISCOVER"
- 消息DHCP 服务器用 "DHCP OFFER"
- 消息响应主机请求IP地址: "DHCP REQUEST"
- 消息DHCP 服务器确认 "DHCP ACK/NACK"
- 消息DHCP 终止租用期"DHCP RELEASE"消息
-
DHCP 工作过程:
-
DHCP 服务器被动打开 UDP 端口 67,等待客户端发来的报文。
- DHCP客户端启动时,由于其还未配置IP地址,因此只能使用广播方式发送DHCP DISCOVER 包,即该数据包的源地址为0.0.0.0,目标地址为255.255.255.255
- 由一端打开一个套接字(socket),然后监听来自另一方的连接,称为被动打开
-
DHCP 客户从 UDP 端口 68 发送
DHCP DISCOVER
报文 -
凡是收到
DHCP DISCOVER
报文的服务器都发出DHCP OFFER
报文,因此客户可能收到多个DHCP OFFER
报文 -
客户从几个 DHCP 服务器中选择一个,并向所选择的服务器发送
DHCP REQUEST
报文 -
被选择的服务器发送
DHCP ACK
报文,客户进入已绑定状态,并且可用开始使用得到的临时 IP 地址了此时客户要根据服务器提供的租用期 T 设置两个计时器 T1 和 T2,超时时间分别为 0.5T 和 0.875T。
超时时间到就要请求更新租用期。
-
T1 时间到,客户发送
DHCP REQUEST
要求更新租期 -
服务器若不同意,则发回
DHCP NACK
。此时客户必须立即停止使用原来的IP地址,回到步骤2重新申请 -
服务器若同意,则发挥
DHCP ACK
,客户得到新的租用期,重新设置计时器。若T2时间服务器还没有响应步骤6的请求,那么客户必须重复步骤6 (重新发送请求报文
DHCP REQUEST
) -
客户可以随时提前终止服务器提供的租用期,向服务器发送
DHCP RELEASE
即可。监听 → \rarr → 客户DISCOVER → \rarr → 服务器OFFER → \rarr → 客户REQUEST → \rarr → 服务器ACK或者NACK → \rarr → T1超时/T2超时
→ \rarr → 结束
-
-
DHCP:不仅仅获得IP地址,还有:
- 客户的第一跳路由器的地址(即网关地址)
- DNS 服务器的IP地址或域名
- 子网掩码
DHCP 是应用层协议!
-
组织机构如何获取IP地址?
-
怎样获取IP地址中的网络号部分?------从ISP的地址空间中划分一块给申请者
例如:
-
ISP获得地址块的方法------从ICANN(Internet Corporation for Assigned Names and Numbers)获取
- 分配IP地址
- 管理DNS
- 分配域名,解决纠纷
-
NAT:网络地址转换(Network Address Translation)
-
动机:对外部网络来说,本地网络只用 1 个 IP 地址
-
不需要从 ISP 分配一系列地址------只需要 1 个 IP 地址用于所有设备
-
在本地网络,改变设备的 IP 地址不用通知外部
-
可以变更 ISP ,不用改变本地网络的设备的地址
-
本地网络内部设备不能被外部明确寻址(不可见,增加安全性)
-
-
执行 NAT,路由器必须做到:
-
外出的分组 :替换每个外出的分组的 (源IP地址,端口号)为(NAT IP 地址,新端口号)
-
在 NAT转换表中记录 上述转换的 转换配对
-
进来的分组:对每个进来的分组,
用保存在 NAT 表中的对应的(源IP地址,端口号)替换分组中的目的域(NAT IP 地址,新端口号)
-
-
NAT的一些限制:
-
16位端口号------一个局域网地址可用同时支持 60000 个并发连接
-
NAT 存在的争议:
-
路由器只应该处理到第三层(网络层),破坏了层次网络的应用
-
违反了端到端主张,这样 APP 设计时必须考虑 NAT
-
-
所以,应使用 IPv6 来解决地址短缺问题!
-
ICMP(Internet Control Message Protocol):因特网控制报文协议
- 用于主机路由器之间彼此交流网络层信息
- 差错报告:不可到达的主机,网络,端口,协议
- 请求/应答:用于ping,traceroute
- 位于 IP 之上
- 因为 ICMP 消息是装载在 IP 分组中的
- 用于主机路由器之间彼此交流网络层信息
-
Traceroute 和 ICMP
-
Traceroute:是一个网络诊断工具,用于确定数据包从源地址到目的地址在互联网上的路径。其工作原理是利用 ICMP 协议的 TTL(Time-To-Live)字段。
-
源端发送具有递增TTL的UDP数据报到目的地址,记录每个路由器的IP地址,直到到达目标地址为止。
-
当一个数据包经过网络时,TTL会逐跳减少。当TTL=0时,路由器或交换机 会丢弃该数据报并发送一个 ICMP 报文(type11,code 0)给源端,这个报文包含了路由器的名称和IP地址。
-
源端收到 ICMP 报文时,计算传输往返时间 RTT,对每个TTL作三次这样的操作。
-
UDP报文最终到达目的端时,目的端返回回应应答的 ICMP 报文(type3,code3),源端收到后停止发送。
-
-
IPv6(128位,分为8组,每组16位由四个16进制数表示)
-
初始动机:32位的IPv4地址空间用尽
-
其他动机:
- 首部格式可帮助加速处理/转发
- 改变首部利于 QoS(Quality of Service) 要求
-
IPv6数据报格式
-
固定长度的40字节首部
回忆:UDP首部8字节,TCP首部20字节,IPv4首部至少20字节
-
不允许分片
-
-
表示方式:
- FF0C:0:0:0:0:0:B1 采用 零压缩表示法:FF0C::B1
-
了解的不写了
-
4.5.1 选路算法
-
路由与转发的相互作用:
- 路由算法确定通过网络的端到端路径
- 转发表确定在路由器上的本地转发
-
网络的抽象图模型:这里都是无向图
- 节点:u,v,w,x,y,z
- 边:(u,v),(u,x),(u,w)
- 费用:例如图中 c(u,v)=2,最初不相邻的如 c(u,z)= ∞ \infty ∞
-
路由算法分类:
-
全局路由算法:所有路由器必须拥有完整的网络拓扑信息和链路费用信息
(链路状态路由算法 LS------必须知道网络中每条链路的费用)
-
分布式路由算法:以迭代的、分布式的方式计算最低费用路径
- 每个节点只有与其直接相连的链路的费用信息
- 通过迭代计算并且与邻居节点交换信息,逐步计算
(距离向量路由算法DV------每个节点维护 到网络中所有其他节点的费用的估计向量)
-
静态路由算法:人工干预才变化
-
动态路由算法:周期性相应变化,易受影响
-
-
链路状态选路算法------Dijkstra
- 所有节点直到网络的拓扑形状、每条链路的费用信息
- 通过链路状态广播实现
- 所有节点拥有相同信息
- 计算任意一个节点到所有其他节点的最低费用路径
- 给出该节点的转发表
- 迭代:k次迭代可以知道从源节点到k个目的节点的最低费用路径
- 所有节点直到网络的拓扑形状、每条链路的费用信息
-
Dijkstra算法:
-
基本思想:以源节点为起点,每次找出一个到源节点的费用最低的节点,直到找完所有节点
-
术语定义:
- c(x,y):x到y的路径费用
- D(v):源节点到v的当前路径的费用
- p(v):从源节点到v节点的前驱节点
- N':已找到最低费用路径的节点的集合
-
核心算法:起始点u,计算到节点w------遍历 所有 不在集合 N' 中的 w 的所有邻居 w 邻 w_{邻} w邻
D ( w ) = m i n ( D ( w ) , D ( w 邻 ) + c ( w 邻 , w ) ) D(w)=min(D(w),D(w_{邻})+c(w_{邻},w)) D(w)=min(D(w),D(w邻)+c(w邻,w))
-
还是以这张图为例,假设u是起始节点(表中每一行表示一次迭代结束时的变量值,以下用 "最近" 表示 "费用最低")
Step N' D(v),p(v) D(w),p(w) D(x),p(x) D(y),p(y) D(z),p(z) 0 u 2,u 5,u 1,u ∞ \infty ∞ ∞ \infty ∞ 1 ux 2,u 4,x 2,x ∞ \infty ∞ 2 uxy 2,u 3,y 4,y 3 uxyv 3,y 4,y 4 uxyvw 4,y 5 uxyvwz 注:
-
Step0:找和u最近的节点。u和v,x,w直接相连,将相应的 D 和 p 填入表中,选出最近的
x
节点,加入 N' 集合。- 加入集合后就不再改变节点的 D 和 p 了!
-
Step1:找和u最近的节点。看有没有要更新的:
-
对于节点v, D ( v ) = m i n ( D ( v ) , D ( x ) + c ( x , v ) ) = m i n ( 2 , 1 + 2 ) = 2 D(v)=min(D(v),D(x)+c(x,v))=min(2,1+2)=2 D(v)=min(D(v),D(x)+c(x,v))=min(2,1+2)=2 ,故 D(v),p(v) 不变
-
对于节点w, D ( w ) = m i n ( D ( w ) , D ( v ) + c ( v , w ) ) = m i n ( 5 , 2 + 3 ) = 5 D(w)=min(D(w),D(v)+c(v,w))=min(5,2+3)=5 D(w)=min(D(w),D(v)+c(v,w))=min(5,2+3)=5
D ( w ) = m i n ( D ( w ) , D ( x ) + c ( x , w ) ) = m i n ( 5 , 1 + 3 ) = 4 D(w)=min(D(w),D(x)+c(x,w))=min(5,1+3)=4 D(w)=min(D(w),D(x)+c(x,w))=min(5,1+3)=4更新D(w)=4,p(w)=x
-
对于节点y, D ( y ) = m i n ( D ( y ) , D ( x ) + c ( x , y ) , D ( w ) + c ( w , y ) ) = m i n ( ∞ , 1 + 1 , 5 + 1 ) = 2 D(y)=min(D(y),D(x)+c(x,y),D(w)+c(w,y))=min(\infty,1+1,5+1)=2 D(y)=min(D(y),D(x)+c(x,y),D(w)+c(w,y))=min(∞,1+1,5+1)=2
更新 D(y)=2,p(y)=x
-
对于节点z,仍然无法到达
选出最近的
y
或者v
,选哪个都可以,这里我们选择y
-
-
Step2,3,4,5同理
-
-
时间复杂度: O ( n 2 ) O(n^{2}) O(n2) :所有迭代中需要搜索 n + ( n − 1 ) + ( n − 2 ) + . . . + 1 = n ∗ ( n + 1 ) 2 n+(n-1)+(n-2)+...+1=\frac{n*(n+1)}{2} n+(n−1)+(n−2)+...+1=2n∗(n+1) 个节点
- 使用堆优化可达 O ( n l o g n ) O(nlogn) O(nlogn)
-
构建从 源节点 到 目的节点 的路径:例如从 u 到 w
- 递归计算 p(w),直至递归到 u,然后逆序输出即是所求路径
-
构建最低费用路径树 & 转发表:
-
最低费用路径树:
-
转发表:
- 其中,
*
用于合并所有下一跳相同的项的。在转发表中找不到目的地时,才使用默认路由*
(优先级最低)
- 其中,
-
-
Dijkstra 可能产生震荡:
4.5.2 距离向量路由算法DV
-
特点
- 分布式:每个节点都从其直接相连的邻居接收信息,计算后将结果分发给邻居
- 迭代:计算过程持续到 邻居之间没有更多信息交换
- 异步:不要求所有节点步伐一致地操作
- 自我终结:算法能自行停止
-
最低费用表示:
Bellman-Ford 方程: d x ( y ) = m i n v { c ( x , v ) + d v ( y ) } d_{x}(y)=min_{v}\{c(x,v)+d_{v}(y)\} dx(y)=minv{c(x,v)+dv(y)}
- d x ( y ) d_{x}(y) dx(y) :节点 x 到节点 y 的最低费用路径的费用
- v:节点 x 的邻居节点
- m i n v min_{v} minv :从所有经直接相连邻居节点到节点 y 的费用中选取的最小路径费用。
-
对每个节点 x:
- 初始化
- 更新自己的距离向量,通知邻居
- 重复步骤2,直到没有更新的距离向量发出
-
节点的距离向量表
-
以节点 x 为例:
- 行:该节点的:
- 距离向量 Dx(x到每个目的节点y的估计费用)
- 其邻居的距离向量 Dv(即x的邻居v到每个目的节点y的估计费用)
- 列:所有目的节点
- 行:该节点的:
-
初始化如下:
-
更新的过程:
-
每个节点不断向邻居发送其距离向量的拷贝
-
当节点 x 收到一个邻居 v 的新距离向量,先保存,再使用 B-F 公式更新自己的距离向量:
D x ( y ) = m i n v { c ( x , v ) + D v ( y ) } D_{x}(y)=min_{v}\{c(x,v)+D_{v}(y)\} Dx(y)=minv{c(x,v)+Dv(y)},从所有经 邻居 v 到节点 y 的费用中选取最小路径费用。
-
若距离向量发生改变,将新的距离向量通知给邻居
-
若距离向量不再变化,算法终止,此时 D x ( y ) D_{x}(y) Dx(y) 收敛到 d x ( y ) d_{x}(y) dx(y),即得到节点 x 到节点 y 的最低费用路径
-
-
注:
- 在第一次中,邻居行直接填,自己行要检查是否可以更新
- 在第一次中更新了的要在第二次中通知邻居。如果在第一次中稳定的就不用通知了。
- 算法进入静止状态后,保持直到某个链路费用发生改变为止。
-
链路费用的改变:当一个节点检测到从它到邻居的链路费用发生变化时,就需要更新其距离向量,如果最低费用路径的费用发生变化,则要通知其路径。
-
减少:如图 c(x,y) 从4变为1
- t0:y 检测到 x 的链路费用从 4 变为 1,更新其距离向量,并通知邻居 z
- t1:z 收到来自 y 的更新报文,并更新自己的距离表,此时到 节点 x 的最低费用变为 2,并通知邻居 y
- t2:y 收到来自 z 的更新报文,并更新自己的距离表,此时到 节点 x 的最低费用不变。不发送更新报文,算法停止。
所以当 x 和 y 之间的费用减少,DV 算法只需 2 次迭代到达静止状态。
好消息(节点间链路费用减少)能在网络中迅速传播!
-
增加:如图 c(x,y) 从 4 变为 60
-
t0:y 检测到链路费用从 4 变为 60 。更新到 x 的最低路径费用。
D y ( x ) = m i n { c ( y , x ) + D x ( x ) , c ( y , z ) + D z ( x ) } = m i n { 60 + 0 , 1 + 5 } = 6 D_{y}(x)=min\{c(y,x)+D_{x}(x),c(y,z)+D_{z}(x) \}=min\{60+0,1+5\}=6 Dy(x)=min{c(y,x)+Dx(x),c(y,z)+Dz(x)}=min{60+0,1+5}=6
此费用是错误的,因为 D z ( x ) D_{z}(x) Dz(x) 还没有更新
-
t1:z 收到新费用,更新 D z ( x ) = m i n { c ( z , x ) + D x ( x ) , c ( z , y ) + D y ( x ) } = m i n { 50 + 0 , 1 + 6 } = 7 D_{z}(x)=min\{c(z,x)+D_{x}(x),c(z,y)+D_{y}(x) \}=min\{50+0,1+6 \}=7 Dz(x)=min{c(z,x)+Dx(x),c(z,y)+Dy(x)}=min{50+0,1+6}=7
经节点 y 到 x 费用最低,发给节点 y。
-
t2:y 收到新费用,更新 D y ( x ) = m i n { c ( y , x ) + D x ( x ) , c ( y , z ) + D z ( x ) } = m i n { 60 + 0 , 1 + 7 } = 8 D_{y}(x)=min\{c(y,x)+D_{x}(x),c(y,z)+D_{z}(x) \}=min\{60+0,1+7 \}=8 Dy(x)=min{c(y,x)+Dx(x),c(y,z)+Dz(x)}=min{60+0,1+7}=8
经节点 z 到 x 费用最低,发给节点 z。
-
...
-
产生 选路回环:为到达x,y 通过 z 选路,z 又通过 y 选路。一共持续44(50-6=44)次迭代,直至z最终算出它经由y的路径费用大于50为止。
坏消息(节点间链路费用增加)传播很慢!
-
-
-
毒性逆转(不考)
-
LS算法和DV算法的比较
消息复杂度 收敛速度 健壮性 LS算法 知道网络中每条链路的费用,需发送O(nE)个报文; 当一条链路的费用变化时,必须通知所有节点 需要O(nE)个报文和 O ( n 2 ) O(n^{2}) O(n2) 次搜寻,可能导致震荡 路由器向一条链路广播不正确的费用,路由器仅计算自己的转发表,有一定健壮性 DV算法 迭代时,仅在两个相邻节点之间交换报文; 当链路费用改变时,只有该链路相连的节点的最低费用路径发生改变时才传播以改变的链路费用 收敛较慢,可能导致选路回环 一个节点的计算值会传递给它的邻居,所以一个不正确的计算值会扩散到整个网络 来自gpt:
Link State(LS)算法
优点:
- 全局视图:每个路由器都有整个网络的拓扑视图,这使得路径计算更加准确。
- 快速收敛:由于每个路由器都有完整的网络信息,LS算法在拓扑变化后能够更快地收敛。
- 循环避免:由于每个路由器都知道网络的全局状态,能有效避免路由循环。
缺点:
- 计算复杂度高:需要每个路由器存储和处理整个网络的拓扑信息,计算资源消耗较大。
- 状态更新负担重:网络中的任何拓扑变化都会导致全网状态更新,带来额外的通信开销。
- 内存需求大:需要存储整个网络的拓扑图,对内存的需求较高。
Distance Vector(DV)算法
优点:
- 实现简单:算法相对简单,容易实现和维护。
- 低资源消耗:每个路由器只需要存储相邻节点的距离信息,不需要整个网络的拓扑图,资源消耗较低。
- 低通信开销:只有在直接相邻的节点之间交换信息,通信开销较低。
缺点:
- 慢收敛:拓扑变化时,可能需要较长时间才能收敛到新的正确路径。
- 路由环问题:在某些情况下,可能会产生路由环,需要额外机制(如分裂水平和毒性逆转)来防止。
- 不完全的网络视图:路由器没有全局网络视图,只能依赖于邻居的信息,健壮性差。
总结
- LS算法适用于需要高精度和快速响应的环境,例如大型网络和动态变化频繁的网络,但其高计算和存储要求可能是一个瓶颈。
- DV算法适用于资源有限和网络规模较小的环境,尽管其收敛速度较慢且容易产生路由环,但其实现简单、资源消耗低。
4.6 层次选路
-
问题:
- 之前的路由研究时理想化的:所有的路由器一样、网络是"平面的"
- 实际上:具有20亿个节点,路由表中不可能存储所有的节点,路由表的信息交换将淹没数据链路!
-
管理自治:
- Internet = 众多网络组成的网络
- 每个网络管理者 管理自己网络的路由选择
-
层次选路
- 一个区域内的路由器组成集合"自治系统"(AS,Autonomous System,也可称作 域),同一 AS 的路由器运行相同的路由协议(区域内路由协议)。不同 AS 的路由器可以运行不同的路由协议。
- 网关路由器:和其他 AS 内的路由器直接相连的路由器(大门)
- 运行域间路由协议,与其他网关路由器交互
- 也可以运行域内路由协议
-
域内路由选择
- 使用域内路由协议(也称作内部网关协议,Interior Gateway Protocol,IGP)
- 标准的域内路由协议
- RIP:Routing Information Protocol,路由选择信息协议
- OSPF:Open Shortest Path First Interior Gateway Protocol,开放式最短路径优先
- IGRP:Interior Gateway Routing Protocol,内部网关路由协议
-
RIP(了解=不考):采用DV,可以理解为路由表记录下一跳和到目的地的跳数
-
OSPF:采用LS的Dijkstra,OSPF的信息会直接通过 IP 传输(不是传输层的 TCP 或 UDP)
- 优点:安全(所有OSPF消息都需要认证),允许多条相同开销的路径,对不同的链路有不同的代价
-
BGP(Border Gateway Protocol),边界网关协议,用于Internet域间选路
-
BGP 为 每个 AS 提供一种手段:从相邻 AS 获取子网可达信息,向该 AS 内部的所有路由器传播这些可达性信息。
允许一个子网向 Internet 的其他部分通告它的存在。
-
AS 互联:转发表根据 AS 内和 AS 间选路算法而配置
- AS 域内的选路项用于 目的端 在域内的选路
- AS 域内和 AS 域间的选路项用于目的端在域外的选路。
-
AS 域间任务:如上图,AS1需要知道通过 AS2 和 AS3 能到达哪些目的端,然后将这些可达信息传播给 AS1 内的所有路由器
-
iBGP:internal BGP
eBGP:external BGP
-
BGP报文交换使用 TCP
-
BGP选路策略:
-
A,B,C 是提供商的网络,X,W,Y是提供商的客户,其中X连接到两个网络
- X不希望 B 通过 X 到 C 的路由 BXC,所有 X 不会向 B 公告到C的路由 XC
-
A 向 B 通告路径 AW,B 向 X 通告路径 BAW。那么 B 应该向 C 通告路由 BAW吗?
- 绝不!因为 W 和 C 都不是 B 的客户,B 希望强迫 C 通告 A 路由到 W
- B只希望通告其客户的路由,而不会将这些路由扩散到非客户的网络(B 路由 CBAW 没有什么好处),避免将非客户的流量引入客户的网络,保持路由策略的清晰和稳定
- B 不是 A 的客户,为什么 A 会通告路径 AW 给 B 呢?
虽然A不是B的客户,但是A通告B路径AW是为了提供给B一个到W的路径选择。然而,B不会通告C路径BAW是因为C不是B的客户。B没有必要将从非客户获得的路由信息进一步通告给其他非客户。
-
-
为什么 域内选路 和 域外选路 采用不同的协议?
- 域内:专注于单一自治系统内的高效路由(重性能)
- 域间:专注于跨自治系统的策略控制和全局路由管理(策略比性能重要)
4.7 SDN(Software Defined Network):软件定义网络
-
通过软件编程的形式定义和控制网络。
-
核心理念:希望 APP 可以参与对网络的控制管理,满足上层业务需求,通过自动化业务部署简化网络运维。
如果把现有的网络看成手机,那SDN的目标就是做出一个网络界的Android系统,可以在手机上安装升级,同时还能安装更多更强大的手机APP。
-
核心思想:每个交换设备包含一个 流表(flow table),用远程控制器来计算和分发。
-
特征:
- 基于流的转发
- 数据平面与控制平面分离
- 网络控制功能:位于数据平面交换机外部
- 可编程的网络
-
OpenFlow网络 由 OpenFlow网络设备 + 控制器通过 Open Flow通道 组成