计算机网络第四章网络层
计算机网络第四章网络层
参与网路层的主要设备:
从输入来链路接口到输出链路接口转移分组的是交换机
基于链路层帧中的字段做出决定的分组交换机称为链路层交换机
基于网络层数据报中的首部字段的值做出转发决定的是路由器
网络层的作用
网络层的作用:将分组从一台发送主机移动到另一台接收主机。
- 转发
- 路由选择
在网络体系中,每一层都是服务于对应的上下层的。网络层也是服务于上层的传输层和下层的数据链路层。
网络层的功能就是让我们在茫茫人海中,能够找到另一台计算机在哪里,是否属于同一个子网等。
其主要作用表现在一下几个方面:
(1)屏蔽网络差异,提供透明传输
网络层就是为了解决不同网络有不同的规范要求的差异问题,寻找一个不同网络间都能共同遵守的网络通信规范,以便不同网络间能相互识别,并接受对方的网络请求。也就是一个中转站的作用,两个毫无交集的网络通过这个中转站来建立交集。
(2)为网络间通信提供路由选择
路由选择是根据一定的原则和路由选择算法在多个结点的通信子网中选择一条到达目的节点的最佳路径的过程。确定路由选择的策略称为路由算法。在无连接的数据包服务中,网络节点要为每个数据包做出路由选择,即选择到达目的节点的最佳路线,而在面向连接的虚电路服务中,存在一条专门的逻辑线路,在建立连接时就已经确定了路有路径,无需额外选择。
(3)拥塞控制
拥塞控制是为了避免网络传输路径中数据的传输延迟或死锁。数据链路层中的流量控制功能,是针对数据链路中点对点传输速率的控制,这里的拥塞控制是针对在网络层传输路径中的端到端传输效率的控制。主要采用预约缓冲区、许可证和分组丢弃等方式。
路由器的工作原理
路由器的构成
路由器的任务
路由器是一种具有多个输入端口和多个输出端口的专用计算机,其任务是转发分组
路由器将某个输入端口收到的分组,按照分组要去的目的地(即目的网络), 把该分组从路由器的某个合适的输出端口转发给下一跳路由器
下一跳路由器也按照这种方法处理分组,直到该分组到达终点为止
转发和路由选择的区别
转发:就是路由器根据转发表将用户的 IP 数据报从合适的端口转发出去
路由选择:则是按照路由选择算法,根据从各相邻路由器得到的关于网络拓扑的变化情况,动态地改变所选择的路由
路由表是根据路由选择算法得出的。而转发表是由路由表生成的
典型的路由器结构
若分组的接收者是路由器自己,需要交给相应的 上层协议 去处理,如发送给路由器的RIP或 OSPF分组等需要 送交路由器的路由选择部分中的路由选择处理机。
否则,网络层处理模块按照 分组首部中的 目的地址 查找转发表,交给交换结构交换到合适的输出端口。
若交换结构处理分组的速率赶不上分组进入队列的速率,则会导致输入队列排队!
交换结构
1. 经内存存储器交换
最早的路由器就是多网络接口的计算机,收到一个分组时,将分组就从输入端口复制到存储器中,从 分组首部 提取 目的地址 ,查找路由表,再将分组复制到合适的 输出端口 的缓存中。
采用这种方式分组要两次经过系统的总线(一次写和 一次读),交换速度比较慢。
许多现代的低端路由器也通过存储器进行交换,与早期路由器的区别是 目的地址 的 查找 和 分组 在存储器中的缓存都是在 输入端口 中进行的。
2. 经总线交换
分组从 输入端口 通过 共享的总线 直接传送到合适的 输出端口,不需要路由选择处理机的干预。
但是,由于 总线是共享的,因此在同一时间只能有一 个分组在总线上传送。
当分组到达输入端口时,若发现总线忙,则被阻塞而不能通过交换结构,并在输入 端口排队等待。
路由器的转发带宽显然要受到总线速率的限制;
要想 实现无阻塞交换,交换总线的速率,就要大于所有输入端口速率的总和。
由于只经过一次总线,比通过存储器交换要快。
3. 经互联网络交换
这 种 交 换 结构 常 称 为互连 网 络(Interconnection Network),它有2N条纵横交叉的总线,通过控制相应的交叉结点使水平总线和垂直总线接通还是断开, 将分组转发到合适的输出端口。
当输入端口收到一个分组时,就将它发送到与该输入 端口相连的水平总线上。若通向所要转发的输出端口 的垂直总线是空闲的,则在这个结点将垂直总线与水 平总线接通,然后将该分组转发到这个输出端口。
但若该垂直总线已被占用(有另一个分组正在转发到 同一个输出端口),则后到达的分组就被阻塞,必须 在输入端口排队。
输出端口
把交换结构传送过来的分组先进行缓存。数据链路层处理模块将分组加上链路层的首部和尾部,交给物理层后发送到外部线路。
若从交换结构到达队列的分组速率超过链路的速率,则会导致输出队列排队!
总结处理过程
-
链路层解封装,IP头部校验。
-
获取报文目的IP地址。
-
用目的IP地址,基于最长前缀匹配规则查询转发表。
-
查询失败,丢弃报文。
-
查询成功:
获取转发出接口和下一跳IP地址。
IP头部“TTL”字段值减1,重新计算IP头部“校验和”。
重新进行链路层封装,发送报文。
注:普通IP报文转发过程中,路由器不查看传输层及以上层协议的内容。 -
IP报文在路由器转发前后的变化:
链路层封装更新,IP头部“TTL”减1,IP头部“校验和”更新。
-
数据报在不同硬件单元的处理
-
报文输入的接口卡
链路层解封装
转发表查询(该工作在输入接口卡处理)
通过交换结构将报文排队发往目的接口卡(发送过快将产生拥塞) -
交换结构
从输入接口卡发往输出接口卡 -
报文输出的接口卡
从交换结构接收报文(排队进行后续处理,到达太快将产生拥塞)
链路层封装
从输出接口发送报文
-
分组调度算法
排队的分组如何经输出链路传输?
1.先进先出(FIFO)
先来的先服务
2.优先权排队
比如分成普通用户和vip两个队,普通用户来了进普通用户队列,vip来了进vip队列,每种队列内通常是FIFO。
每个优先权类可以配置一个队列,每次从非空的优先权队列选择一个。
实践中网络操作员可以配置一个队列,这样携带网络管理信息的分组(比如通过源或目的TCP/UDP端口号所标识)能够比用户流量更有优先权。或者比如实时语音比电子邮件更具有优先权。要传输一个分组时从队列为非空的最高优先级中传输。分组传输时也不能被别的分组打断。
3.循环和加权公平排队
循环公平排队跟上一个相似,不同之处就是大家都是平等的,没有我是vip你不是这一说,循环着来,你这个队列没人了就找下一个。
**加权公平排队(WFQ)**给每个类分配权重,即使是最坏情况下也就是每个队都有人,某个队依然能获得权重x总带宽
第i类将确保接收到的服务部分等于 w i ∑ w j \huge \frac{w_i}{\sum{w_j}} ∑wjwi
被分配的带宽也是 w i ∑ w j \huge \frac{w_i}{\sum{w_j}} ∑wjwi
总吞吐量R 则被分配的吞吐量为 R ∗ w i ∑ w j \huge R*\frac{w_i}{\sum{w_j}} R∗∑wjwi
网际协议——IPv4
网际协议IP是TCP/IP体系中两个最主要的协议之一。
**主要功能:**IP 协议是一个无连接的服务,负责在源地址和目的地址之间传送数据报,其主要功能就是把数据报在互连的网络上传送,将数据报在一个个模块间通过路由处理网络地址传送到目的地址。
(1)寻址
在不同网络中必须通过三层地址进行寻址。常用的IP网络中运行的三层协议就是 IP 协议,对应的三层地址就是 IP 地址。
(2) 数据报的封装
从传输层过来的数据段需要经过IP协议的重封装,而从数据链路层过来的数据帧就需要进行解封装。在IP网络中封装后形成的是IP数据报,IP封装的目的就是标识此IP数据报发送节点和接受节点的IP地址和控制信息。
(3)分段与重组
不同网络上的链路可以传输的最大报文大小是不同的,这就是我们通常说的MTU(最大传输单元)。尺寸较大的数据报在MTU值较小的网络链路传输需要将数据报分段依次传输,对应的接收方就需要把这些接收到的拆分的分段组合起来,还原成原来的数据报
与IP协议配套使用的还有三个协议:地址解析协议 ARP、网际控制报文协议 ICMP 和网际组管理协议 IGMP。
报文结构
● 版本:指定IP数据报中使用的IP协议版本,占4位。IPv4对应值为4(0100)
● 首部长度:指示IP数据报头部的总长度,占4位。IP数据报头部的总长度以4字节为单位(即4字节的整数倍)
● 区分服务:用于表示数据报的优先级和服务类型,占8位。包括一个3位长度的优先级,4位长度的标志位,最高位未用
● 总长度:标识整个IP数据报的总长度,包括报头和数据部分,占16位,由此可知IPv4的最大长度为65535(64KB)
● 标识:用于表示IP数据报的标识符,占16位,每个IP数据报有一个唯一的标识(不是序号)。当数据报分段时,这个标识的值就被复制到所有分段的标识字段中,相同的标识字段值使分段后的数据报分段最后能正确地重组成为原来的数据报。
● 标志:指出该IP数据报后面是否还有分段,为分段标志,占3位,仅最低位有意义
● 片偏移:指出该分段在数据报中的相对位置。相对于用户数据字段的起点,该字段从何处开始,占13位
● 生存时间:标识IP数据报在网络中传输的有效期,以秒来计数,占8位。现在通常认为这个数值是指数据报允许经过的路由器数,当值为0时,就丢弃这个数据报。设定生存时间是为了防止数据报在网络中无限制地循环转发。
● **协议:**用来标识此IP数据报在传输层所采用的协议类型(如TCP、UDP或ICMP等),以便使目的主机的IP层知道应将数据部分上交给哪个处理过程,占8位
● **首部校验和:**用来检验IP数据报的包头部分(不含“数据”部分)在传输到接收端后是否发生了变化,占16位。因为数据报每经过一个路由器,路由器都要重新计算一下报头校验和
● **源地址/目的地址:**分别表示该IP数据报发送者和接收者的IP地址,各占32位
● 可变部分:用来支持各种选项,提供扩展余地,可用来支持排错、测量以及安全等措施。后面的填充字段就是为了保证IP数据报的报头是32位的整数倍。
IP地址
每一类地址都由两个固定长度的字段组成,其中一个字段是网络号 net-id,它标志主机(或路由器)所连接到的网络,而另一个字段则是主机号,host-id,它标志该主机(或路由器)。
● 网络号:保证相互连接的两个网段具有不同的标识, 简单来说就是标识网络 (网段:一段范围内的IP, 具体是网络号相同的所有IP)
● 主机号:同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号, 简单来说就是标识同一网段下的不同主机
● 子网:IP 地址是以网络号和主机号来表示网络上的主机的, 只有在一个网络号下的计算机之间才能“直接”互通, 不同网络号的计算机要通过网关(Gateway)才能互通. 但这样的划分在大多数情况下显得并不十分灵活. 为此IP网络还允许划分成更小的网络, 称为子网(Subnet)
通过合理的设置网络号和主机号,就可以保证在相互连接的网络中,每台主机的IP地址都不同。那么如何自动管理子网内的IP:
DHCP 动态主机配置协议 :首先,这是一个应用层协议,可以自动给子网内新增的主机节点分配IP地址. 。一般的路由器都带有DHCP功能, 因此路由器也可以看做是一个DHCP服务器。
IP 地址分为三类:A类、B类和C类
几个特殊的ip地址
① IP地址中的主机号全为0,就成了网络号,代表这个局域网
② 将IP地址中的主机号的二进制全部设为1,就成为了广播地址,用于给同一个链路中相互连接的所有主机发送数据包(此时目的地址当然就被设为了广播地址)
③ 127.0.0.1. 它代表设备的本地虚拟接口, 所以默认被看作是永远不会宕掉的接口。所以通常在安装物理网卡前就可以ping通这个本地回环地址。 一般都会用来检查本地网络协议、基本数据接口等是否正常的。
④ 0.0.0.0 标识本机上的所有网卡。用与TCP服务端程序的绑定地址,相当于监听本机的所有网卡。
划分子网
从两级 IP 地址到三级 IP 地址
在 ARPANET 的早期,IP 地址的设计不够合理:
● IP 地址空间的利用率有时很低。
● 给每一个物理网络分配一个网络号会使路由表变得太大因而使网络性能变坏。
● 两级的 IP 地址不够灵活。
早期 IP 地址的设计不合理产生了很多问题,为了解决这些问题 IP 地址中又增加了一个"子网号字段",使两级的IP地址变成了三级的IP地址。
(1)划分子网的基本思路:
一个拥有许多物理网络的单位,可将所属的物理网络划分为若干个子网。
① 划分子网纯属一个单位内部的事情,对外部网络透明,单位对外仍然表现为没有划分子网的网络。
② 从主机号借用若干个位作为子网号 subnet-id,而主机号 host-id 也就相应减少了若干个位。于是两级 IP 地址变成了三级 IP 地址:网络号、子网号和主机号。
③ 凡是从其他网络发送给本单位某个主机的 IP 数据报,仍然是根据 IP 数据报的目的网络号 net-id,先找到连接在本单位网络上的路由器。然后此路由器在收到 IP 数据报后,再按目的网络号 net-id 和子网号 subnet-id 找到目的子网。
④ 最后就将 IP 数据报直接交付目的主机。
(2)划分子网后变成三级结构的优点
● 减少了 IP 地址的浪费
● 使网络的组织更加灵活
● 更便于维护和管理
子网掩码
(1)子网掩码
● 子网掩码是一个应用于 TCP/IP 网络的32位二进制值,每节 8 位,必须结合IP地址对应使用。 (常见的 255.255.255.0 等)
● 子网掩码 32 位都与 IP 地址 32 位对应,如果某位是网络地址(网络号部分和子网号部分)则对应的位全为“1”,如果是主机号部分则对应的位全为“0”。(11111111.11111111.11111111.0)
● 子网掩码(subnet masking)的功能是告知主机或路由设备,地址的哪一部分是网络号,包括子网的网络号部分,哪一部分是主机号部分。
● 子网掩码可以分离出 IP 地址中的网络地址和主机地址,用于判断该 IP 地址是在局域网上,还是在广域网上。
● 子网掩码一般用于将网络进一步划分为若干子网,以避免主机过多而拥堵或过少而 IP 浪费。
(2)子网掩码使用原因
从一个 IP 数据报的首部并无法判断源主机或目的主机所连接的网络是否进行了子网划分,因为 IP 地址本身及数据报的首部没有包含任何关于有关子网划分的信息。使用子网掩码 (subnet mask) 可以找出 IP 地址中的子网部分。
(3)子网掩码是一个重要属性
● 子网掩码是一个网络或一个子网的重要属性。
● 路由器在和相邻路由器交换路由信息时,必须把自己所在网络(或子网)的子网掩码告诉相邻路由器。
● 路由器的路由表中的每一个项目,除了要给出目的网络地址外,还必须同时给出该网络的子网掩码。
● 若一个路由器连接在两个子网上,就拥有两个网络地址和两个子网掩码。
(4)子网掩码的作用
子网掩码可以分离出 IP 地址中的网络地址和主机地址。当两台计算机要通讯,首先要判断是否处于同一个广播域(局域网)内,即网络地址(网络号)是否相同。如果网络地址相同,表明接受方在本网络上,那么可以把数据包直接发送到目标主机,否则就需要路由网关将数据包转发送到目的地。
(5)默认子网掩码
(6)子网掩码的使用
● 网络号:IP地址和子网掩码进行与运算得到网络号。
● 子网号:子网掩码 32 位都与 IP 地址 32 位对应,如果某位是网络地址(网络号部分和子网号部分)则对应的位全为“1”,如果是主机号部分则对应的位全为“0”。将子网掩码中“1”的位数减去该类的默认子网掩码的“1”的位数即为子网号位数。
● 主机号:子网掩码取反再和 IP 地址做与运算得到主机号。
(7)子网掩码的使用例子
给定IP地址和子网掩码 172.31.128.255 / 18 (18 是网络地址(网络号和子网号的位数)的长度),则:
这个 IP 地址是 B 类地址,默认的子网掩码是255.255.0.0,所以该地址的网络号是16位。但是子网掩码中前 18 位为 1,也就是网络地址(网络号、子网号)有 18 位,则子网号有 14 位 。
● 网络号
公式:将 IP 地址的二进制和子网掩码的二进制进行“&”(and)运算,得到的结果就是网络号。“&运算”的规则是1&1=1,0&1=0,1&0=0,0&0=0。
ip: 10101100.00011111.10000000.11111111
子网掩码: 11111111.11111111.11000000.00000000
---------------------------------------------------
网络号: 10101100.00011111.10000000.00000000 &
网络号点分法表示: 172.31.128.0
● 主机号
公式:用IP地址的二进制和(子网掩码的二进制的反码)进行“&”运算,得到的结果就是主机号。反码就是将原本是0的变为1,原本是1的变为0。
ip: 10101100.00011111.10000000.11111111
子网掩码取反: 00000000.00000000.00111111.11111111
主机号: 00000000.00000000.00000000.11111111 &
主机号点分法表示: 0.0.0.255
● 广播地址
公式:在得到网络号的基础上,将网络号右边的表示IP地址的主机部分的二进制位全部填上1,再将得到的二进制数转换为十进制数就可以得到广播地址。因为本题中子网掩码 11111111.11111111.11000000.00000000,
0 有14个,主机位是 14,我们将网络号 172.31.128.0,转换为二进制是 >10101100.00011111.10000000.00000000,从右边数起,将 14 个 0 全部替换为 1, 即 >10101100.00011111.10111111.11111111,这就是这个子网的广播地址的二进制表示法。将这个二进制广>播地址转换为十进制就是 172.31.191.255。
网络号: 10101100.00011111.10000000.00000000
子网掩码: 11111111.11111111.11000000.00000000
广播地址: 10101100.00011111.10111111.11111111 网络号从右向左0填为1,个数为掩码中的0
广播地址点分法表示: 172.31.191.255
● 可用IP地址范围
因为网络号是172.31.128.0,广播地址是172.31.191.255,所以子网中可用的IP地址范围就是从网络号+1 ~广播地址-1,所以子网中的可用IP地址范围就是从172.31.128.1-172.31.191.254。
(7)子网掩码如何确定
例: 学校新建 5 个机房,每个房间有 30 台机器,如果给定一个 C 类网络地址:192.168.1.0,问如何将其划分为5个子网,子网掩码该如何设置?
子网划分建议按以下步骤和实例计算子网掩码:
● 将要划分的子网数目转换为2的m次方。如要分8个子网,8=2^3。
● 取上述要划分子网数的幂m。如2^3,即 m = 3。
● 将上一步确定的幂m按高序占用主机地址m位后转换为十进制。
● 如m为3 则是 11100000,转换为十进制为224,即为最终确定的子网掩码。
● 如果是C类网,则子网掩码为255.255.255.224;如果是B类网,则子网掩码为255.255.224.0;如果是A类网,则子网掩码为255.224.0.0。
2^3=8(大于5的最小的2的整幂次数),则子网号有 3 位,就向主机号中借走三位作为网络号,而剩下的5位主机号,每个网段内可容纳的主机数是 2^5 即 32,可用主机需要再减 2 即为 30,满足每个房间30台机器的题目要求。取2^3的幂,即3,即占用了主机号中的高 3 位即为 11100000,转换为十进制为 224,所以该地址为 C 类地址的子网掩码应该设置为 255.255.255.224。各机房IP和子网掩码配置如下(已经去掉广播地址和主机地址):
机房号 子网掩码 IP地址范围
机房1 255.255.255.224 192.168.1.1~192.168.1.30
机房2 255.255.255.224 192.168.1.33~192.168.1.62
机房3 255.255.255.224 192.168.1.65~192.168.1.94
机房4 255.255.255.224 192.168.1.97~192.168.1.126
机房5 255.255.255.224 192.168.1.129~192.168.1.158
DHCP
- 0.0.0.0表示本机IP地址;255.255.255.255是广播地址;
- 第一次主机发出的广播(发现报文),所有主机都可以接收到,但是只有DHCP服务器才会进行响应(提供报文);
- 为该主机分配IP地址;
- yladdr就是DHCP服务器给该主机分配的IP地址;
- 这个提供报文也是通过广播地址发出去的;
- 第二次主机发出的仍然是广播,也是告知其他的DHCP服务器已经跟现在的这个链接上了;(请求报文);
- 在DHCP服务器第二次回应之后,就确认绑定该IP地址的了;
网际协议——IPv6
新的子网和IP节点以惊人的增长率连接到因特网并被分配唯一的IP地址,32bit的IP地址空间即将用尽,为了应对这种情况开发了IPv6并且加强了IPv4。
IPv6数据报格式
- 扩大的地址容量。除了单播和多播地址以外,它还引入了一种称为任播地址的新型地址,这种地址可以使数据报交付给一组主机中的任意一个(例如可用于向一组包含给定文档的镜像站点的最近一个发送HTTP GET请求)
- 简化高效的40字节首部。许多IPv4字段已被舍弃或或作为选项。因而形成的40字节定长首部允许路由器更快的处理IP数据报。一种新的选项编码允许进行更灵活的选项处理。
- 流标签。IPv6有一个难以捉摸的流定义。该字段可用于“给特属于特殊流的分组加上标签,这些特殊流是发送方要求进行特殊处理的流,如一种非默认服务质量或需要实时服务的流”,比如音频和视频传输可能被认为是流,电子邮件传输就不会。高优先权用户(比如为使其流量得到更好的服务而付费的用户)承载的流量也有可能被当作一个流,可以看出即使没有一个十分精确的定义,但是设计者仍然考虑到了为了可能会出现的某种状况。
- 版本。该4bit字段用于标识IP版本号,IPv6将该字段设为6(但是IPv4不是4 )
- 流量类型。该8bit字段与IPv4的TOS(服务类型)字段相似。
- 有效载荷长度。这16bit是一个无符号整数,给出了IPv6数据报中跟在定长40字节首部后面的字节数量。
- 下一个首部。标识数据字段需要交付给哪个协议(比如TCP啥的),这个字段使用与IPv4首部中协议字段相同的值。
- 跳限制。类似于IPv4的寿命字段。
- 源和目的地址。
- 数据。这是IPv6数据报的有效载荷部分。
IPv6中没有的:
分片和重新组装:IPv6不允许数据报在路由器中进行分片和组装,这个过程只能被源和目的地执行,如果一个路由器因为一个IPv6数据报太大而无法转发到链路上的话,路由器只需要扔掉它就好了并向发送方发送一个“你这个报太大了,拆小点再发给我”的ICMP差错报文即可。分组和重新组装非常耗时,这个系统从路由器中移到端系统中将会大大提高转发效率。
首部检验和。设计者可能认为在链路层和运输层都会检验那么在网络层又检验一遍多少有点多余于是就把它删掉了。如图分片和重组、计算跳限制(或者寿命字段)一样,路由器中执行计算首部检验和也很耗时。
选项。没有了这个字段,但是不一定消失,也可能会出现在下一个首部字段。删除选项字段使得IP首部称为定长的40字节。
IPv4到IPv6的迁移
那么如果两个IPv6节点之间存在有IPv4节点那么怎么传输数据呢?我们把两个IPv6节点之间的IPv4节点集合称为隧道,当IPv6数据报到达IPv4节点后,只需要把IPv6数据报塞到IPv4数据报的有效载荷字段即可,然后正常传输。这些IPv4节点也不知道自己传的IPv4数据报中的数据字段包含有完整的IPv6数据报。穿过隧道后第一个IPv6节点通过查看IPv4数据报的协议号字段是41,指示该IPv4的有效载荷是IPv6数据报并把其取出,就好像是从一个直接相连的IPv6邻居那里接收到该IPv6数据报那样。
通用转发和SDN
我们现在考虑一种更有意义的通用“匹配加动作”范式,其中能对协议栈多个首部字段进行匹配,这些首部字段是与不同层次的不同协议相关联的。
“动作”能够包括:将分组转发到一个或多个输出端口(就像在基于目的地转发中一样),跨越多个通向服务的离开接口进行负载均衡分组(就像在负载均衡中一样),重写首部值(就像在NAT中一样),有意识阻挡/丢弃某个分组(就像在防火墙中一样),为进一步处理和动作而向某个特定的服务器发送一个分组(就像在DPI一样)等等。
因为能够使用网络层和/或链路层源和目的地址做出转发决定,所以这种转发设备更为准确的描述为“分组交换机”而不是第三层“路由器”或是第二层“交换机”
每台分组交换机又一张匹配加动作表,通过远程控制计算、安装和更新。在各台分组交换机中的控制组件可以相互作用,但是实践中通用匹配加动作能力是通过计算、安装和更新这些表的远程控制器实现的。
我们主要考虑OpenFlow1.0,该标准以特别清晰和简明的方式引入了关键的SDN抽象和功能。
匹配加动作转发表在OpenFlow中称为流表,它的每个表项包括:
首部字段值的集合,如分组将与之匹配。基于硬件匹配在TCAM内存中执行的最为迅速(TCAM内存中可能有上百万条地址表项)。匹配不上流表项的分组将被丢弃或者发送到远程控制器做更多处理。
计数器集合(当分组与流表项匹配时更新计数器)。这些计数器可以包括已经与该表项匹配的分组数量以及自从该表项上次更新以来的时间。
当分组匹配流表项时所采取的动作集合。这些动作可能将分组转发到给定的输出端口,丢弃该分组、复制该分组和将它们发送到多个输出端口,和/或重写所选的首部字段。
流表本质上是一个API,通过这种抽象每台分组交换机的行为能够被编程。
匹配
OpenFlow的匹配抽象允许对来自三个层次的协议首部所选择的字段进行匹配。
流表项可以有通配符。每个流表项也有相应的优先权,如果一个分组匹配多个流表项,选定的匹配和对应的动作将是其中有最高优先权的那个。
并不是一个IP首部中的所有字段都能被匹配,如果匹配所有就会显得过于臃肿,这种抽象化的处理也就没有什么意义了。
动作
每个流表项都有零个或多个动作列表,这些动作决定了应用于与流表项匹配的分组的处理。如果有多个动作,它们以在表中规定的次序执行。
其中最为重要的动作可能是:
转发。一个入分组可以转发到一个特定的物理输出端口,广播到所有端口(除了该分组的到达端口),或通过所选的端口集合进行多播。该分组可能被封装并发送到用于该设备的远程控制器。该控制器可能(或可能不)对该分组采取某些动作,包括安装新的流表项,以及可能将该分组返回给该设备以在更新的流表桂萼集合下进行转发。
丢弃。没有动作的流表项表明某个匹配的分组应该被丢弃。
修改字段。在分组被转发到所选输出端口之前,分组首部十个字段(除IP协议字段外的所有第二、三、四层的字段)中的值可以重写。
控制平面
完成转发表和流表的工作有两种可能的方法:
- **路由器控制:**每台路由器中都包含转发和路由选择功能,每台路由器都有一个路由选择组件,用于与其他路由器中的路由选择组件通信,以计算其转发表的值。
- **逻辑集中式控制:**通用的“匹配加动作”抽象允许执行传统的IP转发以及其他功能(负载共享、防火墙功能和NAT)的丰富集合,而这些功能先前是在单独的中间盒实现的 。
该控制器经一种定义良好的协议与每台路由器中的一个控制代理(CA)进行交互。以配置和管理该路由器的转发表。CA一般具有最少的功能,其任务是与控制器通信并且按控制器命令行事。CA这里的交互是被动的,也就是说不同CA不能直接相互交互和主动参与计算转发表。这是和前者的关键差异。
路由选择算法
用图G = ( N , E ) 来描述路由选择问题,是一个N个节点和E条边的集合,其中每条边是取自N的一对节点。节点表示路由器,这是做出分组转发决定的点;连接这些节点的边表示这些路由器之间的物理链路。一条边还有一个值表示它的开销,用c(x,y)表示节点x和y之间的开销,并且这里讨论的是无向图。如果x和y都属于E,那么x也被称为y的邻居。
路由是最低开销路径是找出源与目的地之间具有最低开销的一条路
- 较好路径:按照某种指标较小的路径
- 指标:站数,延迟,费用,队列长度等,或者是一些单纯指标的加权平均
- 采用什么样的指标,表示网络使用者希望网络在什么方面表现突出,什么指标网络使用者比较重视
**分类方式:**一般而言,路由选择算法的一种分类方式是根据该算法是集中式还是分散式来划分的。
集中式路由选择算法用完整的、全局性的网络知识计算出从源到目的地之间的最低路径开销。也就是说该算法以所有节点之间的连通性及所有链路的开销为输入。主要区别在于集中式算法具有关于连通性和链路开销方面的完整信息。具有全局状态的算法被称为链路状态(LS)算法,因为该算法得知道网络中具体每条路径的开销。
在分散式路由选择算法中,路由器以迭代、分布式的方式计算出最低开销路径。没有节点拥有全部的网络链路开销的完整信息。相反,每个节点仅有与其直接相连的链路的开销知识即可开始工作。通过迭代计算过程以及与相邻节点的信息交换,一个节点逐渐计算出到达某目的节点或一组目的节点的最低开销路径。
第二种广义分类方式是根据算法是动态的还是静态的。静态路由选择算法中路由随时间变化非常缓慢,通常是人工进行调整。动态路由选择算法随着网络流量负载或拓补发生变化而改变路由选择路径。一个动态算法可周期性的运行或直接响应拓补或链路开销的变化而运行。
第三种分类方式是根据它是负载敏感的还是负载迟钝的进行划分。在负载敏感算法中,链路开销会动态地变化以反映出底层链路的当前拥塞水平。当前的因特网路由选择算法都是负载迟钝的,因为某条链路的开销不明确的反映其当前或最近的拥塞水平。
链路状态路由算法:link state
迪杰斯特拉算法
迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径。它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。
LS路由的工作过程
各点通过各种渠道获得整个网络拓扑,网络中所有链路代价等信息(这部分和算法没关系,属于协议和实现)
就是说每个点都得到了除去自己点的所有点到邻居点的路径信息
使用LS路由算法,计算本站点到其它站点的最优路径(汇集树),得到路由表
按照此路由表转发分组(datagram方式)
- 严格意义上说不是路由的一个步骤
- 分发到输入端口的网络层
具体过程
- 发现相邻节点,获知对方网络地址
- 测量到相邻节点的代价(延迟,开销)
- 组装一个LS分组,描述它到相邻节点的代价情况
- 将分组通过扩散的方法发到所有其它路由器以上4步让每个路由器获得拓扑和边代价
- 通过
Dijkstra
算法找出最短路径(这才是路由算法)
距离向量路由算法:distance vector routing
动态规划算法
由动态规划方程(策略),将每次的选择带入最终得到结果,详细可以自行查阅
基本思路
-
各路由器维护一张路由表,结构如图(其它代价) ,维护全部的节点
-
各路由器与相邻路由器交换路由表(待续)
-
根据获得的路由信息,更新路由表(待续)
具体过程
-
每个节点都将自己的距离矢量估计值传送给邻居,定时或者DV有变化时,让对方去算
-
当x从邻居收到DV时,自己运算,更新它自己的距离矢量 , 采用B-F equation:
Dx(y) ← minv{c(x,v) + Dv(y)} 对于每个节点y ∊ N
X往y的代价 x到邻居v代价 v声称到y的代价
-
Dx(y)估计值最终收敛于实际的最小代价值dx(y),分布式、迭代算法
特点
好消息传的快 坏消息传的慢
好消息传的快
类似于当链路可同通过每一次的迭代更新至全网是非常容易的,已经时正向的在更新
坏消息传的慢
当某一时刻起始点到某个点的链路断掉,又是因为迭代问题我们需要从头开始往后更新信息说链路断了,但是此时后面的节点到起始点的代价都是有值状态,当迭代更新到起始点的第二个节点时发现断了准备更新数值,这时第三个点告诉他兄弟我这条到起始点的路没断你就更新成我的代价吧,其实这个时候由于迭代的问题后面的点压根不知道前面是断的,导致了信息错误。
LS、DV算法对比
因特网自治系统内部路由选择——OSPF
概述
-
“open”:标准可公开获得
-
使用LS算法
-
LS分组在网络中(一个AS内部)分发
-
全局网络拓扑、代价在每一个节点中都保持
-
路由计算采用Dijkstra算法
-
-
OSPF通告信息中携带:每一个邻居路由器一个表项
-
通告信息会传遍AS全部(通过泛洪)
-
在IP数据报上直接传送OSPF报文(而不是通过UDP和TCP,这跟RIP有不同)
OSPF “高级” 特性
- 安全:所有的OSPF报文都是经过认证的(防止恶意的攻击)
- 允许有多个代价相同的路径存在(在RIP协议中只有一个)
- 对于每一个链路,对于不同的TOS有多重代价矩阵
例如:卫星链路代价对于尽力而为的服务代价设置比较低,对实时服务代价设置的比较高
支持按照不同的代价计算最优路径,如:按照时间和延迟分别计算最优路径
-
对单播和多播的集成支持:
Multicast OSPF(MOSPF)使用相同的拓扑数据库,就像在OSPF中一样
-
在大型网络中支持层次性OSPF
层次化的OSPF路由
2个级别的层次性:本地,骨干
链路状态通告仅仅在本地区域Area范围内进行
每一个节点拥有本地区域的拓扑信息;关于其他区域,知道去它的方向,通过区域边界路由器(最短路径)
区域边界路由器:“汇总(聚集)”到自己区域内网络的距离,向其它区域边界路由器通告.
骨干路由器:仅仅在骨干区域内,运行OSPF路由
边界路由器:连接其它的AS’s.
ISP之间路由选择——BGP
层次路由
1.1 平面路由概述
一个网络中的所有路由器的地位一样
通过LS,DV,或者其他路由算法,所有路由器都要知道其他所有路由器(子网)如何走
所有路由器在一个平面
1.2 平面路由的问题
规模巨大的网络中,路由信息的存储、传输和计算代价巨大
DV:距离矢量很大,且不能够收敛
LS:几百万个节点的LS分组的泛洪传输,存储以及最短路径算法的计算
管理问题:
不同的网络所有者希望按照自己的方式管理网络
希望对外隐藏自己网络的细节
当然,还希望和其它网络互联
1.3 层次路由
将互联网分成一个个AS(路由器区域)
某个区域内的路由器集合,自治系统“autonomous systems” (AS)
一个AS用AS Number(ASN) 唯一标示
一个ISP可能包括1个或者多个AS
路由变成了: 2个层次路由
AS内部路由:在同一个AS内路由器运行相同的路由协议
“intra-AS” routing protocol:内部网关协议
不同的AS可能运行着不同的内部网关协议
能够解决规模和管理问题
如:RIP,OSPF,IGRP
网关路由器:AS边缘路由器,可以连接到其他AS
AS间运行AS间路由协议
“inter-AS” routing protocol:外部网关协议
解决AS之间的路由问题,完成AS之间的互联互通
1.4 层次路由的优点
1.4.1 解决了规模问题
内部网关协议解决:AS内部数量有限的路由器相互到达的问题, AS内部规模可控
如AS节点太多,可分割AS,使得AS内部的节点数量有限
AS之间的路由的规模问题
增加一个AS,对于AS之间的路由从总体上来说,只是增加了一个节点=子网(每个AS可以用一个点来表示)
对于其他AS来说只是增加了一个表项,就是这个新增的AS如何走的问题
扩展性强:规模增大,性能不会减得太多
1.4.2 解决了管理问题
各个AS可以运行不同的内部网关协议
可以使自己网络的细节不向外透露
互联网AS间路由:BGP
前面我们采用层次路由的办法来解决节点数量过多导致的效率下降问题,那么在层次路由划分为无数个AS后,这些大的AS应该采用什么协议来通信呢,这时BGP就应运而生
- 使用TCP协议报文传输
BGP报文
BGP概述
BGP (Border Gateway Protocol):自治区域间路由协议“事实上的”标准
“将互联网各个AS粘在一起的胶水”
BGP 提供给每个AS以以下方法:
e(外部)BGP: 从相邻的ASes那里获得子网可达信息
i(内部)BGP: 将获得的子网可达信息传遍到AS内部的所有路由器
根据子网可达信息和策略来决定到达子网的“好”路径
- 允许子网向互联网其他网络通告“我在这里”
- 基于距离矢量算法(路径矢量)
不仅仅是距离矢量,还包括到达各个目标网络的详细路径(AS 序号的列表)能够避免简单DV算法的路由环路问题
BGP基础
- BGP 会话: 2个BGP路由器(“peers”)在一个半永久的
TCP
连接上交换BGP报文:
通告向不同目标子网前缀的“路径”(BGP是一个“路径矢量”协议)
基于策略的路由:
当一个网关路由器接收到了一个路由通告, 使用输入策略来接受或过滤(accept/decline.)
过滤原因例1:不想经过某个AS,转发某些前缀的分组
过滤原因例2:已经有了一条往某前缀的偏好路径
策略也决定了是否向它别的邻居通告收到的这个路由信息
BGP 路径选择
路由器可能获得一个网络前缀的多个路径,路由器必须进行路径的选择,路由选择可以基于:
本地偏好值属性: 偏好策略决定
最短AS-PATH :AS的跳数
最近的NEXT-HOP路由器:热土豆路由
附加的判据:使用BGP标示
一个前缀对应着多种路径,采用消除规则直到留下一条路径
热土豆策略
- 2d通过iBGP获知,它可以通过2a或者2c到达X
选择具备最小内部区域代价的网关作为往X的出口(如:2d选择2a,即使往X可能有比较多的AS跳数):不要操心域间的代价!
为什么内部网关协议和外部网关协议如此不同?
1 策略
Inter-AS(内部): 管理员需要控制通信路径,谁在使用它的网络进行数据传输;
Intra-AS(外部): 一个管理者,所以无需策略;
AS内部的各子网的主机尽可能地利用资源进行快速路由
2 规模
AS间路由必须考虑规模问题,以便支持全网的数据转发
AS内部路由规模不是一个大的问题
如果AS 太大,可将此AS分成小的AS;规模可控
AS之间只不过多了一个点而已
或者AS内部路由支持层次性,层次性路由节约了表空间, 降低了更新的数据流量
3 性能
Intra-AS: 关注性能
Inter-AS: 策略可能比性能更重要