网络层
提出问题
- 主机到主机通信服务的真实情况是什么?是什么使得它工作起来的呢?
概述
网络层实现主机到主机的通信服务,在每一台路由器与主机上都有一个网络层部分。
网络层有多种构造网络层分组交付的方法,比较重要的有:数据报模式和虚电路模式。
三个重要组件:IP协议、路由选择、ICMP协议(报告数据报中的差错和对某些网络层的请求做响应的设施)。
分组交换机:一台通用的分组交换设备,根据分组首部字段的值,从输入链路接口到输出链路接口转移分组。基于链路层字段做转发决定的为链路层交换机,其他的叫路由器,基于网络层字段做转发决定。
网络层功能与服务
功能:转发、路由选择、连接建立(要求从源到目的地沿着所选择的路径彼此握手)。
- 转发。涉及分组在单一的路由器中从一条入链路到一条出链路的传送。
- 路由选择涉及一个网络的所有路由器,他们经路由选择协议共同交互,以决定分组从源到目的地节点所采用的路径。
网络服务模型:定义了分组在发送与接收端之间端到端的运输特性。
网络层(ATM CBR,ATM ABR等提供恒定比特率与可用比特率的服务)可以提供某些特定服务,但是因特网的网络层只提供尽力而为的服务:
- 确保交付。
- 具有时延上限的确保交付。
- 有序分组交付。
- 确保最小带宽。
- 确保最大时延抖动。
- 安全性服务。
虚电路与数据报网络
在当下的计算机网络体系结构当中,只提供两种服务之一,而不同时提供两种服务:
虚电路网络
仅在网络层提供连接服务的计算机网络。使用在ATM、帧中断的体系结构中。
组成:
- 源和目的主机间的路径。
- VC号,沿着该路径每段链路的一个号码。
- 沿着该路径的每台路由器中的转发表表项。
过程:
- 虚电路建立。
- 数据传输。
- 虚电路拆除。
数据报网络
仅在网络层提供无连接服务的计算机网络。
因为因特网对网络层有最小限度的需求,使得互联网使用不同的链路层技术更加容易,而且具有不同的传输速率。并且使得web等服务可以在互联网上很快地部署。
每当一个端系统要发送分组,就为该分组加上目的端系统的地址,然后将分组推入网络当中。
路由器
转发:分组在单一的路由器由一条入链路到一条出链路的传送。
转发表:每台路由器有一张转发表,通过检查分组首部字段的值来转发分组,利用值在转发表查询索引。其值由路由选择算法插入。
转发表当中不可能对每一个地址都存放一个表项,因此使用了前缀匹配,即将目的地址的比特与转发表的前缀进行匹配,如果前缀匹配成功,则转发向对应的端口,如果有多个匹配,则转发向最长前缀所对应的端口(最长前缀匹配原则),如果没有匹配则转发向其他端口。
路由器的结构
路由器从功能上可以划分为:路由选择和分组转发。(硬件实现,速度更快)。
分组转发结构由三个部分组成:交换结构、一组输入端口和一组输出端口。类似于高速公路的收费站。
因为路由器可能在同一时间处理数量巨大的流,因此设计尽量简单,并且采用数据报网络层,使用一种流水线和固定长度的首部(IPv6),取消分片(IPv6),和提供唯一的尽力而为服务。
输入端口:查询转发表,找到对应的输出端口。
交换结构:将分组转换到对应的输出端口。
路由选择处理机:执行路由选择协议,维护路由选择表与连接的链路状态信息,并计算转发表,执行网络管理功能。
排队:输入与输出端口的序列,如果排队过长将耗尽路由器的缓存空间,出现丢包。
路由器分组转发流程
主机通常直接与一台路由器相连接,改路由器即为改主机的默认路由器,又称为改主机的第一跳路由器。一个分组从源主机到目的主机的路由选择问题显然可归结为从源路由器到目的路由器的路由选择问题。
- 从数据报的首部提取目的主机的IP地址D,得到目的网络地址N。
- 若N就是与此路由器直接相连的某个网络地址,则进行直接交付。
- 若路由表中有目的地址为D的特定主机路由,则把数据报传送给表中所指明的下一跳路由器。
- 若路由表中有到达网络N的路由,则把数据报传送给路由表中所指明的下一跳路由器。
- 若路由表中有一个默认路由,则把数据报传送给路由表中所指明的默认路由器。
- 报告转发分组出错。
路由选择协议
路由选择协议都是自适应的,能随着网络通信量和拓扑结构的变化而自适应地进行调整。
互联网可以划分为许多较小的自治系统AS,一个AS可以使用一种和别的AS不同的路由选择协议。
可以把路由选择协议划分为两大类:
- 自治系统内部的路由选择:RIP和OSPF。
- 自治系统间的路由选择:BGP。
路由选择算法
路由选择算法的目的是简单的:给定一组路由器以及连接路由器的链路,路由选择算法要找到一条从源路由器到目的路由器的“好”路径。即具有最低费用的路径。
- 全局式路由选择算法。用完整的、全局性的网络知识计算出从源到目的地之间的最低费用路径。
- 因此该算法以所有结点之间的连通性及所有链路的费用作为输入,则该算法需要在计算前以某种方式获得这些信息。
- 实践中,具有全局状态信息的算法常被称作链路状态(LS)算法。
- 分散式路由选择算法。以迭代、分布式的方式计算出最低费用路径。
- 没有结点拥有关于所有网络链路费用的完整信息,而每个结点仅有与其直接相连链路的知识即可工作。
- 通过迭代计算过程并与相邻节点交换信息,一个节点逐渐计算出到达某目的节点或一组目的节点的最低费用路径。即距离向量(DV)算法。
内部网关协议 RIP
RIP是一种基于距离向量的路由选择协议。距离是指跳数,直接相连的路由器跳数为1。跳数最多为15,超过15表示不可达。
RIP按固定的时间间隔仅和相邻路由器交换自己的路由表,经过若干次交换之后,所有路由器最终会知道到达本自治系统中任何一个网络的最短距离和下一跳路由器地址。
距离向量算法:
- 对地址为X的相邻路由器发来的RIP报文,先修改报文中的所有项目,把下一跳字段中的地址改为X,并把所有的距离字段加1。
- 对修改后的RIP报文中的每一个项目,进行以下步骤:
- 若原来的路由表中没有目的网络N,则把该项目添加到路由表中。
- 否则,若下一跳路由器地址是X,则把收到的项目替换原来路由表中的项目。
- 否则:若收到的项目中的距离d小于路由表中的距离,则进行更新(例如原始路由表项为Net2,5,P,新表项为Net2,4,X,则更新)。
- 否则什么也不做。
- 否则:若收到的项目中的距离d小于路由表中的距离,则进行更新(例如原始路由表项为Net2,5,P,新表项为Net2,4,X,则更新)。
- 若3分钟还没有收到相邻路由器的更新路由表,则把该相邻路由器标为不可达,即把距离置为16。
RIP协议实现简单,开销小。但是RIP能使用的最大距离为15,限制了网络的规模。并且当网络出现故障时,要经过比较长的时间才能将此消息传送到所有路由器。
内部网关协议 OSPF
开放最短路径优先OSPF,是为了克服RIP的缺点而开发出来的。
开放表示OSPF不受某一家厂商控制,而是公开发表的;最短路径优先表示使用了Dijkstra提出的最短路径算法SPF。
OSPF具有以下特点:
- 向本自治系统中的所有路由器发送信息,这种方法是洪泛法。
- 发送的信息就是与相邻路由器的链路状态,链路状态包括与哪些路由器相连以及链路的度量,度量用费用、距离、时延、带宽等来表示。
- 只有当链路状态发生变化时,路由器才会发送信息。
所有路由器都具有全网的拓扑结构图,并且是一致的。相比于RIP,OSPF的更新过程收敛的很快。
外部网关协议 BGP
BGP(Border Gateway Protocol,边界网关协议):
AS之间的路由选择很困难,主要是由于:
- 互联网规模很大。
- 各个AS内部使用不同的路由选择协议,无法准确定义路径的度量。
- AS之间的路由选择必须考虑有关的策略,比如有些AS不愿意让其它AS经过。
BGP只能寻找一条比较好的路由,而不是最佳路由。
每个AS都必须配置BGP发言人,通过在两个相邻BGP发言人之间建立TCP连接来交换路由信息。
IP协议
IP的服务模型是尽力而为地交付服务,即尽最大的努力,不确保报文段的交付,不保证报文段的按序交付,不保证报文段中数据的完整性。即IP是不可靠的服务。
IPv4、IPv6。
概述
因为网络层是整个互联网的核心,因此应当让网络层尽可能简单。网络层向上只提供简单灵活的、无连接的、尽最大努力交互的数据报服务。
使用IP协议,可以把异构的物理网络连接起来,使得在网络层看起来好像是一个统一的网络。
与IP协议配套使用的还有三个协议:
- 地址解析协议ARP(Address Resolution Protocol)。
- 网际控制报文协议ICMP(Internet Control Message Protocol)。
- 网际组管理协议IGMP(Internet Group Management Protocol)。
IP 数据报格式
- 版本:有4(IPv4)和6(IPv6)两个值。
- 首部长度:占4位,因此最大值为15。值为1表示的是1个32位字的长度,也就是4字节。因为首部固定长度为20字节,因此该值最小为5。如果可选字段的长度不是4字节的整数倍,就用尾部的填充部分来填充。
- 区分服务:用来获得更好的服务,一般情况下不使用。
- 总长度:包括首部长度和数据部分长度。
- 生存时间:TTL,它的存在是为了防止无法交付的数据报在互联网中不断兜圈子。以路由器跳数为单位,当TTL = 0 时就丢弃数据报。
- 协议:指出携带的数据应该上交给哪个协议进行处理,例如ICMP、TCP、UDP等。
- 首部检验和:因为数据报每经过一个路由器,都要重新计算检验和,因此检验和不包含数据部分可以减少计算的工作量。
- 标识:在数据报长度过长从而发生分片的情况下,相同数据报的不同分片具有相同的标识符。
- 片偏移:和标识符一起,用于发生分片的情况。片偏移的单位为8字节。
IP数据报分片:
当链路层帧能承载的最大数据量(最大传送单元MTU)小于IP数据报长度,将数据报中的数据分片,然后用单独的链路层帧封装(在端系统重新组装,路由器不会组装),分片需要在全部接受(依据标识,标志与片偏移量进行分辨,最后一片的标识比特为0,其余为1)后才能进行组装为原本的数据,因此有时候会被用于dos攻击。
IP 地址编址方式
IPv4:
在因特网的每台主机与路由器的每个接口都必须有唯一IP地址(NAT后接口除外)。
在该图当中,IP地址左侧3个数字相同,即左侧24位比特的值是相同的。这4个接口(3主机+路由)也通过一个不包含路由器的网络互联起来,如以太网LAN等。互联这三个主机接口与1个路由器接口的网路构成1个子网,IP编址为这个子网分配一个地址,223.1.1.0/24,/24即子网掩码,指示最左侧的24字节定义了子网地址。
任何要连接到该子网的主机都要求其地址为223.1.1.xxx。
因特网的地址分配策略称为无类别域间路由选择CIDR,a.b.c.d/x,x的最高比特构成了IP地址的网络部分,也是该网络地址的前缀。
IP地址的编址方式经历了三个历史阶段:
- 分类。
- 子网划分/
- 无分类。
分类
由两部分组成,网络号和主机号,其中不同分类具有不同的网络号长度,并且是固定的。
IP 地址 ::= {< 网络号 >, < 主机号 >}。
子网划分
通过在主机号字段中拿一部分作为子网号,把两级 IP 地址划分为三级 IP 地址。
IP 地址 ::= {< 网络号 >, < 子网号 >, < 主机号 >}。
要使用子网,必须配置子网掩码。一个B类地址的默认子网掩码为255.255.0.0,如果B类地址的子网占两个比特,那么子网掩码为11111111 11111111 11000000 00000000,也就是 255.255.192.0。
注意,外部网络看不到子网的存在。
无分类
无分类编址CIDR消除了传统A类、B类和C类地址以及划分子网的概念,使用网络前缀和主机号来对IP地址进行编码,网络前缀的长度可以根据需要变化。
IP 地址 ::= {< 网络前缀号 >, < 主机号 >}。
CIDR 的记法上采用在IP地址后面加上网络前缀长度的方法,例如 128.14.35.7/20表示前20位为网络前缀。
CIDR 的地址掩码可以继续称为子网掩码,子网掩码首1长度为网络前缀的长度。
一个CIDR地址块中有很多地址,一个CIDR表示的网络就可以表示原来的很多个网络,并且在路由表中只需要一个路由就可以代替原来的多个路由,减少了路由表项的数量。把这种通过使用网络前缀来减少路由表项的方式称为路由聚合,也称为构成超网。
在路由表中的项目由“网络前缀”和“下一跳地址”组成,在查找时可能会得到不止一个匹配结果,应当采用最长前缀匹配来确定应该匹配哪一个。
DHCP获取地址P239 230
地址解析协议 ARP
网络层实现主机之间的通信,而链路层实现具体每段链路之间的通信。因此在通信过程中,IP数据报的源地址和目的地址始终不变,而MAC地址随着链路的改变而改变。
ARP实现由IP地址得到MAC地址。
每个主机都有一个ARP高速缓存,里面有本局域网上的各主机和路由器的IP地址到MAC地址的映射表。
如果主机A知道主机B的IP地址,但是ARP高速缓存中没有该IP地址到MAC地址的映射,此时主机A通过广播的方式发送ARP请求分组,主机B收到该请求后会发送ARP响应分组给主机A告知其MAC地址,随后主机A向其高速缓存中写入主机B的IP地址到MAC地址的映射。
网际控制报文协议 ICMP
ICMP是为了更有效地转发IP数据报和提高交付成功的机会。它封装在IP数据报中,但是不属于高层协议,从体系结构上讲,ICMP(类UDP,TCP)位于IP之上。
报告数据报中的差错(目的网络不可达等)和对某些网络层的请求做响应的设施,ICMP被主机和路由器用来彼此沟通网络层的信息。
ICMP 报文分为差错报告报文和询问报文:
Ping
Ping是ICMP的一个重要应用,主要用来测试两台主机之间的连通性。
Ping的原理是通过向目的主机发送ICMP Echo请求报文,目的主机收到之后会发送Echo回答报文。Ping会根据时间和成功响应的次数估算出数据包往返时间以及丢包率。
Traceroute
Traceroute是ICMP的另一个应用,用来跟踪一个分组从源点到终点的路径。
Traceroute发送的IP数据报封装的是无法交付的UDP用户数据报,并由目的主机发送终点不可达差错报告报文。
- 源主机向目的主机发送一连串的IP数据报。第一个数据报P1的生存时间TTL设置为1,当P1到达路径上的第一个路由器R1时,R1收下它并把TTL - 1,此时TTL == 0,R1就把P1丢弃,并向源主机发送一个ICMP时间超过差错报告报文。
- 源主机接着发送第二个数据报P2,并把TTL设置为2。P2先到达R1,R1 收下后把TTL - 1再转发给R2,R2收下后也把TTL - 1,由于此时TTL == 0,R2就丢弃P2,并向源主机发送一个ICMP时间超过差错报文。
- 不断执行这样的步骤,直到最后一个数据报刚刚到达目的主机,主机不转发数据报,也不把TTL值减1。但是因为数据报封装的是无法交付的UDP,因此目的主机要向源主机发送ICMP终点不可达差错报告报文。
- 之后源主机知道了到达目的主机所经过的路由器IP地址以及到达每个路由器的往返时间。
虚拟专用网 VPN
由于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。
VPN使用公用的互联网作为本机构各专用网之间的通信载体。专用指机构内的主机只与本机构内的其它主机通信;虚拟指好像是,而实际上并不是,它有经过公用的互联网。
下图中,场所A和B的通信经过互联网,如果场所A的主机X要和另一个场所B的主机Y通信,IP数据报的源地址是 10.1.0.1,目的地址是10.2.0.3。数据报先发送到与互联网相连的路由器R1,R1对内部数据进行加密,然后重新加上数据报的首部,源地址是路由器R1的全球地址 125.1.2.3,目的地址是路由器R2的全球地址194.4.5.6。路由器R2收到数据报后将数据部分进行解密,恢复原来的数据报,此时目的地址为10.2.0.3,就交付给Y。
网络地址转换 NAT
专用网内部的主机使用本地IP地址又想和互联网上的主机通信时,可以使用NAT来将本地IP转换为全球IP。
在以前,NAT将本地IP和全球IP一一对应,这种方式下拥有n个全球IP地址的专用网内最多只可以同时有n台主机接入互联网。为了更有效地利用全球IP地址,现在常用的NAT转换表把传输层的端口号也用上了,使得多个专用网内部的主机共用一个全球IP地址。使用端口号的NAT也叫做网络地址与端口转换NAPT。
IPv6 P238 247
路由选择
路由选择:涉及一个网络的所有路由器,它们经由路由选择协议共同交互,以决定分组从源到目的地节点所采用的路径。计算路径的算法为路由选择算法。
广播路由选择:
网络层提供了从一种源节点到网络中其他节点交付分组的服务,而最简单的实现方式是:
- 通过N次单播来实现。即由发送结点向每个目的地分别发送分组的副本。
- 效率低下(在链路上拥挤,本来如果走同一段链路只需要发送一个报文即可,结果发送了N个,可以通过在网络上的节点复制来解决)。
- 并且需要知道广播到达的目的地址,额外增加了新的开销。
- 路由选择协议使用广播计算单播路由的链路状态信息。在使用广播来生成和更新单播路由的情况下,基于单播路由选择基础设施来取得广播是不明智的。
- 无控制洪泛方法,源节点向其所有的邻居发送分组副本,当某节点接受一个分组副本,则复制向该节点邻居继续发送。但是会产生广播风暴,无休止的进行分组复制。
受控洪泛:避免广播风暴,明智选择何时洪泛分组:
- 序号控制洪泛:源节点将其地址以及广播序号放入广播分组,再向它的所有邻居发送该分组。
- 每个节点维护它已经收到、复制、和转发的源地址和每个广播分组的序号列表。
- 当结点收到一个广播分组,则首先检查是否该分组在列表当中,如果在则丢弃分组。如果不在,则向邻居进行转发。
- 反向路径转发RPF(貌似使用中):当路由器收到具有给定定源地址的广播分组时,仅当分组到达的链路正好是位于它自己的返回其源的最短单播路径上,才向所有出链路传输。否则丢弃。
- RPF只需要知道在它到发送方的单播最短路径的下一个邻居,仅依这个邻居的身份决定是否发送。
- 结点A->B与A->C,然后B->C,但是C发现最近的是C->A,则丢弃。
- 生成树广播。以上方法避免了广播风暴,但是没有避免冗余广播分组的传输。
- 首先对网络节点构成一颗最小生成树,向所有属于该生成树的所有特定链路发送分组。接收广播分组的结点则向在生成树当中的所有邻居转发该分组。
多播路由选择:
使单个源节点能够向其他网络节点的一个子集发送分组的副本。与广播交给所有节点不同。适用于:软件更新、交互游戏、直播等。
- 怎样标识多播分组的接收方。
- 怎样为发送到这些接收方的分组编址。
由于目的地很多,因此分组无法携带所有接收方的IP地址。因此在因特网中对多播数据报使用间接地址编址。即用一个标识标识一组接收方。因特网中表示一组接收方的单一标识就是一个D类多播分组,与一个D类地址相关联的接收方小组称为一个多播组。多播组与主机的IP地址是完全独立的。
- 一个多播组如何形成,如何终结?如何选择组地址
- 新主机如何加入某个组,任何主机都能加入一个组吗,组成员资格是否会限制,如果限制,由谁限制
- 一个组成员是否知道其他组成员的地址,相互如何交互,以向所有组成员交付一个多播数据报。
上述问题均与IGMP(因特网组管理协议有关)
IGMP协议
IGMP协议运行在一台主机与其直接相连的路由器中间,IGMP为主机提供了手段,让它通知与其相连的路由器:在本机上运行的一个应用程序想加入一个特定的多播组。即IGMP的交互范围限制在主机与其直接相连的路由器之间。
三种报文类型,IGMP报文也是封装在一个IP数据报当中,IP协议号为2:
- member_query。
- member_report。
- level_group。
多播路由选择算法
协调因特网的多播路由器,以便多播数据报能够路由到最终目的地。
在该例子当中,C、D不需要接受多播组流量。多播路由的目标是发现一颗链路的树,连接了所有具有属于该多播组的相连主机的路由器。
多播路由选择树的建立:
- 单一的组共享树来为组中所有发送方分发流量。
- 为每个独立的发送方构建一颗特定源的路由选择器。
路由选择协议
- 距离向量多播路由选择协议(第一个)。
- 协议无关的多播路由选择协议(使用最广泛)。