Bootstrap

CAN201 Introduction to Networking(计算机网络)Pt.3 网络层

4.Network Layter(网络层)

这章将主要理解网络层服务背后的原则,特别是关注data plane(数据平面)方面的内容。具体包括以下几个方面:
网络层服务模型:即网络层提供的服务类型和模式,例如数据包转发、路由选择等。
转发与路由:区分数据包转发和路由选择的概念,理解它们在网络层中的作用和区别。
路由器的工作原理:理解路由器在网络中的功能和工作方式,包括数据包的处理、转发和路由决策等。
广义转发:指的是网络层中数据包的转发和处理方式,这涉及到不同的转发策略和技术。
并且这章会介绍网络层的实例化和实现。

4.1 Overview

我们前面说传输层和网络层的区别时已经提到了网络层的作用了。网络层负责将传输层的数据段从发送主机传输到接收主机。
在发送端,网络层encapsulates segments into datagrams(将传输层的数据段封装成数据报)。
在接收端,网络层delivers segments to transport layer(将接收到的数据报交付给传输层进行处理)。
网络层协议存在于每个主机和路由器上,用于处理数据报的传输和路由选择。
路由器会检查所有通过它传递的IP数据报的头部字段,以便进行路由选择和转发决策。
在这里插入图片描述
网络层的两个关键功能:
Forwarding(转发):指的是在路由器内部将数据包从输入端口转发到适当的输出端口的过程。
Routing(路径选择):指的是确定数据包从源到目的地所经过的路径的过程。这就涉及到了路由选择算法,路由选择算法可以根据不同的标准和条件来选择最佳的传输路径,例如最短路径、最小拥塞路径等。
我们将这个过程进行一个类比。网络层就像是在旅游,转发是指在旅途中通过一个交叉路口或者一个关键的路段,路由选择是指规划整个旅行的路线,选择适当的道路和路径,以确保旅行可以顺利到达目的地。
当然我觉得可以继续上次那样子的类比,这里我们将网络层理解为物流快递。转发可以类比为物流快递公司将包裹从一个物流中心转移到另一个物流中心的过程。路由选择则类比为物流快递公司选择最佳的路线和运输方式。

Data plane(数据平面)是指在每个路由器上本地执行的功能,用于确定到达路由器输入端口的数据报应如何转发到路由器的输出端口。这是指路由器内部的转发功能。
在这里插入图片描述

Control plane(控制平面)是指在整个网络范围内执行的逻辑功能,用于确定数据报在源主机到目的主机之间的端到端路径上如何被路由器选择和转发。控制平面决定了数据报在网络中的路由选择。
两种控制平面方法:
1.传统的路由算法:这些算法是在路由器中实现的,用于确定数据报的最佳路径和转发决策。
2.Software-defined networking(SDN,软件定义网络):这是一种新的网络架构,控制平面的功能被实现在(远程)服务器中,通过集中式的控制器来管理和配置网络设备。
下图展示了这个过程。
在这里插入图片描述
控制平面由一个独立的控制器组成,这个控制器通常是远程的,它负责管理和指导网络的流量。这个控制器与路由器上的本地Control Agents(CA,控制代理)进行交互。这样便远程控制器在决定了数据包的传输路径后将这些信息发送给路由器上的控制代理,数据平面根据这些信息来转发数据包。
网络服务模型有:
单个数据报文的示例服务:Guaranteed delivery(保证交付):确保每个数据报都能够被成功交付到接收方。
Guaranteed delivery with less than 40 ms delay(保证交付并且延迟小于40毫秒):确保每个数据报都能够被成功交付到接收方,并且延迟不会超过40毫秒。
针对数据报流的示例服务:In-order datagram delivery(有序数据报交付):确保数据报在传输过程中能够按照顺序被接收方接收到。
Guaranteed minimum bandwidth to flow(流的最低保证带宽):确保数据报流能够获得最低的带宽保证。
Restrictions on changes in inter-packet spacing(对数据报间隔的限制):对数据报之间的间隔做出一定的限制,以确保数据传输的稳定性和可靠性。

下图展示了不同的服务类型在不同的服务模型在带宽、丢包、顺序、时延和拥塞反馈方面提供不同程度的保证。
在这里插入图片描述
其中ATM CBR提供最严格的服务保证,适用于需要高质量服务的应用,如语音和视频通信。
ATM VBR提供保证的带宽和顺序,但允许时延有一定的灵活性,适用于需要保证带宽的应用。
ATM ABR提供最小带宽保证,适用于对丢包和时延不太敏感的应用。
ATM UBR没有服务保证,适用于对网络性能要求不高的应用。

4.2 Router(路由器)

下图展示了路由器架构的高层次视图。
在这里插入图片描述
路由器由Control plane(控制平面)和Data plane(数据平面)。其中控制平面包含routing processor(路由处理器),处理路由决策和网络管理任务,这一部分由软件实现,操作在millisecond(毫秒)时间框架内。而数据平面包含high-speed switching fabric(高速交换结构),用于在路由器的输入端口和输出端口之间快速转发数据包,这一部分便是硬件实现,操作在nanosecond(纳秒)时间框架内。

下图展示了输入端口功能。
在这里插入图片描述
输入端端口在接受数据后,先是line termination(线路终止)阶段:在物理层,将接收到的信号转换为数字数据。
再到link layer protocol(链路层协议),在数据链路层,处理数据帧的接受和错误检测。
然后到lookup,forwarding,queuing(查找、转发和排队)在数据链路层,路由器使用转发表来决定数据包的转发路径,并将数据包排队等待转发。
最后是switch fabric(交换结构)负责再路由器内部快速转发数据包,连接输入和输出端口。

Lookup,forwarding,queuing(查找、转发和排队)阶段的细节如下:这一阶段会进行decentralized switching(分散式交换),通过检查传入数据包的头字段,并使用存储在输入端口内存中的转发表来查找适当的输出端口。
这是为了以输入端口支持的最大速度处理传入数据包。如果数据报以比交换机传输速率更快的速度到达交换机,排队机制就会触发。
数据包转发方式会有两种:
destination-based forwarding(基于目的地的转发):这是一种传统的数据包转发方式,它仅仅根据数据包中的目的地IP地址来进行转发决策。
generalized forwarding(通用转发):这是一种更加灵活和通用的数据包转发方式,它不仅仅根据目的地IP地址,还可以根据数据包头部中的任意一组字段数值来进行转发决策。

下图展示了一张转发表,列出了不同的目的地地址范围以及对应的链路接口。
在这里插入图片描述
但是如果地址范围不能完美地划分为连续大小一致的子网该怎么办呢?
因此路由器需要使用更灵活的转发策略。
比如:Longest prefix matching(最长前缀匹配),指的是在查找转发表以确定给定目的地址的转发条目时,应使用与目的地址匹配的最长地址前缀。这种方法确保了路由器能够找到最精确的匹配项,并且提供了灵活性,允许网络管理员根据需要设置不同长度的子网掩码。
通常使用ternary content addressable memories(TCAMs,三态内容寻址存储器)来执行最长前缀匹配。TCAM是一种特殊的存储器,它可以在一个时钟周期内检索地址,无论表的大小如何。这使得TCAM非常适合用于路由表的快速查找和匹配。
而Cisco Catalyst交换机可以在TCAM中存储大约1百万个路由表条目。

交换架构是指网络设备中用于将输入缓冲区中的数据包传输到相应的输出缓冲区的机制。在这种机制中,数据包的传输速率被称为"交换速率”,它表示数据包从输入端口传输到输出端口的速度。通常,交换速率会以输入/输出线速的倍数来衡量。例如,如果交换速率是输入线速的N倍,表示交换结构能够以N倍于输入端口速率的速度进行数据包传输。

一共有三种交换架构,下面将分别介绍。
Switching via memory(通过内存交换),是指第一代路由器使用传统计算机,并且交换过程受到CPU直接控制的方式。
在这种情况下,数据包会被复制到系统的内存中进行交换处理。
这种方式的速度受到内存带宽的限制,因为每个数据报需要进行两次总线交叉(2 bus crossings)才能完成交换处理。
在这里插入图片描述
Switching via a bus(通过共享总线交换),指的是数据包从输入端口内存经由共享总线传输到输出端口内存的方式。
在这种情况下,交换速度受到总线带宽的限制,因为多个数据包可能会竞争总线资源,导致bus contention(总线争用)。
例如Cisco 5600路由器采用了一条总线带宽为32 Gbps的总线。这意味着路由器内部的总线能够以每秒32 Gbps的速度传输数据。
在这里插入图片描述
Switching via interconnection network (通过互连网络交换),这种方式通过互连网络进行交换,以克服总线带宽限制。互连网络包括了Banyan网络、crossbar(交叉开关)等,最初是为了连接多处理器系统中的处理器而开发的。在这种设计中,数据报被分割成固定长度的单元,这些单元可以更加高效地在交换设备中进行处理和传输。
例如Cisco 12000路由器通过互连网络能够进行高达60 Gbps的交换。
在这里插入图片描述

前面提到过,当交换结构的速度比输入端口的速度慢时,那么数据包在输入队列中可能会出现排队的情况。这可能导致排队延迟和数据包丢失,因为输入缓冲区可能会溢出。还可能有Head-of-the-Line(HOL)blocking(头部阻塞)问题,这个指的是队列中排在最前面的数据报阻塞了其他数据报的传输,导致其他数据报无法向前移动,从而造成了传输的阻塞。
下图展示了一些排队情况。
在这里插入图片描述
左边,多个数据包同时到达一个输出端口,由于输出端口的限制,同一时间内只能有一个数据包被传输。
右边,绿色数据包在红色数据包之后到达,但由于红色数据包正在等待传输,绿色数据包无法前进。即使绿色数据包的目标输出端口当前是空闲的,它仍然被阻塞,因为交换结构的输入端口被红色数据包占用。

输出端口与输入端口相比正好结构对称。如图所示。
在这里插入图片描述
在数据报从交换结构中到达的速度快于传输速率时,需要进行缓冲。那么就可能会出现拥塞和缺乏缓冲区导致数据报丢失的情况。
这里会有一个scheduling discipline(调度规则),用于选择哪些排队的数据报进行传输。这与priority scheduling(优先度调度)有关,即根据数据报的优先级来决定传输顺序。这让更高优先级的数据报获得了更好的性能,但也可能涉及到network neutrality(网络中立)的问题,即如何公平地处理不同数据报的传输。

因此在输出端口的排队情况如下。
在这里插入图片描述
在数据包到达速率超过输出端口的转发速率时,数据包将被缓冲。
当输出端口的缓冲区满了,新到达的数据包将无法被存储,这会导致排队延迟和数据包丢失。
DIscard policy(丢弃策略):当一个数据包到达一个已满的队列时,决定该如何处理的策略。有以下三种。
1.Tail Drop(尾部丢弃):当一个数据包到达已满的队列时,直接丢弃这个到达的数据包。
2.Priority(优先级):根据数据包的优先级来丢弃或移除数据包。
3.Random(随机):随机地丢弃或移除队列中的数据包。
Scheduling discipline(调度规则)制定了如何选择下一个要在网络链路上传输的数据包。

FIFO(first in first out, 先进先出)调度:按照数据包到达队列的顺序发送数据包。等待时间最长的数据包首先被发送。FIFO的丢弃策略是Tail Drop(尾部丢弃)。
在这里插入图片描述
Priority scheduling(优先级调度):发送具有最高优先级的排队数据包。每个类别具有不同的优先级。这些类别的划分可能取决于数据包的标记或其他头部信息,例如IP源/目的地地址、端口号等。它的丢弃策略是按优先级进行丢弃。
在这里插入图片描述
Round Robin(RR)scheduling是一种一种多类别的调度机制,它会循环扫描各个类别的队列,并从每个类别中发送一个完整的数据包(如果有可用的数据包)。
在这里插入图片描述
Weighted Fair Queuing (WFQ,加权公平队列)调度为每个类别分配加权的服务量,以确保每个类别在每个周期内都能够获得相应权重下的公平服务。可以理解为有优先级的Round Robin。

4.3 Internet Protocol

网络层的协议包括Routing protocols(路由协议),Internet protocol(IP协议)和Internet Control Message Protocol(ICMP协议)组成。
在这里插入图片描述
路由协议用于在网络中动态地确定数据包的最佳路径,常见的路由协议包括RIP(Routing Information Protocol),OSPF(Open Shortest Path First)和BGP(Border Gateway Protocol)等。
IP协议是网络层的核心协议,它规定了addressing conventions(寻址约定),datagram format(数据报格式),packet handling conventions(数据包处理约定)。
Addressing conventions(寻址约定)指的是IP协议中用于标识和定位主机或网络的地址分配规则。
Datagram format(数据报格式)指的是IP协议中数据包的格式。
Packet handling conventions(数据包处理约定)指的是IP协议中关于数据包的处理规则。

下图展示了IP协议中规定的数据包的格式。
在这里插入图片描述
其中IP protocol version number(IP 协议版本号):指示 IP 协议的版本,例如 IPv4 或 IPv6。
header length(头部长度):以 32 位字(4 字节)为单位,表示 IP 头部的长度。
Type of Service, ToS(服务类型):用于指示数据包的优先级和服务质量。
total datagram length(总数据报长度):整个数据报的长度,包括头部和数据,以字节为单位。
Identification(标识):用于数据报分片的重组。
flags(标志):控制或标识数据报分片。
fragment offset(片偏移):指示分片在原始数据报中的位置。这三者在一起完成了数据包的分片和重组。
Time to Live, TTL(生存时间):数据包在网络中可以经过的最大路由器数量,用于防止数据包无限期在网络中循环。
upper layer Protocol(上层协议):指示数据包携带的上层协议类型,如 TCP、UDP 等。
Header Checksum(头部校验和):用于错误检测。
Source IP address(源 IP 地址):发送方的 IP 地址。
Destination IP address(目的 IP 地址):接收方的 IP 地址。
Options(选项):可选字段,用于携带额外信息,如时间戳或记录路由。
Data(数据):实际传输的数据,长度可变。

Overhead(开销):指的是除了实际数据之外,为了传输数据而额外增加的头部信息。在图片中,提到 TCP 头部通常是 20 字节,IP 头部是 20 字节,所以总开销至少是 40 字节,再加上应用层的开销。IP 数据报中可能包含可选字段,这会增加 TCP 的开销。
下图展示了ToS字段的组成,其中DSCP占用前六位,ECN(Explicit Congestion Notification)占用两位。
在这里插入图片描述
Standard(标准):默认服务,没有特别的服务质量保证。DSCP Value:0,对应于 CS0 (DF)。
Low-priority data(低优先级数据):用于不太重要的数据,可以容忍一定的延迟或丢失。DSCP Value:8,对应于 CS1。
Network operations, administration and management (OAM)(网络操作、管理和管理):用于网络管理和控制流量,如 SNMP、SSH、Ping 等。
DSCP Value:16,对应于 CS2。
Broadcast video(广播视频):用于视频广播和视频监控等,需要较高的带宽和较低的延迟。
DSCP Value:24,对应于 CS3。
Real-time interactive(实时交互):用于实时交互应用,如在线游戏和视频会议。
DSCP Value:32,对应于 CS4。
Signaling(信令):用于信令流量,如 SIP、H.323、H.248 和 NTP。
DSCP Value:40,对应于 CS5。
Network control(网络控制):用于网络控制流量,如路由协议 OSPF、BGP、ISIS 和 RIP。
DSCP Value:48,对应于 CS6。
Reserved for future use(保留供将来使用):为将来可能的服务保留。
DSCP Value:56,对应于 CS7。

下图展示了Wireshark抓包的IP datagram详情。
在这里插入图片描述

前面提到了数据包的分片和重组。IP分片和重组是在具有不同最大传输单元(MTU)的网络链路上传输大型IP数据报时发生的过程。最大传输单元(MTU)是可以在网络链路上传输的最大链路层帧的大小。不同类型的网络链路可能具有不同的MTU。
如果需要在具有较小MTU的网络链路上传输大型IP数据报,则在发送之前将其分割为较小的片段,然后分别传输每个片段,只有在最后的目的地,这些片段才会“重组”。其中IP头部包含用于识别和排序相关片段的字段(前文提到的identification,flags 和 fragment offset),以便它们可以在目的地正确地重组。
在这里插入图片描述
下图展示了数据包的分片和重组。
在这里插入图片描述
原始数据包的大小为4000字节。网络的最大传输单元为1500字节。
因此IP头部之后的数据部分最大为 1500 − 20 = 1480 1500-20=1480 150020=1480字节。
所以现在原始数据包除了头部之后的数据部分为 4000 − 20 = 3980 4000-20=3980 400020=3980字节,可以划分为 3980 = 1480 + 1480 + 1020 3980=1480+1480+1020 3980=1480+1480+1020,因此最后的数据包加上头部,便为1500字节、1500字节、1040字节。第一个分片长度是1500字节,ID与原始数据包一致用于重组,fragflag(分片标志)为1,表示后面还有更多的分片,偏移量为0。第二个分片长度是1500字节,ID与原始数据包一致用于重组,fragflag(分片标志)为1,表示后面还有更多的分片,偏移量为 1480 / 8 = 185 1480/8=185 1480/8=185。第三个分片长度是1040字节,ID与原始数据包一致用于重组,fragflag(分片标志)为0,表示这是最后一个分片,偏移量为 1480 / 8 ∗ 2 = 370 1480/8*2=370 1480/82=370

4.4 IPv4 addressing

我们现在讨论IP地址。
Interface(接口)是主机/路由器与物理链路之间的边界。它代表设备与网络之间的连接点。例如,主机可能具有有线以太网和无线802.11连接的接口,而路由器通常具有多个接口,用于连接到不同的网络。
每个接口关联一个IP地址,因此单个主机或路由器可能具有多个IP地址。如果一个路由器有3个接口,那它通常会有3个IP地址。
IP地址的定义:主机或路由器接口的32位标识符。
在这里插入图片描述
而以太网接口是通过Ethernet switches(以太网交换机)进行连接的。无限wifi接口通过WIFI base station(无线基站)连接。这一部分将在链路层进行介绍。通常情况下,普通的以太网交换机是没有IP地址的,因为它们主要工作在数据链路层,使用MAC地址来进行数据帧的转发。
在这里插入图片描述
前面提到了很多遍Subnets(子网)这个概念,现在具体介绍。
IP地址包含两个部分:
Subnet part(子网部分),IP地址中的高阶位用于标识网络的子网。
Host part(主机部分),IP地址中的低阶位用于标识子网内的特定主机或设备。
所以什么是子网呢?子网是具有相同子网部分的设备接口的集合。子网内的设备可以直接相互通信,无需通过路由器(即它们在同一广播域内)。
下图展示了由三个子网组成的网络。
在这里插入图片描述
其中223.1.1.x:第一个子网,包含地址如 223.1.1.1, 223.1.1.2, 223.1.1.4。
223.1.2.x:第二个子网,包含地址如 223.1.2.1, 223.1.2.2, 223.1.2.9。
223.1.3.x:第三个子网,包含地址如 223.1.3.1, 223.1.3.2, 223.1.3.27。

子网的划分步骤如下。确定子网,需要将每个接口从其主机或路由器中分离出来,创建isolated networks(隔离的网络)。每个隔离的网络被称为一个子网。
下图展示了这个过程。
在这里插入图片描述
其中/24是subnet mask(子网掩码),/24表示前 24 位是网络部分,最后8位是主机部分。因此第一个子网,包含地址从 223.1.1.0 到 223.1.1.255。第二个子网,包含地址从 223.1.2.0 到 223.1.2.255。第三个子网,包含地址从 223.1.3.0 到 223.1.3.255。

子网是指具有相同子网部分IP地址的设备接口的集合,而路由器的接口通常被视为连接不同子网的边界,而不是子网本身的一部分。所以我们不会说Subnet 1 includes h1, h2, h3, and r1,而是Subnet 1 includes the interfaces of h1, h2, h3, and r1(子网 1包括了 h1、h2、h3的接口,而 r1 是连接这些接口的路由器)。在这里插入图片描述
在传统的类别化IP地址分配中,IP地址的网络部分被限定为8、16或24位长。具有8位、16位和24位子网地址的子网被称为类A、B和C网络。然而,这种分配方式存在问题,比如一个类C(/24)子网只能容纳最多 2 8 − 2 = 254 2^8 - 2 = 254 282=254 个主机,而一个类B(/16)子网支持 2 16 − 2 = 65 , 534 2^{16} - 2 = 65,534 2162=65,534 个主机,这个规模对于一些情况来说过大。如果一个组织有2000个主机,应该分配什么子网类别呢?如果分配类B地址空间就会导致大量的浪费。(这里计算-2是因为每个子网的第一个地址被保留为网络地址,而最后一个地址被保留为广播地址。)

为了解决这个问题,可以使用CIDR(Classless Inter Domin Routing,无类别域间路由),这是一种灵活的IP地址分配方法,与传统的类别化地址分配相比,CIDR允许子网部分的地址长度可以是任意的。
CIDR地址格式通常表示为a.b.c.d/x,其中x表示子网部分的位数。
下图展示了一个例子。
在这里插入图片描述
地址200.23.16.0/23,它表示网络地址为200.23.16.0,子网掩码为/23,即网络地址的前23位用于标识子网,剩下的9位用于主机地址。

那如何获取IP呢?方法有以下两种:
1.系统管理员手动分配:系统管理员可以手动在主机配置文件中硬编码指定IP地址。
其中Windows: 用户可以通过控制面板->网络->配置->TCP/IP->属性来配置DHCP。
UNIX: 通过/etc/rc.config文件
2.DHCP(Dynamic Host Configuration Protocol,动态主机配置协议):可以使主机在连接到网络时自动获取IP地址,从而实现"plug-and-play(即插即用)"或zeroconf(零配置)的功能。DHCP允许主机动态地从DHCP服务器获取IP地址,而无需手动配置,这样可以自动化网络连接过程中的相关配置。
它的特点如下:
1.Can renew its lease on address in use(可以更新租约,即主机可以在使用中更新其已分配的IP地址的租约,以延长使用期限。)
2.Allows reuse of addresses(允许地址重用,即DHCP使得IP地址能够在主机连接到网络时分配,并且在主机断开连接后释放,这样可以允许地址的重复使用,从而更有效地利用IP地址资源。)
3.Support for mobile users who want to join network(支持移动用户)
具体过程如下:
当主机加入网络时,它可以向网络发送一个“DHCP discover”消息,以请求动态获取IP地址(这一步是可选的)。
DHCP服务器收到“DHCP discover”消息后,可以向主机发送一个“DHCP offer”消息,其中包含了可以分配给主机的IP地址(这一步也是可选的)。
主机在收到“DHCP offer”消息后,可以向DHCP服务器发送一个“DHCP request”消息,正式请求分配一个IP地址。
DHCP服务器在收到“DHCP request”消息后,会向主机发送一个“DHCP ack”消息,确认分配给主机的IP地址。
下图可以方便理解新的主机向DHCP请求IP的过程。
在这里插入图片描述
下图是具体细节。
在这里插入图片描述
其中前两个步骤中,因为客户端在收到offer之前不知道服务器的具体地址,所以这时的通信是广播的。而后面request是广播的是为了协调和避免地址冲突。如果网络中有多个 DHCP 服务器,或者有设备正在使用手动配置的 IP 地址,广播 DHCP Request 可以防止地址冲突。其他 DHCP 服务器或设备看到这个 Request 后,可以避免分配相同的 IP 地址。最后的ACK信息可以是单播的,因为客户端已经知道服务器的地址了。
其中yiaddr表示客户的IP地址,表明了服务器打算分配给客户端的IP地址。
transaction ID(交易ID)用于匹配请求和响应,确保服务器的 Offer 与客户端的 Request 相匹配。
Lifetime(租约时间),DHCP 服务器分配的 IP 地址有一个租约时间,客户端需要在这个时间内续租,否则 IP 地址可能会被回收并分配给其他客户端。

DHCP的作用不止分配IP地址,它还可以返回其他信息:
第一跳路由器的地址(也称为gateway(网关)),这样客户端就知道如何发送数据包到达其他网络。
DNS服务器的名称和IP地址,这样客户端就可以使用这些信息来解析域名。
Network mask(网络掩码),它指示了IP地址中的网络部分和主机部分。

子网是怎么来的呢?ISP会将一部分IP地址空间分配给网络,这样网络就可以在该地址空间内分配子网地址(网络管理员再根据分配的地址空间进行子网划分并配置DHCP服务器)。
如图所示。
在这里插入图片描述
ISP的IP地址空间为11001000 00010111 0001 0000 00000000,即200.23.16.0/20。这个地址空间被划分给了不同的组织或网络,每个组织或网络都有自己的IP地址范围。

Hierarchical addressing(分层地址)/Route aggregation(路由聚合):
分层地址结构允许使用单一前缀来表示多个网络。通过使用单一前缀来传播多个网络,这被称为地址聚合或路由聚合。
如图所示。
在这里插入图片描述
图片中列出了多个组织,每个组织都有自己的IP地址范围,以CIDR表示法表示。
其中Fly-By-Night-ISP聚合了多个组织的地址范围,使用使用单一的前缀 200.23.16.0/20 来表示。任何目的地址以 200.23.16 开头的数据包都可以发送到这个ISP。
ISPs-R-Us使用了不同的前缀 199.31.0.0/16 来聚合路由信息。任何目的地址以 199.31 开头的数据包都可以发送到这个ISP。
以这种方式减少了网络中传播的路由信息数量,提高了路由效率。通过聚合,网络可以更容易扩展,因为添加新的子网不会显著增加路由表的复杂性。这样还简化了网络管理,因为网络管理员只需要关注聚合的前缀,而不是每个单独的网络。

在路由聚合中,路由器进行路由选择时会选择最匹配的路由表项。这里会使用最长前缀匹配,指的是路由器在路由表中查找与目标地址最匹配的路由项时,会选择具有最长匹配前缀的路由项。
如下图所示。
在这里插入图片描述
当互联网中的其他路由器看到目的地址块 200.23.16.0/20 和 200.23.18.0/23 并想要路由到这些块中的地址时,它们会使用最长前缀匹配原则。因此对于想要路由到200.23.18.0/23的信息会优先路由到ISPs-R-Us中。

那ISP如何获取IP地址的呢?这需要向ICANN(Internet Corportation for Assigned Names and Numbers,互联网名称与数字地址分配机构)申请。ICANN不直接分配IP地址给ISP,而是通过RIR来实现分配。除了IP地址分配外,ICANN还负责管理全球域名系统(DNS),分配域名以及解决域名争议。

4.5 NAT(network address translation,网路地址转换)

随着子网规模变大,需要更多的IP地址,但是如果ISP已经分配了连续的地址范围,那么改变已经分配的地址块将会非常困难。以及网络管理员很难准确估计未来需要多少IP地址。NAT技术可以解决这些问题。通过使用NAT,内部网络可以共享少量的公共IP地址,从而减少了对公共IP地址的需求。
如图所示。
在这里插入图片描述
所有离开本地网络的数据报都具有相同的单一源NAT IP地址:138.76.29.7,但使用不同的源端口号。使用不同的源端口号可以区分不同的通信会话,
对于目的地在本地网络内的数据包,它们的源和目的地址都是10.0.0.0/24范围内的地址,就像通常的IP路由一样。

NAT的优点:
1.不需要从ISP那里获得一个IP地址范围,只需要一个IP地址就可以为所有设备提供服务。
2.可以在本地网络中更改设备的地址,而无需通知外部世界。
3.可以更换ISP而不需要更改本地网络中设备的地址。
4.本地网络中的设备不会被外部世界直接寻址或可见,这有助于增强安全性。

当所有从WAN(广域网)到达NAT路由器的数据报具有相同的目标IP地址(即NAT路由器的WAN侧接口的IP地址)时,NAT路由器如何确定应将特定数据报转发到哪个内部主机呢?答案是使用NAT转换表。
NAT路由器必须实现以下功能:
记住(在NAT转换表中)每个(源IP地址,端口号)到(NAT IP地址,新端口号)的转换对。
对于外发的数据报:将每个外发数据报的(源IP地址,端口号)替换为(NAT IP地址,新端口号)。远程客户端/服务器将使用(NAT IP地址,新端口号)作为目标地址进行响应。
对于传入的数据报:将每个传入数据报中目的地字段中的(NAT IP地址,新端口号)替换为NAT表中存储的对应的(源IP地址,端口号)。
下图展示了这个过程,这里WAN表示广域网,LAN表示局域网。
在这里插入图片描述
主机发送数据包:本地网络中的主机(10.0.0.1)发送一个数据包到互联网上的一个服务器(128.119.40.186)。这个数据包的源地址是10.0.0.1,源端口是3345,目的地址是128.119.40.186,目的端口是80。
NAT 路由器接收数据包并发送:当数据包到达NAT路由器时,路由器会检查其NAT转换表,并将数据包的源地址从10.0.0.1(私有地址)更改为138.76.29.7(公有地址),同时记录源端口3345。这个新的源地址和端口号组合用于在回复数据时正确地将数据包路由回原始发送者。数据包现在以新的源地址138.76.29.7向128.119.40.186,并将端口号改为5001发送。
回复到达NAT路由器:当目的地服务器回复时,数据包的目的地址是138.76.29.7,这会到达NAT路由器。
NAT 路由器更改目的地址:NAT路由器接收到回复后,会查找其NAT表,将目的地址从138.76.29.7更改为原始的私有地址10.0.0.1,同时将目的端口从5001更改为3345,以匹配原始发送者的端口。

16位的端口号允许单个LAN侧地址能够支持的大量同时连接。但其仍有争议性:一些人认为路由器应该只处理到第三层的网络层,地址短缺问题应该通过IPv6来解决,而NAT则违反了端到端的原则。此外,应用程序设计者需要考虑到NAT的存在,特别是对于P2P应用程序,因为NAT可能会限制设备作为服务器的能力。
NAT traversal(NAT穿越)是一种技术解决方案,用于允许客户端连接到位于NAT后面的服务器。而Port Mapping(端口映射)是NAT穿越的一种解决方案,通过在NAT设备上配置端口映射规则,使得外部设备可以访问内部设备。

4.6 IPv6

IPv6的动机包括最初的动机是32位地址空间即将完全分配完,以及一些额外的动机,例如IPv6的头部格式有助于加快处理和转发速度,头部的改变有助于实现服务质量(QoS)。
IPv6数据报格式包括一个固定长度为40字节的头部,不允许在中间路由器上进行分段(可以看到“数据包太大”新的ICMP消息类型)。
下图展示了IPv6的数据报。
在这里插入图片描述
其中priority(traffic class,优先级),用于标识同一流中数据报的优先级。
Flow Label(流标签),用于标识同一流中的数据报。
Next header(下一个头部),用于标识数据报中的上层协议类型。
Payload length(负载长度):这个字段指示了 IPv6 数据报中负载部分(数据)的长度。
Hop Limit(跳限制):这个字段类似于 IPv4 中的 TTL(Time to Live)字段。它表示数据报在传输过程中可以经过的最大跳数(即路由器数量)。

IPv6 使用新版本的 ICMP(Internet Control Message Protocol),即 ICMPv6。它与 IPv4 中的 ICMP 有一些不同的消息类型和格式。
与 IPv4 不同,IPv6 数据报在传输过程中不会被中间路由器进行分段或重组。如果一个 IPv6 数据报在传输过程中由于大小超过了出口链路的限制而无法转发,路由器会简单地丢弃该数据报,并向发送端发送一个“数据包太大”(Packet Too Big)的 ICMP 错误消息。
IPv6 中的头部校验和被完全移除,这是为了减少每个路由器在处理数据报时的处理时间。这是因为在 IPv6 中,传输层协议(如 TCP 和 UDP)和链路层协议(如以太网)已经对数据进行了校验和处理。
选项:IPv6 允许在数据报中包含一些选项,但这些选项通常不包含在数据报头部中,而是通过“下一个头部”字段来指示。

那么IPv4能直接升级到IPv6吗?很明显不现实。
由于网络中存在大量的 IPv4 路由器,不可能立即将它们全部升级为支持 IPv6。这意味着在过渡期间,网络将同时存在 IPv4 和 IPv6 路由器。而且具体什么时候升级到IPv6没有具体的日期。
因此如何混合IPv4和IPv6网络工作呢?
使用Tunneling(隧道技术)IPv6 数据报可以被封装在 IPv4 数据报中进行传输。在这种情况下,IPv6 数据报作为 IPv4 数据报的载荷进行传输,通过在 IPv4 数据报的协议字段中指定为 41 来表示这是一个 IPv6 数据报。在两个 IPv6 路由器之间存在的一系列 IPv4 路由器被称为隧道。
在这里插入图片描述

4.7 Generalized Forwarding and SDN(广义转发与软件定义网络)

Flow(流):由报头字段定义。
Generalized forwarding(通用转发):是简单的数据包处理规则。它根据数据包头部中的特定模式进行匹配,并执行相应的动作。
Pattern(模式):匹配数据包头部字段中的值。
Actions for matched packet(对匹配的数据包进行的动作):对匹配的数据包执行的操作。比如丢弃数据包、转发数据包、修改数据包或将数据包发送给控制器等。
Priority(优先级):disambiguate overlapping pattern(消除重叠模式)。优先级用于区分和解决重叠模式的情况,确保在多个模式匹配的情况下,能够确定执行哪种动作。
Counters(计数器):记录字节数和数据包数。
在这里插入图片描述
Flow table(流表)是路由器中用于决定数据包转发行为的重要数据结构,它包含了一系列的匹配规则和对应的动作。流表是由控制器计算和分发的。当数据包到达路由器时,路由器会根据流表中的匹配规则来确定应该执行什么样的动作。所以流表正式存储和管理通用转发规则的数据结构。
如图所示。
在这里插入图片描述
上面的流表中制定了三条规则。
符合第一条规则的数据包将被丢弃。
符合第二条规则的数据包将被转发到端口2。
符合第三条规则的数据包将被发送到控制器。

下图展示了SDN(软件定义网络)中的OpenFlow协议中流表条目的结构和内容。
在这里插入图片描述
一个流表的一项是由Rule(规则)、Action(动作)和Stats(统计)三部分组成。
其中Rule(规则)定义了数据包匹配的条件,规则可以基于多种网络层级的信息来定义,比如源MAC地址、目的MAC地址、源IP地址、目的IP地址、传输层端口号等。
Action(动作)定义了当一个数据包与流表中的某个规则匹配时,将执行的动作。例如:Forward packet to port(s):将数据包转发到一个或多个端口。
Encapsulate and forward to controller:将数据包封装后转发给控制器,控制器可以进一步处理或查询。
Drop packet:丢弃数据包,不进行转发。
Send to normal processing pipeline:将数据包发送到正常的处理流程,即不使用OpenFlow规则处理。
Modify Fields:修改数据包中的某些字段,比如VLAN标签、源或目的MAC地址等。
Stats(统计)记录了与流表项相关的统计信息,包括数据包和字节计数器,这些信息可以用于网络监控和分析。
下图便展示了一些例子。
在这里插入图片描述
其中第一个是基于目的地的转发。当数据包的目的IP地址为51.6.0.8时。将这些数据包转发到路由器的输出端口6(port6)
后两个例子是Firewall(防火墙)。当数据包的目的TCP端口为22(通常用于SSH服务),丢弃该数据包。
当数据包的源IP地址为128.119.1.1。丢弃该数据包。
下图的例子展示了基于第二层(链路层)的交换机转发规则。
在这里插入图片描述
当交换机接收到源MAC地址为22:A7:23:11:E1:02的数据帧时,将这些数据帧转发到输出端口3。

在OpenFlow中,通过统一的匹配和动作机制,不同类型的网络设备可以使用相似的方式来进行数据包处理,这种抽象化的设计使得网络设备更加灵活和可编程。
路由器:匹配最长目标IP前缀,动作是将数据包转发出特定的链路。
交换机:匹配目标MAC地址,动作是将数据包转发或者进行泛洪(flood)。
防火墙:匹配IP地址和TCP/UDP端口号,动作是允许或者拒绝数据包通过。
NAT设备:匹配IP地址和端口,动作是重写地址和端口。
下图边展示了一个例子。
在这里插入图片描述
这里主机h5和h6的数据要是发给h3或者h4的话会中间通过s1再到s2。

4.8 Control Plane(控制平面)

前面说过网络层的两个主要功能是forwarding(转发)和routing(路由)而转发对应了data plane(数据平面),路由对应了control plane(控制平面)。前面我们说完了转发也就是数据平面部分。现在我们开始说控制平面。

网络控制平面的结构有两种:传统的per-router control(每台路由器控制)和logically centralized control(逻辑上集中控制)也就是SDN。
Per-router control(每台路由器控制):每个路由器上的控制平面组件包括路由选择算法,它们会相互交互以确定最佳的转发路径,并计算出相应的转发表。
在这里插入图片描述

Logically centralized control(逻辑上集中控制):一个独立的控制器(通常是远程的)与路由器内的本地控制代理(CAs)交互,来计算转发表。
在这里插入图片描述

4.9 Routing protocol(路由协议)

路由协议的目标是确定从发送主机到接收主机的“好”路径(或者说路由),通过网络中的路由器来实现数据包的传输。
Path(路径)是指数据包在从初始源主机到最终目的地主机的过程中所经过的一系列路由器。
“好”的标准可以包括最小成本、最快速度、最少拥塞等因素。
路由被认为是top-10的挑战之一。

对于路由问题,经通常使用图进行建模和描述。
如下图所示。
在这里插入图片描述
定义如下,图由节点和边组成 G = ( N , E ) G = (N,E) G=(N,E),节点标识所有的路由器 N = { u , v , w , x , y , z } N= \{ u, v, w, x, y, z \} N={u,v,w,x,y,z},边表示路由器间的链路 E = { ( u , v ) , ( u , x ) , ( v , x ) , ( v , w ) , ( x , w ) , ( x , y ) , ( w , y ) , ( w , z ) , ( y , z ) } E =\{ (u,v), (u,x), (v,x), (v,w), (x,w), (x,y), (w,y), (w,z), (y,z) \} E={(u,v),(u,x),(v,x),(v,w),(x,w),(x,y),(w,y),(w,z),(y,z)}
c ( x , x ′ ) c(x,x') c(x,x)表示链路 ( x , x ′ ) (x,x') (x,x)的成本。成本可以是固定的,也可以与带宽成反比,或者与拥塞直接相关。
因此路径的成本是指路径上所有相邻节点之间的成本之和。即 ( x 1 , x 2 , x 3 , … , x p ) = c ( x 1 , x 2 ) + c ( x 2 , x 3 ) + … + c ( x p − 1 , x p ) (x_1, x_2, x_3,…, x_p) = c(x_1,x_2) + c(x_2,x_3) + … + c(x_{p-1},x_p) (x1,x2,x3,,xp)=c(x1,x2)+c(x2,x3)++c(xp1,xp)

为了计算最小花费路径就需要使用路由算法。
路由算法可以根据信息的获取方式进行分类。全局/集中式的路由算法需要所有路由器都具有完整的拓扑结构和链路成本信息。这样的算法通常采用“链路状态”算法(例如Dijkstra算法)。
而分散式的路由算法则是指每个路由器只知道自己直接连接的邻居路由器以及到这些邻居的链路成本,通过迭代计算和与邻居路由器交换信息来实现路由决策。这种算法采用“Distance vector”算法

路由算法还可以根据路由信息的变化速度进行分类。静态路由是指路由信息变化缓慢,而动态路由是指路由信息变化更快,可能会定期更新或在链路成本发生变化时进行更新。

4.9.1 Dijkstra’s algorithm(Dijkstra算法)

Dijkstra算法:这是一种典型的链路状态路由算法,用于计算网络中节点之间的最短路径。在该算法中,网络拓扑结构和链路成本对所有节点都是已知的,这是通过“链路状态广播”来实现的。所有节点都具有相同的信息,算法会计算从一个节点(源节点)到所有其他节点的最短路径,然后会为源节点生成一个转发表(对每一个节点都做这样的操作)。
经过k次迭代后,就能够得到到达k个目的节点的最短路径信息。
符号表示:
c ( x , y ) c(x, y) c(x,y):表示从节点x到节点y的链路成本;如果它们不是直接相邻的节点,则成本为无穷大。
D ( v ) D(v) D(v):表示从源节点到目的节点v的当前路径成本值。
p ( v ) p(v) p(v):表示从源节点到目的节点v的路径上的前驱节点。
N ’ N’ N:表示已经确定了最短路径的节点集合。
伪代码如下:
在这里插入图片描述
下图展示了一个例子计算了以节点 u u u为源点的路由表的过程。
在这里插入图片描述
初始化,只有源节点 u u u N ′ N' N中,与 u u u相邻的路径都更新到图上,其他节点的最短路径成本未知(用∞表示)。
由于 D ( w ) D(w) D(w)最小,所以将 w w w加入到 N ′ N' N中,更新相邻的路径信息。由于由于 D ( x ) D(x) D(x)最小,所以将 x x x加入到 N ′ N' N中,更新相邻的路径信息。以此继续迭代从而得到的结果在上面的表格中已经显示。

下图有给出了一个新的例子。
在这里插入图片描述
现在要计算以节点 u u u为源点的路由表,计算结果如下。
在这里插入图片描述
最后的结果如下。
在这里插入图片描述

4.9.2 Distance vector algorithm(距离矢量算法)

Bellman-Ford算法是其中一种算法。这个算法是一种动态编程,它定义了一种函数, d x ( y ) d_x(y) dx(y)表示从节点 x 到节点 y 的最小成本路径。
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)}
其中 c ( x , v ) c(x,v) c(x,v) 表示从节点 x x x到邻居节点 v v v的成本。
d v ( y ) d_v(y) dv(y) 表示从邻居节点 v v v到目的地节点 y y y的最小成本路径。
m i n v min_v minv是将 x x x得所有邻居节点 v v v都取最小值。

下图是相关的一个例子。
在这里插入图片描述
我们现在要计算从 u u u v v v的最小成本路径。
显然 d v ( z ) = 5 , d x ( z ) = 3 , d w ( z ) = 3 d_v(z) = 5, d_x(z) = 3, d_w(z) = 3 dv(z)=5,dx(z)=3,dw(z)=3
那么 d u ( z ) = m i n { c ( u , v ) + d v ( z ) , c ( u , x ) + d x ( z ) , c ( u , w ) + d w ( z ) } = m i n { 2 + 5 , 1 + 3 , 5 + 3 } = 4 d_u(z) = min \{ c(u,v) + d_v(z),c(u,x) + d_x(z),c(u,w) + d_w(z) \}= min \{2 + 5,1 + 3,5 + 3\} = 4 du(z)=min{c(u,v)+dv(z),c(u,x)+dx(z),c(u,w)+dw(z)}=min{2+5,1+3,5+3}=4
这个最小成本路径将被用于生成节点 u 的转发表。

D x ( y ) D_x(y) Dx(y)表示从节点 x 到节点 y 的最小成本估计。
x x x维护了一个距离向量 D x ( y ) D_x(y) Dx(y),其中包含了到所有节点 y ∈ N y∈N yN的距离估计。
节点 x x x知道到每个邻居节点 v v v的成本: c ( x , v ) c(x,v) c(x,v)
节点 x x x维护了其邻居节点的距离向量。对于每个邻居节点 v v v,节点 x x x维护了距离向量 D v D_v Dv,其中包含了邻居节点 v v v到所有节点 y ∈ N y ∈ N yN的距离估计。
最后,节点 x x x通过以下过程更新其距离向量 D x : D x ( y ) ← m i n v { c ( x , v ) + D v ( y ) } 对每个 y ∈ N D_x: Dx(y) ← min_v \{c(x,v) + Dv(y)\} 对每个y ∈ N DxDx(y)minv{c(x,v)+Dv(y)}对每个yN
因此距离矢量算法中的核心思想在于时不时,每个节点向其邻居发送自己的距离向量估计。
当节点 x x x收到来自邻居的新距离向量估计时,它使用Bellman-Ford方程更新自己的距离向量 D x : D x ( y ) ← m i n v { c ( x , v ) + D v ( y ) } 对每个 y ∈ N D_x: Dx(y) ← min_v \{c(x,v) + Dv(y)\} 对每个y ∈ N DxDx(y)minv{c(x,v)+Dv(y)}对每个yN
在一些较小的、自然的条件下,节点的距离向量估计会收敛到实际的最小成本路径。

因此距离矢量算法的特点如下:
1.Iterative,asynchronous(迭代的,异步的):每次本地迭代是由本地链路成本改变或来自邻居的距离向量更新消息引起的。
2.Distributed(分布式的):每个节点只在其距离向量发生改变时通知邻居节点。然后,邻居节点如果必要的话会进一步通知它们的邻居节点。

因此每一个节点的状态如下:
在这里插入图片描述
每个节点等待本地链路成本的改变或来自邻居节点的消息。
当上述事件发生,节点重新计算距离向量。
如果节点到任何目的地的距离向量发生了改变,节点会通知其邻居节点。

下图展示了其中的一个过程。
在这里插入图片描述
全部过程如下。
在这里插入图片描述

当链路成本发生变化时,节点会进行以下行为:
当节点检测到本地链路成本发生变化时,它会立即更新路由信息并重新计算距离向量。如果距离向量发生变化,它会立刻通知邻居节点。
如图所示。
在这里插入图片描述
节点Y检测到链路成本变化,更新其距离向量,并通知其邻居。
节点Z收到来自Y的更新,更新其路由表,计算到X的新最短路径成本,并将更新后的距离向量发送给其邻居。
节点Y收到来自Z的更新,更新其距离表。如果Y的最短路径成本没有变化,那么Y不会向Z发送消息。
当链路成本降低这种好消息出现时,这种信息会迅速在网络中传播。因为每个节点在检测到链路成本变化后,会立即更新其距离向量并通知邻居,这样新的最佳路径信息就会快速传播到整个网络。
如果是链路成本增加这种坏消息,可能需要很长时间才能在整个网络中传播,因为每个节点只有在收到邻居的更新后才会更新自己的距离向量。
如果一个节点通过多个中间节点到达某个目的地,而链路成本增加导致路径变得无限大,这个问题可能会导致路由环路或路由信息长时间不准确。如图所示
在这里插入图片描述
这时候就会有Poisoned reverse(毒性逆转)策略。如上图所示,如果节点 Z 通过节点 Y 来到达节点 X,那么节点 Z 会告诉节点 Y 它到节点 X 的距离是无穷大,这样节点 Y 就不会通过节点 Z 来到达节点 X。
但这个问题并不能完全解决无穷大问题,因为它依赖于每个节点都能正确地识别和传播这种“无限”距离信息。此外,这种方法可能会导致路由信息的不完整,因为某些有效的路由可能会被错误地标记为不可用。

4.10 Intra-AS routing in the Internet: OSPF(网络中内部路由自治系统:OSPF)

两个现实世界中使路由难以拓展的原因:
1.规模:随着目的地数量的增加,无法在路由表中存储所有目的地,而且路由表的交换会占用大量的链路带宽。
2.Administrative autonomy(管理自治):互联网是由许多网络和互联网服务提供商(ISPs)组成的网络,每个网络或ISP的管理者可能希望在其网络中控制路由。

互联网中可扩展路由的方法如下:互联网将路由器聚合成称为“autonomous systems(自治系统)”的区域(也称为“domins(域)”)。
在自治系统内部路由中:
路由发生在同一自治系统(网络)内的主机和路由器之间。
所有自治系统内的路由器必须运行相同的自治系统内部路由协议。
不同自治系统内的路由器可以运行不同的自治系统内部路由协议。
网关路由器位于其所属自治系统的“边缘”,与其他自治系统的路由器有连接。
在自治系统间路由中:
路由发生在不同自治系统之间。
网关路由器执行自治系统间路由(以及自治系统内部路由)。

转发表是由自治系统内部路由算法和自治系统间路由算法共同配置的。
自治系统内部的路由算法确定了转发表中用于到达自治系统内部目的地的条目。
自治系统间的路由算法以及自治系统内部的路由算法一起确定了转发表中用于到达外部目的地(即其他自治系统内的目的地)的条目。
在这里插入图片描述
当一个在 AS1 中的路由器接收到一个要发送到 AS1 之外的目的地的数据包时,它需要使用自治系统间路由协议和自治系统内路由来确定最佳的网关路由器,以便将数据包正确地转发到下一个自治系统。

AS1 还需要完成两个任务:
1.学习哪些目的地可以通过 AS2 和 AS3 到达。
2.将这些可达性信息传播给 AS1 中的所有路由器。
在这里插入图片描述
自治系统内部路由也被称为内部网关协议(Interior Gateway Protocols,IGP),它是用于在同一个自治系统内部进行路由选择和转发的协议。
常见的自治系统内部路由协议包括:
RIP(Routing Information Protocol):一种较为简单的距离向量路由协议,用于小型网络环境。
OSPF(Open Shortest Path First):一种链路状态路由协议,用于大型复杂网络环境,能够提供更灵活和高效的路由选择。
IGRP(Interior Gateway Routing Protocol):曾是思科公司专有的内部网关路由协议,直到2016年才被废弃。

4.11 Routing among the ISPs:BGP

BGP(Border Gateway Protocol,边界网关协议)是互联网中的事实标准自治系统间路由协议,被认为是“连接互联网的胶水”。
BGP为每个自治系统的路由器提供了以下功能:
eBGP(外部BGP):从相邻的其他自治系统获取子网前缀的可达性信息。这使得子网能够向整个互联网宣告自己的存在,即“我在这里”。
iBGP(内部BGP):将可达性信息传播给所有自治系统内部的路由器,并根据可达性信息和策略确定到其他网络的“最佳”路由。
下图展示了自治系统间用eBGP连接,而自治系统内部用iBGP连接。其中红色圈圈的网关路由器同时运行eBGP和iBGP协议。
在这里插入图片描述
BGP会话是指两个BGP路由器(也称为对等体)通过semi-permanent(半永久)的TCP连接(使用端口179)交换BGP消息的过程。在这个会话中,路由器可以宣告到达不同目的地网络前缀的路径信息。BGP是一种“路径向量”协议,它不仅仅告诉对端路由器如何到达某个目的地,还告诉了这条路径上经过的自治系统的信息。
在这里插入图片描述

当AS3的网关路由器3a向AS2的网关路由器2c advertise(宣告)路径AS3,X时,这意味着AS3承诺向AS2转发到达目的地X的数据报。换句话说,AS3告诉AS2,如果有数据包要去往目的地X,AS3会负责将这些数据包转发到达目的地X。

在BGP中,Advertised prefix(广告的前缀)包括BGP attributes(属性),前缀和属性的组合被称为“路由”。在BGP路由中有两个重要的属性:
AS-PATH(自治系统路径):这是一个经过的自治系统列表,它显示了前缀广告所经过的各个自治系统。
NEXT-HOP(下一跳):它指示了开始AS-PATH的路由器接口的IP地址。
此外,BGP还涉及基于策略的路由。接收路由广告的网关使用导入策略来接受或拒绝路径(例如,决定不通过某个特定的自治系统Y进行路由)。自治系统的策略还决定是否向其他相邻的自治系统advertise(宣告)路径。
下图展示了BGP path advertisement(路径广告)。
在这里插入图片描述
AS2中的路由器2c通过eBGP从AS3中的路由器3a接收到路径广告,该路径广告指示可以通过AS3到达目的地X(记作AS3,X)。
根据AS2的路由策略,路由器2c接受这个路径(AS3,X)。然后通过iBGP这个路径信息传播给AS2中的所有其他路由器。
根据AS2的路由策略,路由器2a通过eBGP向AS1中的路由器1c广告这个路径。但是,这个路径被标记为AS2,AS3,X,表示数据包将通过AS2,然后是AS3,最后到达目的地X。

下图展示了一个网关路由器如何学习多个到达目的地的路径,
在这里插入图片描述
路由器1c从AS2的路由器2a学习到路径AS2,AS3,X。
路由器1c也从AS3的路由器3a直接学习到路径AS3,X。
基于AS1的路由策略,路由器1c通过策略选择路径AS3,X为最佳路径,然后将这个路径将这个路径信息通过iBGP广告给AS1内部的所有其他路由器。

BGP协议中的消息是通过TCP连接在对等体之间进行交换的。其中BGP协议的信息类型如下:
OPEN:用于打开到远程BGP对等体的TCP连接,并对发送BGP对等体进行认证。
UPDATE:用于宣告新的路径或撤销旧的路径。
KEEPALIVE:在没有UPDATE消息时保持连接活跃,同时也用于确认OPEN请求。
NOTIFICATION:用于报告先前消息中的错误,同时也用于关闭连接。

路由器通过BGP和OSPF一起为远程前缀设置转发表项。
下图展示了一个例子。
在这里插入图片描述
AS1中的路由器1a、1b、1c通过iBGP从路由器1c学习到目的地X的信息:“到达目的地X的路径是通过路由器1c”。
路由器1d使用OSPF进行域内路由:“为了到达路由器1c,1d需要通过其本地接口1转发数据包”。
在这里插入图片描述

路由器1a也使用OSPF来进行域内路由:“为了到达路由器1c,1a需要通过其本地接口2转发数据包”。

路由器可能会学习到到达目的地自治系统(AS)的多条路径,并根据以下几个因素进行路由选择:
1.本地偏好值属性:这是基于策略决定的属性,用于选择最佳路径。
2.最短的AS路径(AS-PATH):选择AS路径最短的路径作为最佳路径。
3.最近的下一跳路由器:即“hot potato routing(热土豆路由)”,选择距离最近的下一跳路由器作为最佳路径。
4.其他额外的标准:可能还有其他一些标准和策略,用于进一步确定最佳路径。

Hot potato routing(热土豆路由)的核心思想是选择具有最小域内成本的本地网关来进行路由,而不考虑域间成本。
下图展示了一个例子。
在这里插入图片描述
2d通过iBGP学习到可以通过2a或2c路由到X。根据热土豆路由策略,2d会选择具有最小域内成本的本地网关,即使到达目的地X需要经过更多的自治系统跳数。

Advertisements(广告)不仅可以告知其他路由器自己可以到达的IP地址前缀,还可以用于实现路由策略。
下面给出例子。
在这里插入图片描述
其中A、B、C是提供商网络(ISP)。
X、W、Y是客户网络(Customer)。
X是双联的:同时连接到两个网络。
ISP的策略要求X不希望通过自己将B网络的流量路由到C网络。因此,X会通过BGP协议向B网络宣告不会到达C网络的路由,这样B网络就不会选择通过X来到达C网络。

下面给出另一个同样的情景但不同的例子。
A向B和C宣告了路径Aw。B选择不向C宣告路径BAw。因为CBAw路径上的C、A、w都不是B的客户,所以B不会从中获得任何“收入”。C因此无法学习到CBAw路径,只能选择通过CAw路径来到达w,而不使用B。

为什么会有不同的Intra-AS(自治系统内部)和Inter-AS(自治系统间)的路由方式。
原因分三点:
Policy(策略):
Inter-AS:自治系统间的路由需要管理员对其流量如何路由以及谁通过其网络进行路由的控制。因为不同的自治系统可能有不同的政策和商业利益,需要进行精细的控制。
Intra-AS:单一的管理员控制整个自治系统,因此不需要进行复杂的策略决策。
Scale(规模):
层次化路由可以减小路由表的规模,减少更新流量,这对于大规模的网络来说非常重要。
Performance(性能):
Inter-AS:政策可能会主导性能,因为不同自治系统之间的政策和商业利益可能会影响路由决策。
Intra-AS:可以专注于性能,因为在同一个自治系统内部可以更容易地优化路由和性能。

4.12 The SDN control plane

传统的互联网网络层是通过分布式、每台路由器的方式来实现的。传统的路由器包含交换硬件,并在专有的路由器操作系统(例如Cisco IOS)中运行互联网标准协议的专有实现(如IP、RIP、IS-IS、OSPF、BGP)。
此外,不同的"middleboxes(中间盒)"用于执行不同的网络层功能,比如防火墙、负载均衡器、NAT盒等。
到了2005年左右,人们开始重新关注如何重新思考网络的控制平面。这就引出了软件定义网络(SDN)的概念。

传统的per-router control(每台路由器控制):每台路由器上的路由算法组件都会在控制平面中相互交互,以计算转发表。
在这里插入图片描述
SDN/Logically centralized control(逻辑上集中控制):一个独立的控制器(通常是远程的)与路由器内的本地控制代理(CAs)交互,来计算转发表。
在这里插入图片描述
SDN/Logically centralized control(逻辑上集中控制)的优点如下:
1.更容易的网络管理:通过避免路由器的错误配置,实现流量流向的更大灵活性。
2/基于表的转发(回想一下OpenFlow API)允许对路由器进行"编程"。集中式的"编程"更为简单,可以在中心计算转发表并进行分发。分布式的"编程"更为困难,需要在每个路由器中实现分布式算法(协议)来计算转发表。
3.开放的(非专有)控制平面实现。

传统的per-router control plane难以解决一些问题比如下图中的场景。
在这里插入图片描述
1.网络运营商希望U到Z的流量沿着路径UVWZ流动,而X到Z的流量沿着路径XWYZ流动。
2.网络运营商希望将U到Z的流量分散到两条路径上,即UVWZ和UXYZ(负载均衡)。
3.网络运营商对于不同的路线想采用不同的路由策略。
这些问题都难以用传统的方式实现。
而使用SDN通过集中控制面板,可以更灵活地管理和优化网络流量。
下图展示了SDN的架构特点。
在这里插入图片描述
1.Generalized “Flow-based” Forwarding(广义的基于流的转发),指的是网络设备(如交换机和路由器)根据flow(流)来转发数据包,而不是基于传统的路由表项。
2.Control/Data Plane Separation(控制平面与数据平面分离),这种分离允许网络管理员通过控制平面集中管理网络,而数据平面设备则专注于高效的数据包处理。
3.控制平面的功能通常由软件实现,并且与数据平面的交换机分离。
4.Programmable Control Applications(可编程控制应用),SDN的可编程性允许开发者和网络管理员创建定制的网络应用,以满足特定的业务需求。

SDN网络中,数据平面由Data plane switches(数据平面交换机)构成。这些是快速、简单且通用的交换机,它们在硬件中实现了广义的数据平面转发功能。
交换机的流表是由SDN控制器计算并安装的。
为交换机提供控制的应用程序接口(例如OpenFlow)定义了哪些功能是可以被控制的,哪些是不可以的。
通过协议(例如OpenFLow)控制器可以下发流表项到交换机,也可以从交换机收集网络状态信息。
在这里插入图片描述
而SDN的控制面板由SDN controller和netwrok-control applications组成。
其中SDN controller相当于网络的操作系统。SDN controller负责维护网络状态信息。通过northbound API与网络控制应用交互。通过southbound API与网络交换器进行交互。为了提高性能、可扩展性、容错性和鲁棒性,SDN控制器通常被实现为分布式系统。
在这里插入图片描述
Network-control applications(控制应用程序)是SDN架构中的“控制大脑”,使用SDN控制器提供的低级服务和API来实现各种网络控制功能。
具有的开放性,即网络控制应用程序可以由第三方提供,这意味着它们可以独立于路由供应商或SDN控制器供应商,允许网络运营商选择最适合其需求的应用程序。
在这里插入图片描述

SDN controller的组成部分如下图所示。
在这里插入图片描述
从上往下依次介绍。
Interface layer(接口层)为网络控制应用提供了抽象API。
Network-wide state management layer(网络范围状态管理层),这一层负责维护网络的状态信息,包括网络链接、交换机和服务的状态。这些状态信息存储在一个分布式数据库中。
Communication layer(通信层),这一层负责SDN控制器与受控交换机之间的通信。使用的协议包括OpenFlow和SNMP。

我们现在介绍OpenFlow协议,前面介绍了它是在SDN控制器的通信层中,所以它定义了控制器和交换机之间的通信方式。OpenFlow规定了使用TCP协议进行消息交换,还支持可选的加密功能。OpenFlow协议还定义了三类OpenFlow消息:
1.控制器到交换机(Controller-to-Switch):控制器向交换机发送命令和配置信息。
2.异步消息(Asynchronous):交换机向控制器发送异步事件通知,例如端口状态变化、数据包到达等。
3.对称消息(Symmetric):用于交换一些其他类型的消息,如特定于OpenFlow协议的协商和状态信息。
在这里插入图片描述

关于OpenFlow信息,先说第一类controller-to-switch:
Features(特性):控制器向交换机查询其特性,例如支持的OpenFlow版本、端口数量、支持的功能等,交换机会回复这些信息。
Configure(配置):控制器可以查询或设置交换机的配置参数,例如端口速率、队列参数等。
Modify-state(修改状态):控制器可以向交换机发送命令,以添加、删除或修改OpenFlow表中的流表项,从而控制数据包的转发和处理规则。
Packet-out(数据包发送):控制器可以指示交换机将特定的数据包发送到指定的交换机端口,这使得控制器可以直接控制数据包的转发路径。

第二类Asynchronous,也就是switch-to-controller:
Packet-in(数据包传入):交换机将数据包及其控制信息传输到控制器。当交换机无法根据当前的流表项找到匹配的规则时,会将数据包传输到控制器,控制器可以根据需要对数据包进行处理或下发新的流表项。
Flow-removed(流表项删除):交换机通知控制器某个流表项已经被删除,这可能是因为流表项过期或被控制器删除。
Port status(端口状态):交换机通知控制器特定端口状态的变化,例如端口的连接状态、速率变化等。

下图展示了SDN的数据平面和控制平面交互的例子。
在这里插入图片描述
过程如下:
1.S1交换机通过OpenFlow端口状态消息通知控制器链路故障。
2.控制器接收OpenFlow消息并更新链路状态信息。
3.Dijkstra路由算法应用被触发,因为它已注册在链路状态变化时调用。
4.Dijkstra算法访问网络图和链路状态信息,计算新的路由。
5.链路状态路由应用与控制器中的流表计算组件交互,计算所需的新流表。
6.控制器使用OpenFlow协议将新流表下发到需要更新的交换机。

下图展示了开源的SDN控制器平台OpenDaylight(ODL)控制器的架构。
在这里插入图片描述
ODL Lithium Controller是OpenDaylight的一个版本。
网络服务应用程序可以包含在SDN控制器内部,也可以是外部的。
Basic Network Service Function(基础网络服务功能)包topology manager(括拓扑管理器)、switch manager(交换机管理器)、stats manager(统计管理器)、forwarding manager(转发管理器)和host manager(主机管理器)。
Service Abstraction Layer(SAL,服务抽象层)负责连接内部应用程序和服务与外部应用程序和服务。

下图展示了另一个开源的SDN控制器,ONOS控制器的架构。
在这里插入图片描述
ONOS设计允许Control Apps Separate from Controller(网络控制应用程序与控制器核心功能分离)。
提供了一个Intent framework(意图框架),提供了一个高层次的服务规范,允许网络管理员定义网络应该如何表现,而不是具体如何实现。
ONOS控制器强调分布式核心,这有助于提高服务的可靠性、复制和性能扩展。

4.13 ICMP(The Internet Control Message Protocol)

ICMP是一种用于在网络层传递控制信息的协议,它通常被主机和路由器用来交换网络级别的信息。
它有一下几个功能和特点:
错误报告:ICMP可以用来报告网络中发生的错误,如目标主机不可达、网络不可达、端口不可达、协议不可达等。
echo request/reply(回显请求/回复)(用于ping):ICMP还可以用来进行回显请求和回复。
位于IP协议之上:ICMP消息被封装在IP数据报中进行传输,因此它位于IP协议之上,用于处理IP层的控制信息。
ICMP消息格式:每个ICMP消息包括一个类型字段和一个代码字段,以及导致错误的IP数据报的前8个字节。

下图展示了ICMP的类型字段和代码字段对应的情况。
在这里插入图片描述
类型 0,代码 0:回显应答(Echo Reply),通常用于网络诊断,即“ping”命令。
类型 3,代码 0:目的网络不可达(Destination Network Unreachable),表示数据包无法到达目的地网络。
类型 3,代码 1:目的主机不可达(Destination Host Unreachable),表示数据包无法到达特定的主机。
类型 3,代码 2:目的协议不可达(Destination Protocol Unreachable),表示目的地不支持数据包中指定的协议。
类型 3,代码 3:目的端口不可达(Destination Port Unreachable),表示数据包无法到达目的端口,可能是因为端口不存在或服务未运行。
类型 3,代码 6:目的网络未知(Destination Network Unknown),这个代码通常不使用。
类型 3,代码 7:目的主机未知(Destination Host Unknown),这个代码同样通常不使用。
类型 4,代码 0:源抑制(Source Quench),用于拥塞控制,但目前不常用。
类型 8,代码 0:回显请求(Echo Request),通常用于网络诊断,即“ping”命令。
类型 9,代码 0:路由通告(Route Advertisement),用于路由器之间通告路由信息。
类型 10,代码 0:路由器发现(Router Discovery),用于在网络中发现路由器。
类型 11,代码 0:生存时间(TTL,Time To Live)过期,表示数据包在网络中的生存时间已到,被丢弃。
类型 12,代码 0:错误的IP头(Bad IP Header),表示IP头有错误,数据包被丢弃。

Traceroute是一种用于确定数据包在网络中传输路径的工具,它使用ICMP协议来实现。工作原理如下:
源主机发送一系列带有不同TTL(Time To Live)值的UDP数据段到目标主机。每组数据段的TTL值递增,以便在网络中逐跳地跟踪路径。
当第n组数据段到达第n个路由器时,由于TTL值已经减至0,路由器会丢弃数据段,并向源主机发送ICMP“TTL expired”消息(类型11,代码0)。这个ICMP消息中包含了路由器的名称和IP地址,这样源主机就能知道数据包到达了哪个路由器。
源主机接收到ICMP消息后记录下往返时间(RTT),以便后续分析。
Traceroute继续发送带有不同TTL值的UDP数据段,直到数据段最终到达目标主机。当数据段到达目标主机后,目标主机会返回一个ICMP“port unreachable”消息(类型3,代码3)给源主机。
当源主机接收到“port unreachable”消息后,Traceroute结束,并汇总了整个路径的信息,包括每个路由器的名称和IP地址,以及往返时间(RTT)。
在这里插入图片描述

4.14 SNMP:Network Management

在自主系统(也称为网络)中,有成千上万个相互作用的硬件和软件组件,网络管理的目标是确保这些组件能够协同工作,以提供高效的网络服务。
类似地,其他复杂系统,如喷气式飞机、核电站等,也需要监控和控制来确保其安全和可靠运行。
网络管理涉及部署、集成和协调硬件、软件和人员等各种元素,以监视、测试、轮询、配置、分析、评估和控制网络和网络元素资源,以满足实时操作性能和服务质量要求,并且要以合理的成本实现。

下图展示了网络管理的基本框架。
在这里插入图片描述
managing entity(管理实体)负责网络管理的核心部分,它通过网络管理协议与网络中的设备进行通信。
angent(代理)代理是运行在被管理设备上的软件组件,负责收集设备信息并将其发送给管理实体。
被管理设备包含了一系列的被管理对象,这些对象的状态和配置信息被代理收集,并且这些收集到的数据被存储在一个集中的management information base(MIB,管理信息库)中。

刚刚介绍了managing entity(管理实体)和被管理设备之间需要使用网络管理协议进行信息交换。SNMP(简单网络管理协议)就是一种网络管理协议。它有两种工作方式,下图展示了这两种传递MIB信息和命令的方式。
在这里插入图片描述
左边是Request/Response Mode(请求/响应模式)。
在这种模式下,管理实体主动向被管理设备发送request(请求),以获取或设置MIB中的信息。
被管理设备上的代理接收到请求后,会处理这些请求,并将结果作为response(响应)返回给管理实体。
右边是Trap Mode(陷阱模式)。
在这种模式下,被管理设备在特定事件发生时,会主动向管理实体发送trap message(陷阱消息)。
这些事件可以是错误、配置更改、性能警告等,它们触发被管理设备上的代理发送陷阱消息。
管理实体可以配置为监听这些陷阱消息,以便在问题发生时迅速响应。

下图展示了SNMP中的信息类型及其对应的功能。
在这里插入图片描述
GetRequest:管理器向代理发送GetRequest消息,请求获取管理信息库(MIB)中的特定数据。
GetNextRequest:类似于GetRequest,但用于获取MIB中下一个数据实例的信息,或者获取列表中的下一个数据项,或者获取数据块。
GetBulkRequest:管理器向代理发送GetBulkRequest消息,用于批量获取MIB中的大量数据,以提高效率。
InformRequest:代理主动向管理器发送InformRequest消息,告知管理器MIB中的某个值已经更新。这通常用于代理向管理器报告变化。
SetRequest:管理器向代理发送SetRequest消息,用于设置或修改MIB中的值,即对网络设备进行配置更改。
Response:代理向管理器发送Response消息,作为对管理器请求的响应,包含请求的数据值。
Trap:代理向管理器发送Trap消息,用于在发生异常事件或特定情况时通知管理器。Trap可以是未请求的,代理基于预设的条件或事件触发。

SNMP协议的信息格式如下。
在这里插入图片描述
Get/Set Header(获取/设置头部):这是SNMP消息的头部,包含了请求的基本信息,如PDU(协议数据单元)类型、请求ID、错误状态和错误索引。
Variables to get/set(获取/设置变量):这部分包含了SNMP消息中用于获取或设置的变量,如Name(名称)和Value(值)。
Trap Header(陷阱头部):陷阱消息的头部包含了Trap的特定信息,如Enterprise(企业标识符)、Agent Addr(代理地址)、Trap Type(Trap类型)和Specific code(特定代码)。
Trap Info(陷阱信息):这部分包含了Trap消息的详细信息,如Time stamp(时间戳)和Name/Value对,这些信息描述了触发Trap的事件。
SNMP PDU (Protocol Data Unit):PDU是SNMP消息的协议数据单元,它是SNMP消息的核心部分,包含了消息的所有信息。

;