《计算机网络:自顶向下方法》第五章--网络层:控制平面

news2024/11/24 11:40:06

控制平面作为一种网络范围的逻辑,不仅控制沿着从源主机到目的主机的端到端路径间的路由器如何转发数据报,而且控制网络层组件和服务如何配置和管理

传统上,控制平面功能与数据平面的转发功能在一起实现,在路由器中作为统一的整体

5.1概述

在网络层:数据平面中有转发表(基于目的地转发的场景中)和流表(在通用转发的场景中)是链接网络层的数据平面和控制平面的首要元素。这些表定义了一台路由器的本地数据平面转发行为

本章包括这些转发表和流表是如何计算、维护和安装的

有两种方法:

①每台路由器控制:在每台路由器中运行一种路由选择算法的情况,每台路由器中都包含转发和路由选择功能。每台路由器有一个路由选择组件,用于与其他路由器中的路由选择组件通信,以计算器转发表的值

②逻辑集中式控制:逻辑集中式控制机器计算并分发转发表以供每台路由器使用。通用的“匹配加转发”抽象允许执行传统的IP转发以及其他功能,这些功能原本是在单独的中间盒中实现的。

该控制器通过一种定义良好的协议与每台路由器中的一个控制代理(CA)进行交互,以配置和管理该路由器的转发表。CA一般具有最少的功能,其任务是与控制器通信并且按照控制器的命令运行

每台路由器控制与逻辑集中式控制之间的关键差异:CA既不能直接相互交互,也不能主动参与计算转发表

5.2 路由选择算法

路由选择算法的目的:从发送方到接收方的路径中选择一条通过路由器网络的最低开销路径

可以将路由选择问题用图来表示,图G=(N,E)是一个N个节点和E条边的集合,其中每条边是取自N的一对节点。在网络层路由选择环境中,图中的节点表示路由器,这是做出分组转发决定的点;连接这些节点的边表示这些路由器之间的物理链路;边上的数字就是这条边的权值,表示物理链路的开销(长度、速度等)

 在图中给定任何两个节点x和y,在这两个节点之间可能有多路径,每个路径都有相应的开销。这些路径中的一条或多条是最低开销路径(least-cost path)

 如果一个图中所有的边具有相同的开销,则最低开销路径也就是最短路径,即在源和目的地之间有最少链路数量的路径

路由选择算法按集中式与分散式分类

①集中式路由选择算法:用完整的、全局性的网络制式计算出从源到目的地之间的最低开销路径。集中式算法具有关于连通性和链路开销方面的完整信息。具有全局状态信息的算法常被称作链路状态(Link State,LS)算法,因为该算法必须i知道网络中每条链路的开销

②分散式路由选择算法:路由器以迭代、分布式的方式计算出最低开销路径。没有节点拥有关于所有网络链路开销的完整信息,每个节点仅有与其直接相连链路的开销。

路由选择算法按动静态分类

①静态路由选择算法:路由随时间的变化非常缓慢,通常是人工进行调整

②动态路由选择算法:随着网络流量负载或拓扑发生变化而改变路由选择路径。一个动态算法可周期性的运行或直接响应拓扑或随着链路开销的变化而运行。虽然可对网络的变化出现反应,但是可能出现路由选择循环、路由震荡等问题

路由选择算法按负载敏感程度分类

①负载敏感算法:链路的开销会动态的变化以反映出底层链路的当前拥塞水平

②负载迟钝算法:链路的开销不明确地反应其当前的拥塞水平

5.2.1 链路状态路由选择算法

通过让每个节点向网络中的所有其他节点广播链路状态分组来完成,其中每个链路状态分组包含它所连接的链路的标识和开销。实践中,一般有链路状态广播算法来完成上述内容

下面所示的链路状态路由选择算法叫做迪杰斯特拉(dijkstra)算法

在图--单源最短路径章节中有详细实例分析与代码实现,下面的例子作为一个简述

定义如下符号:

·D(v):到本次迭代,从源节点到目的节点v的最低开销路径的开销

·p(v):从源到v沿着当前最低开销路径的前一个节点

·N’:节点子集,如果从源到v的最低开销路径已经知道,则将v放入N‘中

 以上图为例,如果两节点之间没有直接路径连接则开销为无限大

在初始化步骤,从u到预期直接相邻的邻居v,x,w的当前已知最低开销路径分别初始化为2、1和5。到w的开销被设置为5,这是从u到w的一跳链路开销

在第一次迭代中,观察还未加入N’的节点,并找出再签一次迭代结束时具有最低开销的节点。节点为x,开销为1,因此x被加入集合N‘。更新所有节点的D(),产生表格中步骤一的结果。到v的路径开销未改变,从x到w的路径开销更新为更短的4,p(w)更新为4

在第二次迭代中,此时u到v和到y的开销都是2,因此在N’中可以改变任意次序将vy加入。若先加入y节点,则此时还未在N‘中的节点包括v、w、z,更新它们的D()p()

以此类推

当LS算法终止时,对于每个节点都知道从源节点到该节点的最低开销路径。因此对每个节点存储从源到目的地最低开销路径的下一跳节点

 在第一次迭代中,需要遍历所有的n个节点;在第二次迭代中,需要遍历n-1个节点;以此类推,在迭代中需要搜寻的节点总数未n(n+1)/2,因此最坏情况下迪杰斯特拉算法的时间复杂度为O(n^2)。如果采用堆的数据结构实现,可以将时间复杂度缩短至对数时间

拥塞敏感的路由选择的振荡

在下面的例子中,链路开销是非对称的(即同一条链路上两个方向的开销不同)

①节点z产生发往w的的一个单元的流量,节点x也产生发往w的一个单元的流量,并且节点y也产生发往w的一个数量为e的流量

②当LS算法再次运行时,节点y确定顺时针到w的路径开销为1吗,而逆时针到w的路径开销为1+e。因此y到w的最低开销路径为顺时针。x到w的最低开销路径也是顺时针

③当LS算法运行时,xyz都检测到一条到w的逆时针方向的零开销路径,因此流量都为逆时针方向

④LS算法运行,xyz将流量都引导至顺时针方向

 对于上述有两种解决方法

第一种方案是强制链路开销不取决于所承载则流量,但这样违背了路由选择避开拥塞链路的原理

第二种方案是保障并非所有的路由器都同时运行LS算法。路由器初始时以同一周期但是不同时刻执行算法,算法执行的时机最终会在路由器上变成同步并保持。解决这种自同步问题的方法是让每台路由器发送链路通告的时间随机化

5.2.2 距离向量路由选择算法

距离向量算法是一个异步的、迭代的、自我终止的、分布式的算法

d{_x{(y)}}是从节点x到节点y的最低开销路径的开销,则该最低开销与著名的Bellman-Ford方程相关,即 

距离向量路由选择算法的基本思想如下:

每个节点x以为D{_x{(y)}}开始,对在N中的所有节点y,估计从x到y的最低开销路径的开销

使用DV算法,每个节点x维护下列路由选择信息:

·对于每个邻居v,从x到直接相邻邻居v的开销为c(x,v)

·节点x的距离向量,即D_x{=[D{_x{(y):y\in N}}]},包含了x到N中所有目的地y的开销估计值

·它的每个邻居的距离向量,即对x的每个邻居v,有D_v{=[D{_v{(y):y\in N}}]}

在该分布式、异步算法中,每个节点不时地向它的每个邻居发射它的距离向量副本。当节点x从它的任何一个邻居v接收到一个新的距离向量,它保存v的距离向量,然后使用上面的Bellman-Ford方程更新它自己的距离向量如下:

D{_x{(y)}}=min{_v{}} \left \{ c(x,v)+D{_v{(y)}}\right \}

分布式DV算法中,节点具有的唯一信息使它到直接相连邻居的链路开销和它从这些邻居接收到的信息

如图所示显示了DV算法的使用,应用场合是该图顶部有三个节点的简单网络。算法以同步的方式显示,其中所有的节点同时从邻居接收报文,计算其新距离向量,如果距离向量发生了变化则通知其邻居(这里以同步的方式实现,实际上异步可以在任意时刻出现节点计算与更新的产生/接收)

最左侧一列标识各个路由器的初始路由选择表,每个路由器仅知道自己与其他直接相连邻居的链路开销,对其他路由器的信息并不知道,因此初始化为无穷大

随后每个节点向它的两个邻居发送其距离向量,在接收到该更新后,每个节点重新计算他自己的距离向量,下图为x的距离向量更新,yz与其类似

中间一列显示了各个节点的新距离向量与从邻居接收到的距离向量。此时相较于初始路由选择表,xz的路由选择表发生了改变。因此它们再次向直接相邻邻居发生更新的信息。由于y并未改变,因此y并不发送更新信息。在接收到更新后,这些节点重新计算他们的距离向量并更新路由选择表,如第三列所示

此时无更新报文发送,将不会出现进一步的路由选择表计算,该算法进入静止状态

1.距离向量算法:链路开销改变与链路故障

考虑两种链路开销改变的情况,链路开销变大与链路开销变小

链路开销变小:好消息传播快

如图所示,从y到x的链路开销从4变成1。接下来考虑y与z到目的地x的变化

在t0时刻:y检测到链路开销变化,更新距离向量,并通知其邻居z

在t1时刻:z接收到y的更新报文,并更新自己的距离表,计算出从z到x的最低开销为2(从5减少为2),并向邻居y发送它更新的距离向量

在t2时刻:y接收到z的更新报文,y的最低开销未改变,并不向z发送更新报文。算法进入静止状态

链路开销变大:坏消息传播慢

如图所示,从y到x的链路开销从4变成60。接下来考虑y与z到目的地x的变化

在链路开销变化之前,D{_y{(x)}}=4 D{_y{(z)}}=1 D{_z{(y)}}=1 D{_z{(x)}}=5

①在t0时刻,y检测到链路开销变化,y重新计算到x的最低开销路径值为

此时从全局的视角来看,这个最低开销路径是错误的。但是DV算法的特征就是节点并不知道全局信息,此时就会产生路由选择环路,也就是y选择通过z路由到达x,z路由要通过y到达x。当分组到达y或z后,会在两个节点间不间断的来回反复

此时y已经计算出到达x的最低开销路径为6,因此他将在t1时刻发送更新报文给直接相邻邻居

②在t1时刻,z接受到y的更新报文,即D{_y{(x)}}=6,z更新它到x的最低开销为D{_z{(x)}}=7

此时z已经计算出到达x的最低开销路径为7,因此它将在t2时刻发送更新报文给直接相邻邻居

③在t2时刻,y接收到z的更新报文……依此类推

该循环将持续44次迭代,直到z最终计算出它通过y到达x的路径开销大于50为止。此时z的最低开销路径为直接从z到x而不途径y

假设x与y之间的链路开销为无穷大,那么将进行无数次循环迭代,变成无穷计数问题

2.距离向量算法:增加毒性逆转

毒性逆转(poisoned reverse):如果一个节点z到达一个节点x途径邻居节点y,则z将会通报该邻居节点到达目的地的距离为无限远

即如果z通过y到达目的地x,则z传递给y的响应报文将会令D{_z{(x)}}=\infty(即使z实际上的D{_z{(x)}}=5

毒性逆转并不能彻底解决无穷计数问题

无穷计数解决办法:①设置最大跳转距离②防止选择环路,每个路由器都记录所经过的的路由③水平分割:不向某条路由对应的出接口通告该路由信息

3.LS与DV路由选择算法的比较

DV和LS算法采用互补的方法来解决路由选择计算问题。在DV算法中,每个节点仅与它直接相连的邻居交谈,但它为其邻居提供了从它自己到网络中的所有其他节点的最低开销估计。LS算法需要全局信息,因此在每台路由器中实现时,需要先经广播与所有其他节点通信,但仅告诉它们与它直接相连链路的开销

以N为节点(路由器)的集合,E是边(链路)的集合

·报文复杂性:·收敛速度:·健壮性:
LS算法

LS算法要求知道网络中每条链路的开销,因此需要发送O( |N| |E| )个报文,每当有一个链路的开销发生改变,都需要向所有节点发送新的链路开销;

LS算法是一个要求O( |N| |E| )个报文的O( |N| ^2)算法当一台路由器发生故障、行为错乱或被蓄意破坏时。LS算法中路由器能够向其链接得链路广播不正确的开销,每个节点仅计算自己的转发表,自行处理收到的LS广播分组。路由计算在某种程度上是分离的,提供了一定的健壮性;
DV算法DV算法要求在每次迭代时,两个直接相邻邻居之间交换报文,只有当链路开销改变影响与该链路相连节点最低开销路径发生变化时,才传播以改变的链路开销DV算法收敛较慢,且在收敛时会遇到路由选择环路与无穷计数问题DV算法下,一个节点可向任意或所有目的节点通告其不正确的最低开销路径(DV算法中一个不正确的节点计算值会扩散到整个网络)

5.3 因特网中自治系统内部的路由选择:OSPF

前面的研究中都把网络看作一个互联路由器的集合,所有的路由器都执行相同的路由选择算法,各个路由器实际上很难相互区分,这带来了两个问题

问题一:规模。随着路由器数量的增加,设计路由选择信息的通信、计算和存储的开销极大。所有路由器之间广播连通性和链路开销更新的负担巨大,在如此巨大的量级下,距离向量(DV)算法永远无法收敛,因此必须采取一定的措施减少大型网络路由计算的复杂性

问题二:管理自治。因特网是ISP的网络,每个ISP都有自己的路由器网络。ISP通常希望按自己的意愿运行路由器,或对外部隐藏其网络的内部组织面貌。理想情况下,一个组织应该能够按照自己的愿望运行和管理其网络,还要能与外部网络连接

 这两个问题可以通过将路由器组织进自治系统(Autonomous System,AS)来解决,其中每个AS有一组通常在相同管理控制下的路由器组成。一个自治系统由其全局唯一的AS号(ASN)来标识

在相同AS中的路由器都运行相同的路由选择算法并且有彼此的信息。在一个自治系统内运行的路由选择算法叫做自治系统内部路由器选择协议(intra-autonomous system routing protocol)

开放最短路优先(OSPF)

OSPF路由选择及其关系密切的IS-IS协议都广泛用于AS内部路由选择

OSPF是一种链路状态协议,它使用洪泛链路状态信息和Dijkstra最低开销路径算法。每台路由器在本地运行Dijkstra最短路径算法,以确定一个以自身为根节点到所有子网的最短路径树

每条链路的开销是由网络管理员配置的。管理员可以使所有链路开销设为1,因而实现了最少条数路由选择;或者选择将链路权值用链路开销反比设置,从而鼓励流量使用低带宽链路

OSPF中,路由器向自治系统内所有其他路由器广播路由选择信息,而不是仅仅向其相邻路由器广播。每当一条链路的状态发生变化时,路由器就会广播链路状态信息。即使链路状态为发生变化,它也要周期性的广播链路状态(至少间隔30min一次)

优点

  ·安全:能够鉴别OSPF路由器之间的交换。依靠鉴别,只有受信任的路由器能够参与一个AS内的OSPF协议,因此可以防止恶意入侵者将不正确的信息注入路由器表内。如果使用简单的鉴别方式,则每台路由器配置相同的口令。但一台路由器发送一个OSPF分组时,将会以明文的方式包括口令,这样并不是十分安全。使用MD5鉴别基于配置在路由器上的共享秘密密钥。对每个OSPF分组路由器都会对该附加了秘密密钥的分组内容计算MD5散列值,将该计算值与路由器携带的散列值比较,从而严重分组真实性

  ·多条相同开销的路径:当到达某目的地的多条路径具有相同的开销时,OSPF允许使用多条路径(无须选择单一路径承载所有流量)

  ·对单播与多播路由选择的综合支持:多播OSPF(MOSPF)提供对OSPF的简单扩展,以提供多播路由选择,MOSPF为现有的OSPF链路状态广播机制增加了一种新型的链路状态通告

  ·支持在单个AS中的层次结构:一个OSPF自治系统能够层次化的配置多个区域,每个区域都运行自己的OSPF链路状态路由选择算法,区域内的每台路由器都向该区域内的所有其他路由器广播其链路状态。每个区域内,由一台或多台区域边界路由器负责为流向该区域以外的分组提供路由选择。

在AS中只有一个OSPF区域会被配置成主干区域。主干区域的主要作用是为该AS中其他区域之间的流量提供路由选择。主干总是包含本AS中的所有区域边界路由器,并且可能包含一些非边界路由器

AS中,区域间路由选择要求分组先路由至一个区域边界路由器(通过区域内路由选择),然后通过主干路由到达位于目的区域的边界路由器,在到达最终目的地

5.4 ISP之间的OSPF路由选择:BGP

OSPF是一个AS内部路由选择协议。在相同AS内的源和目的地之间进行分组选路时,分组遵循的路径完全由AS内路由选择协议所决定

当分组跨越多个AS进行路由时,需要一个自治系统间路由选择协议(inter-autonomous system routing protocol)。由于AS间路由选择协议设计多个AS之间的协调,所以AS通信必须运行相同的AS间路由选择协议。在因特网中,所有的AS运行相同的AS间路由选择协议,称为边界网关协议(Broder Gateway Protocol,BGP)

BGP是一种分布式和异步的协议 

5.4.1 BGP的作用

 在BGP中,分组并不是路由到一个特定的目的地址,而是路由到CIDR化的前缀,其中每个前缀标识一个子网或一个子网的集合。

在BGP中,一个目的地可以采用138.16.68/22的形式,对于这个例子来说包括1024个IP地址。因此一台路由器的转发表将会具有形式为(x,I)的表项,其中x是一个前缀(如138.16.68/22),I是该路由器接口之一的接口号

BGP为每台路由器提供一下功能:

1)从邻居AS获取前缀的可达信息。BGP允许每个子网向因特网的其余部分通告自己的存在。BGP确保因特网中的所有AS知道该子网。如果没有BGP则每个子网将是隔离的孤岛

2)确定到该前缀的“最好的”路由。一台路由器可能知道两条或更多条到特定前缀的不同路由,路由器将在本地运行一个BGP路由选择过程,用于确定最好的路由

5.4.2 通告BGP路由信息

对于每个AS,每台路由器要么是一个网关路由器(gateway router),要么是一个内部路由器(internal router) 。网关路由器是位于AS边缘的路由器,它直接连接到在其他AS中的一台或多台路由器。内部路由器仅连接自己所在AS中的主机和路由器

 以上图为例,对图中所有的路由器通告对于前缀x的可达性信息。首先,AS3向AS2发送一个BGP报文,告知x位于AS3中;将该报文表示为“AS3 x”。然后,AS2向AS1发送一个BGP报文,告知x存在,并且可以通过AS2进入AS3从而到达x;将该报文表示为“AS2 AS3 x”。以这种方式每个自治系统不仅知道x的存在,还知道通向x的自治系统的路径

虽然通告BGP的报文能大致知道穿越路径,但是对于实际发送报文而言是不准确

在BGP中,每对路由器通过使用179端口的半永久TCP连接交换路由选择信息。每条直接连接并且所有通过该连接发送的BGP报文称为BGP连接

跨越两个AS的BGP连接称为外部BGP(eBGP)连接;在相同AS中的两台路由器之间的BGP会话称为内部BGP(iBGP)连接

在每个AS中的路由器之间有多条iBGP连接。iBGP之间是TCP连接,也就意味着iBGP邻居采用的是逻辑连接的方式,两个IBGP连接不一定存在实际的物理链路

5.4.3 确定最好的路由

从一个给定的路由器到达一个目的子网可能有多条路径,因此需要在路径间进行选择并且相应的配置转发表

当路由器通过BGP连接通告前缀时,它在前缀中包括一些BGP属性(BGP attribute)。前缀及其属性称为路由(route)。两个较重要的属性是AS-PATH和NEXT-HOP

AS-PATH属性包含了已经通过的AS的列表,当一个前缀通过某个AS,该AS将其ASN加入AS-PATH中的现有列表。BGP路由器使用AS-PATH属性来检测和防止通告环路。如果一台路由器在路径列表中看到包含了自己的AS,将拒绝该通告。

NEXT-HOP是AS_PATH其实路由器接口的IP地址

 以上图为例子,从AS1到子网x有两条路:其中一条使用AS-PATH“AS2 AS3”;另一条使用AS-PATH“AS3”。对于从AS1通过AS2到达x的路由“AS2 AS3 x”,其属性NEXT-TOP是路由器2a左边接口的IP地址。对于从AS1绕过AS2到达x的路由“AS3 x”,其NEXT-TOP属性是路由器3d最左边接口的IP地址

总的来说,在这个例子中,AS1中的每台路由器都知道了前缀x的两台BGP路由:

路由器2a的最左侧接口的IP地址:AS2 AS3;x

路由器3d的最左侧接口的IP地址:AS3;x

在这里每条BGP路由包括三个组件:NEXT-TOP、AS-PATH、目的前缀

1.热土豆路由选择

在热土豆路由选择中,(从所有可能的路由中)选择的路由到开始该路由的NEXT-TOP路由器具有最小开销

简单来说:热土豆路由选择中,当一个分组到来时,节点必须尽快脱手,将其放入输出列最短的方向上排队,而不管该方向通向何方

热土豆路由选择是自私的算法,因为它只考虑自己在AS中的开销,而忽略了在AS之外端到端开销的其他部分。在热土豆路由选择中,对于在相同AS中的两台路由器,可能对相同的前缀选择不同的AS路径

2.路由器选择算法

 对于任何给定的目的地前缀,进入BGP的路由选择算法的输入是某前缀的所有路由的集合

如果只有一条路由,则选择该路由。如果到相同的前缀又两条或多条路由,则顺序地调用下列消除规则直至剩余一条路由:

1)路由被指派一个本地偏好值作为其属性之一。一条路由的本地偏好可能由该路由器设置,或者从在相同AS中的另一台路由器学到。本地偏好属性的值是一种策略决定,取决于该AS的网络管理员

2)在剩余的具有相同最高本地偏好值的路由中,选择具有最短AS-PATH的路由。如果该规则是路由选择的唯一规则,则BGP讲使用距离向量算法决定路径,其中距离测量使用AS跳的跳数,而不是路由器跳的跳数

3)在剩余所有具有相同的本地偏好值和相同的AS-APTH长度的路由中,使用热土豆路由选择,即选择具有最靠近NEXT-HOP路由器的路由

4)如果仍然剩余多条路由,则该路由器使用BGP标识符来选择路由

 举一个例子,我们再次考虑图5-10中的路由器1b。前缀x有两条BGP路由,一条通过AS2而另一条绕过AS2。如果它使用自己的热土豆路由选择,则BCP将通过AS2向前缀x路由分组。但在上面的路由选择算法中,在规则3之前应用了规则2,导致BGP选择绕过AS2的那条路由,因为该路由具有更短的AS-PATH。因此我们看到使用上述路由选择算法,BGP不再是一种自私的算法,即它先查找具有短AS路径的路由(因而很可能减小端到端时延)。

5.4.4 IP任播

IP任播就是将一个IP广播到多个服务器上,一个IP地址对应多个服务器,听起来跟我们一个域名解析到多台服务器差不多

除了作为因特网AS间路由选择协议外,BGP还常被用于实现IP任播,该服务常用于DNS中。

存在以下情况:①在许多分散的不同地理位置,,替换不同服务器上的相同内容②让每个用户从最靠近的服务器访问内容

一个CDN能够更换位于不同国家、不同服务器上的视频和其他对象。DNS系统能够在全世界的DNS服务器上复制DNS记录。当一个用户要访问该复制的内容,可以将用户指向具有该复制内容的“最近的”服务器

在IP任播配置阶段,CDN公司为多台服务器指派相同的IP地址,并且在每台服务器使用标准的BGP来通告IP地址。当某台BGP路由器收到对于该IP地址的多个路由通告,它将这些通告处理为对相同物理位置提供不同的路径。当配置其路由选择表时,每台路由器间本地化地使用BGP路由选择算法来选择最好的路由路径

比如,一个BGP路由离该路由器仅有一AS跳的距离,并且所有其他BGP路由时两AS跳或更多跳,则该BGP路由器将选择把分组路由到一AS跳远的位置

在初始BGP地址通告阶段后,CDN能够进行其分发内容搞得主要任务

实践中,IP任播广泛用于将DNS请求指向最近的根DNS服务器。当前根DNS服务器有13个IP地址,但是具有多个DNS服务器,也就是具有多个不同的物理地址。当一个DNS请求向这13个IP地址发送时,使用IP任播将该请求路由到负责改地址的最近的DNS根服务器 

5.4.5 路由选择策略

 上图显示了6个互联网的自治系统:A、B、C、W、X和Y。其中A、B、C、W、X和Y是AS,而不是路由器。

假设自治系统W、X和Y是接入ISP,而A、B和C是主干提供商网络。A、B和C直接向彼此发送流量,并且向它们的客户网络提供全部的BGP信息。所有进入一个接入ISP网络的流量必定是以该网络为目的地,所有离开一个结入ISP网络的流量必定源于该网络

显然W和Y是接入ISP,X是一个多宿接入ISP(multi-homed stub network),因为它是经由两个不同的提供商连接到网络的其余部分。X与W和Y一样,自身一定实进入\离开X的所有流量的源\目的地。

这种桩网络的行为是如何实现和强制实现的呢?X如何防止转发B与C之间的流量呢?

通过控制BGP路由的通告方式可以容易的实现。X如果向B和C通告它自身没有通向任何其他目的地的路径,那么X将起一个接入ISP作用。也就是说即使X知道通过XCY可以到达网络Y,X也不会将该路径通告给B。因此B也不会通过X转发目的为Y的流量

目前并没有强制主干ISP之间如何路由选择的官方标准。然而,商业运行的ISP们都遵守的一个经验法则是:任何穿越某ISP主干网的流量必须是其源或目的位于该ISP的某个客户网络中;不然这些流量将会免费搭车通过该ISP的网络

为什么会有不同的AS间和AS内部路由选择协议?

AS内与AS间的路由选择目标之间存在本质差别:
·策略。在AS之间,策略问题起主导作用。一个给定的AS产生的流量不能穿过冷一个特定的AS。BGP承载了路径属性,并提供路由选择信息的受控分布,以便能进行路由选择决策。然而,在一个AS内部,一切都是管理员的控制下执行同一个BGP协议,因此策略问题并不影响AS内部的选择路由

·规模。如何扩展一个路由选择算法及其数据结构以处理大量网络或大量网络之间的路由选择能力是AS间路由选择的一个关键问题。在一个AS内部,可扩展性并不是关注的焦点。如果单个ISP变得过大,可以将其分为两个AS,并且在两个新的AS之间执行AS间的路由选择

·性能。AS间路由选择是面向策略的,因此路由质量是次要关心问题(一条更长或开销更高的路由也许由于满足某些策略条件而被采用,即使有更短开销更少的不满足条件的路由存在)在一个AS内部,更关心一条路由的性能,而不是策略的执行情况

5.4.6 拼装在一起:在因特网中呈现

下面将举一个例子,用于描述IP地址、DNS和BGP

假设有一个具有若干服务器的小型公司网络,包括一台描述公司产品和服务的公告Web服务器,一台员工获取电子邮件报文的电子邮箱服务器和一台DNS服务器。并且希望全世界都可以访问Web站点来获取产品和服务,并且希望员工能向遍布世界的客户发送和接收电子邮件

为了实现上述功能,首先需要获得因特网连接,也就是与本地ISP签订合同并进行连接。公司需要一台网关路由器,该路由器将与本地ISP的一台路由器相连。本地ISP将提供一个IP地址范围(比如由256个地址组成的一个/24地址范围)。当拥有了物理连接和IP地址范围之后,需要在该地址范围内分配IP地址:一个给Web服务器,一个给电子邮件服务器,一个给DNS服务器,一个给网关路由器,并且将IP地址分配给公司中的其他服务器和网络设备

其次,需要与一个因特网注册机构签订合同,来为公司获取一个域名。由于外接将联系公司的DNS服务器获取该服务器的IP地址,所以还需要向注册机构提供DNS服务器的IP地址。此后注册公司将会在.com顶级域名服务器中为公司的DNS服务器设置一个表项(域名和对应的IP地址)。此后知道域名(比如 baidu.com)的用户就可以经过DNS系统获取公司的DNS服务器IP地址

为了使人们能够发现Web服务器的IP地址,需要在DNS服务器中加入一个将Web服务器的主机名映射到IP地址的表项。并且为公司中其他的公共可用服务器设置类似的表项,包括电子邮件服务器等。如果一个用户要浏览Web服务器,则DNS系统将联系DNS服务器,找到Web服务器的IP地址,并将其返回给用户。从而用户可以与Web服务器创建一个直接的TCP连接

假设用户已经知道Web服务器的IP地址,并且向该IP地址发送一个IP数据报。该数据报将通过互联网进行路由,经历了在许多不同自治系统中的一系列路由器,并最终到达公司的Web服务器。当任何一个路由器收到该数据报时,将去它的转发表中寻找一个表项来确定转发该数据报的外出端口。因此每一台路由器都需要知道公司的/24前缀

一台路由器如何知道公司的前缀呢?通过BGP获得该前缀。当公司与本地ISP签订合同并获得了分配的前缀时,本地ISP将使用BGP向与其连接的ISP通告你的前缀,从而使得能够将数据报适当的转发到正确的Web和电子邮件服务器

5.5 SDN控制平面

SDN指软件定义网络,本节中包括控制分组在网络SDN使能设备中转发的网络范围逻辑,以及这些设备和服务的配置与管理

网络的转发设备称为“分组交换机”,能够根据网络层源\目的地址、链路层源\目的地址以及运输层、网络层和链路层中分组首部字段做出转发决定

SDN体系结构的关键特征

基于流的转发。SDN控制的交换机的分组转发工资,能够基于运输层、网络层或链路层首部中任意数量的首部字段值进行。传统方法中IP数据报的转发仅依据数据报的目的IP地址进行。而SDN控制平面的工作是计算、管理和安装所有网络交换机中的流表项

数据平面与控制平面分离。数据平面由网络交换机组成,交换机是相对简单的设备,该设备在流表中执行“匹配加动作的规则”。控制平面由服务器以及决定和管理交换机流表的软件组成

网络控制功能:位于数据平面交换机外部。控制平面自身由两个组件组成:一个SDN控制器,以及若干网络控制应用程序。控制器维护准确的网络状态信息,为运行在控制平面中的网络控制应用程序提供这些信息;应用程序同通过控制器提供的方法监视、编程和控制下面的网络设备

可编程的网络。通过运行在控制平面中的网络控制应用程序,该网络是可编程的。应用程序使用了由SDN控制器提供的API来定义和控制网络设备中的数据平面

5.5.1 SDN控制平面:SDN控制器和SDN网络控制应用程序

SDN控制平面分为两个部分:SDN控制器和SDN网络控制应用程序

SDN控制器的功能包括三个层次:

通信层:SDN控制器和受控网络设备之间的通信。SDN控制器控制设备的运行,需要一个协议来传送控制器与这些设备之间的信息。并且设备需要能够向控制器传递本地观察到的事件(比如报文指示链路的激活或停用,设备加入网络等)OpenFlow是一种提供这种通信功能的特定协议

网络范围状态管理层。SDN控制平面做出控制决定,需要依靠控制器对有关网络的主机、链路、交换机和其他SDN控制设备的状态信息。控制平面的最终目标是决定各个设备上的流表,控制器可以维护这些流表的拷贝

对于网络控制应用程序层的接口:控制器通过接口与网络控制层应用交互。该API接口允许网络控制应用程序在管理状态层之间读\写网络状态和流表。当状态改变时,应用程序能够注册进行通告

5.5.2 OpenFlow协议

OpenFlow是一种网络通信协议,应用于SDN架构中控制器和转发器之间的通信。SDN的一个核心思想就是“转发、控制分离”,要实现转、控分离,就需要在控制器与转发器之间建立一个通信接口标准,允许控制器直接访问和控制转发器的转发平面

OpenFlow引入了“流表”的概念,转发器通过流表来指导数据包的转发。控制器正是通过OpenFlow提供的接口在转发器上部署相应的流表,从而实现对转发平面的控制。

OpenFlow协议运行在SDN控制器和SDN控制的交换机或其他实现OpenFlow API设备之间。OpenFlow协议运行在TCP之上,使用6653的默认端口号

从控制器到受控交换机流动的重要报文包括:

配置。该报文允许控制器查询并设置交换机的配置参数

修改状态。该报文有控制器所使用,以增加/删除或修改交换机流表中的表项,并且设置交换机端口特性

读状态。该报文被控制器用于从交换机的流表和端口手机统计数据和计数器值

发送分组。该报文被控制器用于在受控交换器的特定端口发送一个特定报文

从受控交换机到控制器流动的重要报文包括:

流删除。该报文通知控制器已经删除一个流表项,例如由于超时,或作为收到“修改状态”报文的结果

端口状态。交换机通过该报文项控制器通知端口状态的变化

分组入。一个分组到达交换机端口,并且不能与任何流表项匹配,那 么这个分组将被发送给控制器进行额外处理,匹配的分组也被发送给控制器,作为 匹配时所采取的一个动作 “分组入“报文被用于将分组发送给控制器

5.5.3 数据平面和控制平面交互的例子

下图中的的每台路由器中都执行Dijkstra算法,并且在所有网络路由器中洪泛链路状态更新

假设

1)Dijkstra算法作为一个单独的程序来执行,位于分组交换机的外部

2)分组交换机向SDN控制器发送链路更新并且交换机之间不互相发送

3)假设交换机中s1和s2之间的链路断开

①交换机s1由于与s2之间的链路故障,使用OpenFlow“端口状态”报文向SDN控制器通报该链路状态的更新

②SDN控制器接收到s1的链路状态更新的OpenFlow报文,并且通告链路状态管理器,有管理器更新链路状态库

③实现Dijkstra链路状态路由选择的网络控制应用程序在之前进行了注册,当链路状态更新时将会得到通告。引用程序接受该链路状态更新的通告

④链路状态路由选择应用程序与链路状态管理器相互作用,得到更新的链路状态。同时参考状态管理层中的其他组件,计算新的最低开销路径

⑤链路状态路由选择应用与流表管理器交互,流表管理器决定更新后的流表内容

⑥流表管理器使用OpenFlow协议受影响交换机s1、s2和s4的流表项,其中s1此时将通过s4向s2发送报文,s4此时也必须转发来自s1且目的地为s2的分组

 通过上面这个例子可以得出,使用SDN的服务器能够更容易的将最低开销路径的路由选择转变为更加偏向定制的路由选择。由于控制器可以随意改变流表,所以可以实现任何形式的转发,并且只通过改变它的应用控制程序

这与传统的情况不同,传统情况必须改变所有路由器中的软件,而路由器是由不同的厂商提供给ISP的

5.5.4 SDN的过去和未来

在SDN早期,采用单一的SDN协议和单一的SDN控制器。此后SDN控制器的数量得到了很大的增长,其中有些SDN控制器是公司特有和专用的

OpenDaylight控制器

ODL控制器组件的主要部分与前文中的结构完全对应。网络服务应用程序用于决定数据平面转发和其他服务如何在交换机中完成。

与之前规范的控制器不同,ODL控制器具有两个接口,通过这两个接口,应用程序可以与原生的控制器服务通信以及彼此之间进互相通信、

外部应用程序使用REST请求-响应API与控制器模块通信,通信运行在HTTP上

内部应用程序经过服务抽象层(SAL)互相通信

ODL的基本网络服务功能是该控制器的核心,决定网络范围状态管理能力。SAL是控制器的神经中枢,允许控制器组件和应用程序互相调用服务并且记录它们产生的事件。它也在通信层次对特定的底层通信协议提供了统一的抽象接口,包括OpenFlow和SNMP(简单网络管理协议)OVSDB是用于管理数据中心交换的协议,而数据中心交换是SDN基数的一个重要应用领域

ONOS控制器

 ONOS控制器中有三个层次:

1)北向抽象和协议。ONOS的一个独有特征框架是允许应用程序请求高层服务,而不必知道该服务的执行细节。以同步或异步的方式通过北向API向网络控制的应用程序提供状态信息

2)分布式核。ONOS的分布式核中维护了网络的链路、主机和设备的状态。ONOS被部署为在一系列互联的服务器上的一种服务,每台服务器都运行着ONOS软件的相同副本,增加服务器的数量就会增加服务能力。ONOS核提供了在实例之间服务复制和协同的机制,这种机制为上层应用程序和下层网络设备提供了逻辑上几种的核服务抽象

3)南向抽象和协议。南向抽象屏蔽了底层主机、链路、交换机和协议的异构性,允许分布式核对设备核协议不知情

5.6 ICMP:因特网控制报文协议

因特网控制报文协议ICMP(Internet Control Message Protocol)是一个差错报告机制,是TCP/IP协议簇中的一个重要子协议,通常被IP层或更高层协议(TCP或UDP)使用,主要用于在主机和路由器之间传递控制消息,报告主机是否可达、路由是否可用等。

ICMP通常被认为是IP的一部分,但从体系结构上件它位于IP之上,因为ICMP报文时承载在IP分组之中的

为什么需要ICMP?

在数据传输的过程中,IP提供尽力而为的服务,指为了把数据包发送到目的地址尽最大努力。它并不对目的主机是否收到数据包进行验证,无法进行流量控制和差错控制。因此在数据包传输过程中,产生各种错误在所难免

为了更有效地转发IP数据包和提高数据包交付成功的机会,ICMP应运而生。使用ICMP,当网络中数据包传输出现问题时,主机或设备就会向上层协议报告差错情况和提供有关异常情况的报告,使得上层协议能够通过自己的差错控制程序来判断通信是否正确,以进行流量控制和差错控制,从而保证服务质量

ICMP报文有一个类型字段和一个编码字段,并且包含引起该ICMP报文首次生成的IP数据报的首部和的前8个字节。如下图所示,可以看出ICMP实际上并不仅是用于差错报告

ICMP报文中的源抑制报文,起初目的是执行拥塞控制,即使得拥塞的路由器向一台主机发送一个ICMP报文,强制该主机减少发送速率。但由于TCP在运输层具有自己的拥塞控制机制,所以不需要利用网络层中的反馈信息,也就不需要使用ICMP的源抑制报文

5.6.1 ICMP工作方式

当数据包处理过程出现差错时,ICMP向数据包的源端设备报告这个差错,它既不会纠正这个差错,也不会通知中间的网络设备。因为ICMP报文被封装在IP数据包内部,作为IP数据包的数据部分通过互联网传递。IP数据包中的字段包含源端和最终的目的端,并没有记录报文在网络传递中的全部路径(除非IP数据包中设置了路由记录选项)。因此当设备检测到差错时,它无法通知中间的网络设备,只能向源端发送差错报告

源端在收到差错报告后,它虽然不能判断差错是由中间哪个网络设备所引起的,但是却可以根据ICMP报文确定发生错误的类型,并确定如何才能更好地重发传递失败的数据包

ICMP常被用于ping程序和Traceroute程序。在网络管理和监测中,网络质量分析NQA计数更加充分应用了ICMP

·ping程序。最常见的用于检测IPv4和IPv6网络设备是否可达的调试手段,使用ICMP的echo(回显)信息来确定远程设备是否可达、与远程主机通信的来回延迟、报文的丢失情况

·Traceroute程序。主要用于查看数据报从源端到目的端的路径信息。从而检查网络连接是否可用。当网络出现故障时,可以用该命令定位故障点

5.7 网络管理和SNMP

网络是由许多硬件和软件部件组成的,即包括构成网络的物理部件的链路、交换机、路由器、主机和其他设备,也包括控制和协调这些设备的许多协议

什么是网络管理?

网络管理包括了硬件、软件和人类元素的设置、综合和协调,用以监视、测试、轮询、配置、分析、评价和控制网络及网元资源,用合理的成本满足实时性、运营性能和服务质量的要求

5.7.1 网络管理框架

管理服务器(managing server)是一个应用程序,通常有人的参与,并运行在网络运营中心(NOC)的集中式网络管理工作站上。管理服务器是执行网络管理活动的地方,控制网络管理信息的收集、处理、分析和显示。在管理服务器中进行控制网络行为的动作,人类网络管理员与网络设备打交道

被管设备(managed device)是网络装备的一部分,位于被管理的网络中。被管设备可以是一台主机、路由器、交换机、中间盒、调制解调器或其他联网设备。在一个被管设备中有几个被管对象,这些被管对象是被管设备中硬件的实际部分(比如,网卡只是主机中的一个组件)和用于这些硬件及软件组件的配置参数

管理信息库(Management Information Base,MIB)用于收集一个被管设备中的每个被管对象的关联信息。定义被管理对象的一系列属性,包括:对象的名字、访问权限、数据类型。MIB指明了网络元素所维护的变量,即能够被NMS查询和设置的信息,给出了一个网络中所有可能的被管理对象的集合的数据结构

网络管理代理(network management agent)是运行在被管设备中的一个进程,用于与管理服务器通信,在管理服务器的命令和控制下在被管设备中采取本地操作

网络管理协议(network management protocol)运行在管理服务器和被管设备之间,允许管理服务器查询被管设备的状态,并通过代理间接的在设备上执行操作。代理能够通过网络管理协议向管理服务器通知异常事件。网络管理协议并不能管理网络,但它为网络管理员提供了管理网络的能力

5.7.2 简单网络管理协议

网络管理协议(Simple Network Management Protocol)版本2(SNMPv2)是一个应用层协议,用于在管理服务器和代表管理服务器执行的代理之间传递网络管理协议和信息报文

SNMP协议分为三个版本:SNMPv1、SNMPv2c和SNMPv3。

  • SNMPv1是SNMP协议的最初版本,提供最小限度的网络管理功能。SNMPv1基于团体名认证,安全性较差,且返回报文的错误码也较少。
  • SNMPv2c也采用团体名认证。在SNMPv1版本的基础上引入了GetBulk和Inform操作,支持更多的标准错误码信息,支持更多的数据类型(Counter64、Counter32)。
  • SNMPv3主要在安全性方面进行了增强,提供了基于USM(User Security Module)的认证加密和基于VACM(View-based Access Control Model)的访问控制。SNMPv3版本支持的操作和SNMPv2c版本支持的操作一样

SNMP最常使用的是请求响应模式,其中SNMP管理服务器向SNMP代理发送一个请求,代理接收请求后执行操作,并对该请求发送一个响应。请求通常用于查询或修改与某被管设备关联的MIB对象值

SNMP第二被使用的是代理向管理服务器发送的一种非请求报文,该报文称为陷阱报文(trap message)。陷阱报文用于通知管理服务器,一个异常情况已经导致了MIB对象值得改变

 上图所示SNMPv2定义得7种类型的报文,这些报文一般称为协议数据单元(PDU)

GetReques、GetNextReques、GetBulkRequest PDU 都是管理服务器向代理发送的, 以请求位于该代理所在的被管设备中的一个或多个 MIB 对象值。其值被请求的 MIB 对象的对象标识符定义在该 PDU 的变量绑定部分。GetRequest、GetNextRequest和GetBulkRequest的差异在于它们的数据请求粒度。GetRequest 能够请求MIB值的任意集合;多个GetNextRequest 能用于顺序地读取 MID对象的列表或表格;GetBulkRequest 允许读取大块数据,能够避免因发送多个 GetRequest或 GetNextRequest 报文可能导致的额外开销。在所有的三种情况下,代理用包括该对象标识符和它们相关值的 Response PDU 行响应

管理服务器使用 SetRequest PDU 来设置位于被管设备中的一个或多个MIB对象的值。代理用带有“noError”差错状态的 Response PDU 进行应答,以证实该值的确已被设置

管理服务器使用 lnformRequest PDU 来通知另 一个 MIB 信息管理服务器,后者对于接收服务器是远程的

Response PDU 通常从被管设备发送给管理服务器,以响应来自该服务器的请求报文,返回所请求的信

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/891958.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IDEA 如何制作代码补丁?IDEA 生成 patch 和使用 patch

什么是升级补丁? 比如你本地修复的 bug,需要把增量文件发给客户,很多场景下大家都需要手工整理修改的文件,并整理好目录,这个很麻烦。那有没有简单的技巧呢?看看 IDEA 生成 patch 和使用 patch 的使用。 介…

Kafka—工作流程、如何保证消息可靠性

什么是kafka? 分布式事件流平台。希望不仅仅是存储数据,还能够数据存储、数据分析、数据集成等功能。消息队列(把数据从一方发给另一方),消息生产好了但是消费方不一定准备好了(读写不一致)&am…

常量(constant)

1、概述 常量:是指在Java程序运行期间固定不变的数据。 2、分类 类型含义数据举例整数常量所有的整数0,1,567,-9 小数常量 (浮点数常量) 所有的小数0.0,-0.1,2.55字符常量单引号引起…

Python量化交易11——使用AKShare获取公司财务数据

AKshare库是一个很好用的金融数据获取的API,股票的数据很全面,还有很多别的数据: 链接:AKShare 股票数据 — AKShare 1.10.85 文档 他们获取来源都是东方财富网或者巨潮网等,都会写上的。 本次教大家怎么用AKshare获取…

第九章 动态规划part11(代码随想录)

123.买卖股票的最佳时机III 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票&…

vscode如何汉化

首先我们到vscode官网下载 链接如下: Visual Studio Code - Code Editing. Redefined 根据自己需要的版本下载就好 下载并且安装完毕之后 运行vscode 然后按快捷键 CTRLSHIFTX 打开安装扩展界面 搜索简体中文 安装就可以了 谢谢大家观看

Matplotlib数据可视化(一)

目录 1.Matplotlib简介 2.Matplotlib绘图基础 2.1 创建画布与子图 2.2 添加画布属性 2.3 绘图的保存与显示 1.Matplotlib简介 Matplotlib是一个用于绘制数据可视化图表的Python库。它提供了广泛的功能和灵活性,可以创建各种类型的图表,包括折线图、…

Microsoft Edge浏览器开启ChatAI扩展

ChatAi每日可以免费使用5次,购买每月8.8,每年88。价格还不算贵 安装扩展过程: 打开 Microsoft Edge浏览器,点击右上角三个点,在扩展中选择加载项,在Microsoft Edge加载项中搜索openai,选择Chat…

kafka晋升之路-理论+场景

kafka晋升之路 一:故事背景二:核心概念2.1 系统架构2.2 生产者(Producer)2.2.1 生产者分区2.2.2 生产者分区策略 2.3 经纪人(Broker)2.3.1 主题(Topic)2.3.2 分区(Partit…

人工智能与云计算实训室建设方案

一、 人工智能与云计算系统概述 人工智能(Artificial Intelligence,简称AI)是一种模拟人类智能的科学和工程,通过使用计算机系统来模拟、扩展和增强人类的智能能力。人工智能涉及多个领域,包括机器学习、深度学习、自然…

k8s简介及虚拟机快速搭建k8s集群

文章目录 1、k8s简介1.1、部署方式的变迁1.2、定义1.3、Kubernetes提供的功能 2、虚拟机快速搭建k8s集群2.1、虚拟机配置(centos7 2G内存2个处理器)2.2、基础环境准备2.3、docker安装(易踩坑)2.4、安装k8s组件2.5、master节点部署…

英飞凌在车辆信息安全方面上应用

如今,网络安全在多个层面影响着我们每个人。我们的专业工作、个人生活,甚至我们的汽车,都依赖于复杂软件上运行的连接和技术。随着信息技术日益融入我们的日常生活,我们对后续信息系统的依赖性也与日俱增。反过来,这些…

Win10+anaconda+CUDA+pytorch+vscode配置

Win10anacondaCUDApytorchvscode配置 1.安装anaconda2.安装CUDA确认CUDA版本确认CUDA和pytorch版本安装CUDA 3.安装cudnn4.安装Pytorch5.vscode配置安装VScodevscode配置pytorch环境 1.安装anaconda 官网https://www.anaconda.com 下载安装,路径全英文然后记得有一…

【微服务】springboot 整合mysql实现版本管理通用解决方案

目录 一、前言 1.1 单独执行初始化sql 1.2 程序自动执行 二、数据库版本升级管理问题 三、spring 框架sql自动管理机制 3.1 jdbcTemplate 方式 3.1.1 创建数据库 3.1.2 创建 springboot 工程 3.1.3 初始化sql脚本 3.1.4 核心配置类 3.1.5 执行sql初始化 3.2 配置文…

numpy基础知识

文章目录 安装numpynumpy的ndarray对象ndarray 和 list 效率比较创建一/二维数组ndarray的常用属性调整数组形状ndarray转list numpy的数据类型数组的运算数组和数的计算数组和数组的计算 数组的轴数组的索引和切片数组的与或非和三目运算符numpy的插入、删除、去重插入删除去重…

财务数据分析用什么软件好?财务数据分析的几个重要数据是什么?

财务的数据分析也分很多种的,就拿最粗略的划分来说,也可以分为3大领域—— 财务数据处理类工具财务数据挖掘类工具财务数据可视化工具 01 数据处理类 在财务数据处理这一块儿,不用说,当然是以excel为主力的数据处理类工具—— …

22年电赛B题——具有自动泊车功能的电动车——做题记录以及经验分享

前言 这道题目也是小车类电赛题目,十月份的电赛题,由于之前积累了一些经验,这道题目在做下来的感觉还行,但是我们看题目没有仔细审题,和题目要求有一些些偏差,但是基础大功能还是做出来辽,大家还是可以参考…

SASS 学习笔记 II

SASS 学习笔记 II 上篇笔记,SASS 学习笔记 中包含: 配置 变量 嵌套 这里加一个扩展,嵌套中有一个 & 的用法,使用 & 可以指代当前 block 中的 selector,后面可以追加其他的选择器。如当前的 scope 是 form&a…

zotero在不同系统的安装(win/linux)

1 window系统安装 zotero 官网: https://www.zotero.org/ 官方文档 :https://www.zotero.org/support/ (官方)推荐常用的插件: https://www.zotero.org/support/plugins 入门视频推荐: Zotero 文献管理与知识整理最佳实践 点击 exe文件自…

30.Netty源码服务端启动主要流程

highlight: arduino-light 服务端启动主要流程 •创建 selector •创建 server socket channel •初始化 server socket channel •给 server socket channel 从 boss group 中选择一个 NioEventLoop •将 server socket channel 注册到选择的 NioEventLoop 的 selector •…