《计算机网络自顶向下方法》学习笔记03:网络层。
网络层提供了主机到主机的通信服务。网络中的每一台主机和路由器都有网络层部分。网络层能够被分解为两部分,数据平面和控制平面。
第四章 网络层:数据平面
1.概述
网络层的任务是取得源主机的报文段,将其封装为数据报,通过路由器的转发,将数据报发送到目的主机的网络层。可以说,网络层的作用就是将分组从一台主机移动到另一台主机。网络层的功能可分为两部分:
- 转发:路由器将输入链路的分组移动到适当的输出链路的路由器本地动作。是数据平面的主要任务。
- 路由选择:决定分组移动所采用的端到端路径。
本章主要讨论的是网络层的转发功能。
2.路由器工作原理
路由器由如下几个组件构成:
- 输入端口
- 交换结构
- 输出端口
- 路由选择处理器
输入端口处理
输入端口的处理:
线路端接----->数据链路处理(协议,拆封)----->查找,转发,排队----->交换结构
在输入端口,路由器将使用转发表查找输出端口,然后将分组交给交换结构。转发表是由路由选择处理器计算和更新的。转发表可能由路由选择协议计算,也可能接收远程SDN控制器的内容,再复制到线路卡上。
交换
通过交换结构,路由器将分组从输入端口转发到一个输出端口。交换的方式有以下几种:
- 经内存交换:最早的路由器的交换是由路由选择处理器的直接控制完成的,输入输出端口类似于IO设备,收到分组后,通过中断向处理器发出信号,处理器提取目的地址,并将分组复制到输出端口的缓存中。现代路由器对目的地址的查找和分组存储是由输入线路卡来处理的。
- 经总线交换:输入端口经一根总线将分组直接传送到输出端口。需要输入端口提前为分组计划一个标签,指示本地输出端口,所有输出端口都能收到总线的该分组,但只有与标签匹配的输出端口才保存该分组,并将标签去掉。
- 经互联网络交换:通过更加复杂的互联网络进行交换,例如纵横式网络。
输出端口处理
输出端口的处理如下:
交换结构----->排队(缓存管理)----->数据链路处理(协议,封装)----->线路端接
排队
排队可能出现在输入端口,也可能出现在输出端口,这取决于流量负载,交换结构的速率等。随着队列增长,路由器缓存空间耗尽,就会发生丢包。
在输入端口,如果两个分组是发往同一个输出端口,就会有一个分组被阻塞,必须在队列中等待。而排在该等待分组后面的分组也要等待,尽管他的输出端口没有被占用,这种现象叫做输入排队交换机中的线路前部阻塞。
在输出端口,由于输出端口的发送速率是受到限制的,也可能形成排队的队列。当没有足够内存缓存分组时,必须丢弃到达的分组,或者删除一个或多个排队的分组为新分组留出空间。某些情况下,缓存填满前就丢弃一个分组,可以向发送方提供一个拥塞信号。关于分组丢弃和标记的策略,被称为主动队列管理算法。
路由器需要缓存来吸收流量负载的波动。多年以来,缓存长度的经验值是RTT乘链路容量C。最近的研究表明,有大量的TCP流过一条链路时,缓存数为B=RTT*C*n^(-1/2)。
排队分组如何经输出链路传输,需要使用到分组调度策略。常用的策略有以下几种:
- 先进先出
- 优先权排队
- 循环排队
- 加权公平排队(WFQ):在循环排队的基础上,为每个类分配一个权,该类收到的服务为这个权值/所有类别权值之和。然而事实上,不能打断一个分组的传输开始传输另一个分组,因此保证权重是不现实的。
3.网际协议
3.1 IPv4数据报首部格式
- 版本:表示IP协议的版本
- 首部长度:4字节,表示IP数据报首部的长度,该字段的取值以4字节为单位,最小取值为5,表示只有20字节固定部分,最大取值为15,表示IP数据报首部包含20字节固定部分和最大40字节可变部分
- 可选字段:用于支持排错,测量,安全等,由于长度不定增加了路由器处理IP数据报的开销,实际上很少使用
- 填充:填充保证IP数据报首部为4字节的整数倍
- 区分服务字段:用数值提供不同等级的服务质量,一般情况下都不使用该字段
- 总长度字段:表示IP数据报总长度(首部+数据载荷)
- 标识,标志,片偏移用于IP数据报分片。当IP数据报长度超过帧的数据载荷的最大长度(最大传输单元MTU),无法封装,需要分片
- 标识:同一个数据报的各分片数据报有相同标识。IP软件维持计数器,每产生一个数据报,计数加1,并将该值赋给标识字段
- 标志:3bit
- DF位:1表示允许分片
- MF位:1表示还有分片,0表示这是最后一个分片
- 保留位:必须为0
- 片偏移:以8个字节为单位。指出分片数据报的数据载荷部分偏移其原数据报的位置
- 生存时间TTL:最初以秒为单位,最大生存周期为255秒,在路由器转发时减去在本路由器上耗费的时间。现在以跳数为单位,路由器转发时-1。
- 协议字段:指明数据部分是何种协议数据单元
- 1:ICMP报文
- 6:TCP报文
- 首部检验和:使用因特网检验和检测首部在传输过程中是否出现差错。由于IP层不提供可靠传输服务,因此IPv6中,路由器不再计算首部校验和。
3.2 IPv4数据报分片
一个链路层帧能承载的最大数据量叫做最大传送单元MTU。每个IP数据报的大小都受到MTU的限制。在传输过程中,不同链路可能存在不同的MTU,这导致IP数据报可能不得不被分成多部分。为了避免路由器的性能受影响,IPv4的设计者将数据报的重组工作放到端系统中。当目的主机的网络层收到一系列数据报时,通过IP数据报首部的标识,标志和片偏移字段将IPv4数据报重组。
3.3 IPv4编址
主机与物理链路的边界称为接口,路由器与任何一条链路的边界也称为接口。每台主机与路由器都能发送和接收IP数据报,因此每个接口都有自己的IP地址。每个IP地址长度为32bit,用点分十进制表示。例如:192.32.216.9/24。/24表示子网掩码,表示一个子网络的前24位都是相同的,后8位用于区分子网中的主机。需要注意,路由器接口也可以构成子网。
早期的IP地址,网络部分被限制为8,16,24位,从而将子网分为A,B,C三类网络,这种编址被称为分类编址。由于分类编址不够灵活,只有三种分类,现在采用的是CIDR无类别域间路由选择,IP地址都表示为a.b.c.d/x。
每个接口都需要有一个IP地址,这个地址并不是随着设备的产生就分配好的,而是获取的。首先,一个组织要获取一块地址,需要向ISP请求,而ISP的IP地址分配是由因特网名字和编号分配机构管理的。一个组织获取了一块地址,就可以为组织内的主机与路由器接口逐个分配IP地址。路由器中的IP地址常由管理员手工配置。而主机地址的配置,可以手工进行,但主要是使用动态主机配置协议DHCP完成的。DHCP允许主机自动获取一个临时的IP地址,还允许主机获取子网掩码,第一跳路由器地址(默认网关),DNS服务器地址等信息。DHCP被称为即插即用协议或零配置协议,因为有能让主机自动连接进一个网络的能力。每个子网都有一个DHCP服务器,或一个中继代理。一个主机通过DHCP获取一个IP地址的过程如下:
- DHCP服务器发现:主机在UDP分组中向端口67发送DHCP发现报文。源IP地址为0.0.0.0,目的IP地址为广播地址255.255.255.255。
- DHCP服务器提供:接收到DHCP发现报文后,DHCP服务器广播响应报文,报文的内容包含IP地址,租用期等。
- DHCP请求:客户向选中的DHCP服务器(可能有多个DHCP服务器,客户可以择优选择)发送DHCP请求报文,回显配置参数。
- DHCP ACK:服务器用DHCP ACK报文响应请求。
3.4 网络地址转换
一个子网从ISP获取一块地址后,就可以管理和分配地址了,但一个子网很可能扩张,例如在一个家庭中,电子设备越来越多。对于这种情况,可以使用一种简单的方法来管理地址:网络地址转换NAT。家庭网络内的编址可以为10.0.0.0/8,这是RFC保留的一部分IP地址空间,用于家庭网络等专用网络或具有专用地址的地域。这些地址只能在特定的网络中使用,不能在更大的网络空间使用。NAT使能路由器的作用就是将家庭网络中的专用地址进行转换,对外界隐藏网络内部细节。所有离开家庭网络的地址都是同一个,所有进入该网络的目的IP地址也是同一个。NAT路由器有一张NAT路由表,将内部主机IP地址,源端口号,与一个新端口号联系起来。NAT路由器完成了数据报到内部网络的转发工作。
采用这种方式,内部网络的端口号和IP都被NAT转换为新IP和新端口号了,如果内部网络运行服务器,就会导致没有确定的用于等待的周知端口,解决方案是采用NAT穿越工具和通用即插即用协议。
3.5 IPv6
为了应对IPv4地址空间耗尽的问题,以及对IPv4实践中的问题进行优化,IPv6发布了。IPv6有128bit的地址容量,这样地址将不会耗尽了。比起IPv4,IPv6不支持分片和重新组装,直接丢弃数据报,使用ICMP报文告知发送方发送更小的IP数据报。首部检验和也不存在了,因为运输层和数据链路层已经提供了检验操作,所以去除了IP数据报的检验,这也减少了处理分组的时间,因为首部中有TTL字段,原来每一条都要重新计算检验和。现在从IPv4到IPv6的迁移正在进行中,实践出了建隧道等方法,但要完全完成这个迁移,仍然需要解决很多困难和时间。
第五章 网络层:控制平面
1.概述
网络层的控制功能包括控制沿着源主机到目的主机的端到端路径间的路由器如何转发数据报,以及控制网络层组件和服务如何配置和管理。完成这些控制功能有两种方式:
- 每路由器控制:每个路由器都包含转发和路由选择功能,路由器都有一个路由选择组件,和其他路由器通信计算转发表的值。
- 逻辑集中式控制:由逻辑集中式控制器计算并分发转发表供每台路由器使用。
2.路由选择算法
路由选择算法是选择从发送方到接收方的一条最好路径的算法。最好的路径通常指最小开销的路径,而开销可能由多种因素决定,在考虑路由选择算法时,先假定开销都是给出的。路由选择算法有很多种分类方式:
按照集中和分散进行分类:
- 集中式路由选择算法:用完整的全局的网络状态信息计算最低开销路径。该类算法常被称作链路状态算法LS。
- 分散式路由选择算法:路由器以迭代,分布式的方式计算最低开销路径。节点通过迭代计算以及与相邻节点的信息交换逐渐算出最低开销路径。例如距离向量算法DV就是一个分散式路由选择算法。
按照静态动态分类:
- 静态路由选择算法:通常人工进行调整。
- 动态路由选择算法:随着网络负载和拓扑变化而改变路径。
根据对负载是否敏感划分:
- 负载敏感算法:链路开销动态变化,反映底层链路拥塞水平没路由选择算法趋于绕开拥塞链路。
- 负载迟钝算法:开销不变化。因为开销不明确反映拥塞水平,当今的路由器选择算法都是负载迟钝的。
3.因特网自治系统内部的路由选择算法:OSPF
让所有路由器执行相同的路由选择算法是不可能的。一方面,因特网的规模十分庞大,在所有主机中存储所有路由选择信息是不现实的。另一方面,每个ISP有自己的路由器网络,希望按自己的意愿运行路由器,或对外部隐藏网络内部的组织面貌。因此路由器通常被组织进自治系统(AS),每个AS由一组处在相同管理控制下的路由器组成。在相同AS中的路由器运行相同的路由选择协议且有彼此的信息。在一个自治系统内运行的路由选择算法叫做自治系统内部路由选择协议。
开放最短路优先(OSPF)算法是广泛应用于因特网的AS内部路由选择的一种算法。OSPF使用洪泛链路状态信息和Dijkstra最短路径算法。链路的开销由网络管理员配置。例如将链路开销都设置为1,实现的就是最少跳数路由选择。使用OSPF时,路由器向自治系统内所有其他路由器广播路由选择信息,当链路状态变化或经过一个特定周期,路由器就会广播链路状态信息。OSPF的优点包括:
- 安全:使用鉴别,仅有受信任的路由器能参与一个AS内的OSPF协议。
- 多条相同开销的路径:对于多条相同开销路径,OSPF允许使用多条路径。
- 对单播与多播路由选择的综合支持。
- 支持单个AS中的层次结构:一个OSPF自治系统能够层次化配置多个区域,每个区域都运行自己的OSPF链路状态路由选择算法,路由器只在区域内进行广播,一台或多台边界路由器负责为流向区域外的分组提供路由选择。
4.ISP之间的路由选择:BGP
上述的OSPF是AS内部的路由选择协议,当分组跨越多个AS时,需要使用不同AS之间的路由选择协议。在因特网中,AS运行相同的AS间路由选择协议,称为边界网关协议BGP。
对于BGP来说,只要把分组送到分组的目标网络,不需要考虑送到目标主机的问题。因此BGP中,一个目的地是一个地址前缀,即一个网络。BGP通过两个手段将分组送到目标网络:
- 从邻居AS获取前缀的可达性信息。BGP允许每个子网向因特网中的其他部分通告自己的存在,这样一个AS就知道一个子网的存在,才可能将分组送达这个子网。
- 确定最好的路由路径:基于策略和可达性信息,路由器会选择一条尽可能好的路由路径传送分组。
下面从这两个方面分析BGP的工作原理。
4.1 通告BGP路由信息
一个路由器总是在一个AS内或在AS边缘,因此不是网关路由器就是内部路由器。其中网关路由器在AS的边缘,且与另一个AS的路由器相连。一个网络的存在和到达的路径,是路由器发送BGP报文进行通告的。路由器通过使用179端口的半永久TCP连接交换路由选择信息,每条路由器之间的连接和发送的BGP报文,称为BGP连接。跨越两个AS的BGP连接为外部BGP(eBGP),AS内部路由器的BGP会话为内部BGP(iBGP)。网关路由器首先通过eBGP告知另一个AS的网关路由器自己的存在和可达性信息(路径),收到该信息的路由器使用iBGP将信息告知同一个AS内的其他路由器,这样该AS的所有路由器就知道了到达另一个AS的路径。
4.2 路由选择
在考虑BGP的路由选择策略前,需要理解AS-PATH和NEXT-HOP。AS-PATH就是从当前AS到达一个AS的路径,当然,如果要通告给其他AS,路径还要加上自己。例如AS1到达AS10的路径为AS2-AS5-AS10,那么通告的路径就是AS1-AS2-AS5-AS10。到达一个AS可能有多条路径,因此有多个AS-PATH。NEXT-HOP则是AS-PATH起始地址的路由器接口IP地址。路由选择算法就是在多个AS-PATH中选择一个合适的路径的算法。BGP按照顺序使用以下规则选择路由,直到只剩下一条路径:
- 路由器的本地偏好将被优先选择。本地偏好是网络管理员设置的。
- 余下的路由中,选择具有最短AS的路由,使用距离向量算法,距离是AS的跳数而不是路由器的跳数。
- 余下的路由中,选择最靠近NEXT-HOP路由器的路由。
- 如果仍留下多条路由,使用BGP标识符来选择路由。