当前位置: 首页 > news >正文

五、网络层:控制平面,《计算机网络(自顶向下方法 第7版,James F.Kurose,Keith W.Ross)》

目录

一、导论

二、路由选择算法

2.1 路由(route)的概念

2.2 网络的图抽象

2.2.1 边和路由的代价

2.2.2 最优化原则

2.3 路由的原则

2.4 路由选择算法的分类

2.5 link state 算法

2.5.1 LS路由工作过程

2.5.2 链路状态路由选择(link state routing)

2.6 距离矢量路由选择(distance vector routing)

2.7 LS 和 DV 算法 的比较

三、自治系统内部的路由选择:OSPF

3.1 RIP( Routing Information Protocol)

3.1.1 RIP 通告(advertisement)

3.1.2 链路失效和恢复

3.1.3 进程处理

3.2 OSPF(Open Shortest Path First)

四、ISP之间的路由选择: BGP

4.1 层次路由

4.2 互联网AS间路由:BGP

4.2.1 BGP基础

4.2.2 路径的属性& BGP 路由

4.2.3 BGP 路径通告

4.2.4 BGP报文

4.2.5 BGP, OSPF, 转发表表项

4.2.6 BGP 路径选择

4.2.7 热土豆路由

4.2.8 为什么内部网关协议和外部网关协议如此不同?

五、SDN 控制平面

5.1 传统方式 VS SDN

5.2 流量工程

5.3 SDN特点

5.4 SDN 架构

5.5 OpenFlow

5.6 SDN: 面临的挑战

六、IP组播

6.1 硬件组播

6.2 网际组管理协议 IGMP 协议

6.3 组路由选择协议

七、ICMP: Internet Control Message Protocol

八、小结


一、导论

网络层功能

  • 转发:将分组从路由器的一个输入端口移到合适的输出端口——数据平面
  • 路由:确定分组从源到目标的路径——控制平面

2种构建网络控制平面功能的方法:

  • 每个路由器控制功能实现(传统)
  • 逻辑上集中的控制功能实现(software defined networking,SDN)

传统方式:每一路由器(Per-router)控制平面

每一个路由器中的单独路由器算法元件,在控制平面进行交互

SDN方式:逻辑上集中的控制平面

一个不同的(通常是远程的)控制器与本地控制代理(CAs交互。

二、路由选择算法

2.1 路由(route)的概念

  • 路由:按照某种指标(传输延迟,所经过的站点数目等)找到一条 从源节点到目标节点的较好路径
    • 较好路径:按照某种指标较小的路径
    • 指标:站数,延迟,费用,队列长度等,或者是一些单纯指标的加权平均
    • 采用什么样的指标,表示网络使用者希望网络在什么方面表现突出,什么指标网络使用者比较重视
  • 网络为单位进行路由(路由信息通告 + 路由计算)
    • 网络为单位进行路由,路由信息传输、计算和匹配的代价低
    • 前提条件是:一个网络所有节点地址前缀相同,且物理上聚集
    • 路由就是:计算网络 到其他网络如何走的问题
  • 网络到网络的路由 = 路由器-路由器之间路由
    • 网络对应的路由器到其他网络对应的路由器的路由
    • 在一个网络中:路由器-主机之间的通信,链路层解决
    • 到了这个路由器就是到了这个网络
  • 路由选择算法(routing algorithm:网络层软件的一部分,完成路由功能

2.2 网络的图抽象

2.2.1 边和路由的代价

图:G(N, E)

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} } 边有代价

  • c(x, x') = 链路的代价(x, x')
    • 上图中,c(w, z) = 5
  • 代价可能总为1,或是 链路带宽的倒数,拥塞情况的倒数

Cost of path(x1, x2, ..., xn = c(x1, x2) + c(x2, x3) + ... + c(xn-1, xn)

路由的输入:拓扑、边的代价,源节点

输出的输出:源节点的汇集树

2.2.2 最优化原则
  • 汇集树(sink tree
    • 此节点到所有其它节点的最优路径形成的树
    • 路由选择算法就是为所有路由器找到使用汇集树
    • 其实就是数据结构课程中的最短路径树

2.3 路由的原则

  • 路由选择算法的原则
    • 正确性(correctness):算法必须是正确的和完整的,使分组一站一站接力,正确发向目标站;完整:目标所有的站地址,在路由表中都能找到相应的表项;没有处理不了的目标站地址;
    • 简单性(simplicity):算法在计算机上应简单:最优但复杂的算法,时间上延迟很大,不实用,不应为了获取路由信息增加很多的通信量;
    • 健壮性(robustness):算法应能适应通信量网络拓扑的变化:通信量变化,网络拓扑的变化算法能很快适应; 不向很拥挤的链路发数据,不向断了的链路发送数据;
    • 稳定性(stability):产生的路由不应该摇摆
    • 公平性(fairness):对每一个站点都公平
    • 最优性(optimality):某一个指标的最优,时间上,费用 上,等指标,或综合指标;实际上,获取最优的结果代价较高,可以是次优的

2.4 路由选择算法的分类

全局或者局部路由信息?

全局:

  • 所有的路由器拥有完整的拓扑和边的代价的信息
  • “link state” 算法

分布式:

  • 路由器只知道与它有物理连接关系的邻居路由器,和到相应邻居路由器的代价值
  • 叠代地与邻居交换路由信息、计算路由信息
  • “distance vector” 算法

静态或者动态的?

  • 静态:
    • 路由随时间变化缓慢
  • 动态:
    • 路由变化很快
      • 周期性更新
      • 根据链路代价的变化而变化

非自适应算法(non-adaptive algorithm):不能适应网络拓扑和通信量的变化,路由表是事先计算好的

自适应路由选择(adaptive algorithm):能适应网络拓扑和通信量的变化

2.5 link state 算法

2.5.1 LS路由工作过程
  • 配置LS路由选择算法的路由工作过程
    • 各点通过各种渠道获得整个网络拓扑,网络中所有链路代价等信息(这部分和算法没关系,属于协议和实现)
    • 使用LS路由算法,计算本站点到其它站点的最优路径(汇集树),得到路由表
    • 按照此路由表转发分组(datagram方式)
      • 严格意义上说不是路由的一个步骤
      • 分发到输入端口的网络层

2.5.2 链路状态路由选择(link state routing)
  • LS路由的基本工作过程
    1. 发现相邻节点,获知对方网络地址
    2. 测量到相邻节点的代价(延迟,开销)
    3. 组装一个LS分组,描述它到相邻节点的代价情况
    4. 将分组通过扩散的方法发到所有其它路由器 以上4步让每个路由器获得拓扑边代价
    5. 通过Dijkstra算法找出最短路径(这才是路由算法)
      1. 每个节点独立算出来到其他节点(路由器=网络)的最短路径
      2. 迭代算法:第k步能够知道本节点到k个其他节点的最短路径

1、发现相邻节点,获知对方网络地址

  • 一个路由器上电之后,向所有线路发送HELLO分组
  • 其它路由器收到HELLO分组,回送应答,在应答分组中,告 知自己的名字(全局唯一)
  • LAN中,通过广播HELLO分组,获得其它路由器的信息,可以认为引入一个人工节点

2、测量到相邻节点的代价(延迟,开销)

  • 实测法,发送一个分组要求对方立即响应
  • 回送一个ECHO分组
  • 通过测量时间可以估算出延迟情况

3、组装一个分组,描述相邻节点的情况

  • 发送者名称
  • 序号,年龄
  • 列表:给出它相邻节点,和它到相邻节点的延迟

4、将分组通过扩散的方法发到所有其它路由器

  • 顺序号:用于控制无穷的扩散,每个路由器都记录( 源路由器,顺序号),发现重复的或老的就不扩散
    • 具体问题1:循环使用问题
    • 具体问题2:路由器崩溃之后序号从0开始
    • 具体问题3:序号出现错误
  • 解决问题的办法:年龄字段(age
    • 生成一个分组时,年龄字段不为0
    • 每个一个时间段,AGE字段减1
    • AGE字段为0的分组将被抛弃
  • 关于扩散分组的数据结构
    • Source:从哪个节点收到LS分组
    • Seq,Age:序号,年龄
    • Send flags:发送标记,必须向指定的哪些相邻站点转发LS分组
    • ACK flags:本站点必须向哪些相邻站点发送应答
    • DATA:来自source站点的LS分组
    • 下面是节点B的数据结构

5、通过Dijkstra算法找出最短路径

  • 路由器获得各站点LS分组和整个网络的拓扑
  • 通过 Dijkstra 算法计算出到其它各路由器的最短路径(汇集树)
  • 将计算结果安装到路由表中
  • LS的应用情况
    • OSPF协议是一种LS协议,用于Internet
    • IS-IS(intermediate system- intermediate system)被用于Internet主干中,Netware

符号标记

  • c(i, j):从节点 ij 链路代价(初始状态下非相邻节点之间的 链路代价为∞)
  • D(v):从源节点到节点V的当前路径代价(节点的代价)
  • p(v):从源到节点V的路径前序节点
  • N’:当前已经知道最优路径的的节点集合(永久节点的集合)

LS路由选择算法的工作原理

  • 节点标记:每一个节点使用(D(v),p(v)),如:(3, B)标记
    • D(v)从源节点由已知最优路径到达本节点的距离
    • P(v)前序节点来标注
  • 2类节点
    • 临时节点(tentative node):还没有找到从源节点到此节点的最优路径的节点
    • 永久节点(permanent node) N’: 已经找到了从源节点到此节点的最优路径的节点

算法流程:

  • 初始化
    • 除了源节点外,所有节点都为临时节点
    • 节点代价除了与源节点代价相邻的节点外,都为∞
  • 从所有临时节点中找到一个节点代价最小的临时节点,将之变成永久节点(当前节点)W
  • 对此节点的所有在临时节点集合中的邻节点(V)
    • 如 D(v) > D(w) + c(w, v),则重新标注此点,(D(W) + C(W, V), W)
    • 否则,不重新标注
  • 开始一个新的循环

示例:

算法复杂度:n 个节点

  • 每一次迭代:需要检查所有不在永久集合N中节点
  • n(n + 1) / 2 次比较:O(n^2)
  • 堆优化:O(nlogn)

可能的震荡:

  • 链路代价 = 链路承载的流量
  • 一开始都走轻载路径,然后轻载路径变成重载路径……如此往复,导致路径震荡

标题: fig:

2.6 距离矢量路由选择(distance vector routing)

  • 动态路由算法之一
  • DV算法历史及应用情况
    • 1957 Bellman, 1962 Ford Fulkerson
    • 用于ARPANET,Internet(RIP),DECnet,Novell, ApplTalk
    • 距离矢量路由选择的基本思想
      • 各路由器维护一张路由表,结构如图(其它代价)

      • 各路由器与相邻路由器之间交换路由表
      • 根据获得的路由信息,更新路由表

  • 代价及相邻节点间代价的获得
    • 跳数(hops),延迟(delay),队列长度
    • 相邻节点间代价的获得:通过实测
  • 路由信息的更新
    • 根据实测 得到本节点A到相邻站点的代价(如:延迟)
    • 根据各相邻站点声称它们到目标站点B的代价
    • 计算出本站点A经过各相邻站点到目标站点B的代价
      • 找到一个最小的代价,和相应的下一个节点Z,到达节点 B 经过此节点Z,并且代价为A-Z-B的代价
      • 其它所有的目标节点一个计算法

示例:

距离矢量算法

  • Bellman-Ford 方程(动态规划)

异步式, 迭代: 每次本地迭代 被以下事件触发:

  • 本地链路代价变化了
  • 从邻居来了DV的更新消息

分布式:

  • 每个节点只是在自己的DV改 变之后向邻居通告
    • 然后邻居们在有必要的时候 通知他们的邻居

每个节点:

  • DV 的无穷计算问题
    • DV 的特点
      • 好消息传得快,坏消息传得慢
    • 好消息的传播以每一个交换周期前进一个路由器的速度进行
      • 好消息:某个路由器接入或有更短的路径
      • 例子:目标是A,初始BCDE到A都不可达,然后每次不断传播
      • 坏消息的传播速度非常慢(无穷计算问题)
      • 例子: 某时刻,B到A不可达
        • 第一次交换之后,BC处获得信息,C可以到达A(C-A, 要经过B本身),但是路径是2,因此B变成3,从C处走
        • 第二次交换,CB处获得消息,B可以到达A,路径为3,因此,CAB走,代价为3
        • 无限次之后,到A的距离变成INF,不可达
  • 水平分裂(split horizon)算法
    • 水平分裂的问题:在某些拓扑形式下 会失败(存在环路)
    • 解决方案:给相邻节点发通告的时候,如果下一个节点是自己关于某个目标节点的下一跳,那么发给对方的关于该目标节点的距离为不可达
    • 这种解决方式只能减缓该情况的发生,不能杜绝,在环路中显然是无法避免的
    • 例子:
    • A,B 到 D 的距离为2,C到D的距离为1
    • 如果C-D路径失败
    • C获知到D为INF,从A,B获知到D的距离为INF,因此C认为D不可达
    • A从C获知D的距离为INF,但从B处获知它到D的距离为2,因此A到B的距离 为3,从B走
    • B也有类似的问题
    • 经过无限次之后,A和B都知道到D的 距离为INF

2.7 LS 和 DV 算法 的比较

消息复杂度(DV胜出)

  • LS:有 n 节点,E 条链路,发送 报文O(nE)个
    • 局部的路由信息;全局传播
  • DV:只和邻居交换信息
    • 全局的路由信息,局部传播

收敛时间(LS胜出)

  • LS:O(n^2) 算法
    • 有可能震荡
  • DV:收敛较慢
    • 可能存在路由环路
    • count-to-infinity 问题

健壮性: 路由器故障会发生什么 (LS胜出)

LS:

  • 节点会通告不正确的链路代价(但是一个LS节点仅计算自己的转发表;其他节点也自行执行类似的计算,具有一定健壮性)
  • 每个节点只计算自己的路由表
  • 错误信息影响较小,局部,路由较健壮

DV:

  • DV 节点可能通告对全网所有节点 的不正确路径代价(第一次从错误节点传给邻居,第二次从邻居外传……)
    • 距离矢量
  • 每一个节点的路由表可能被其它节点使用
    • 错误可以扩散到全网

2种路由选择算法都有其优缺点,而且在互联网上都有应用

三、自治系统内部的路由选择:OSPF

3.1 RIP( Routing Information Protocol)

  • 1982年发布的BSD-UNIX中实现
  • Distance vector 算法
    • 距离矢量:每条链路cost=1# of hops (max = 15 hops) 跳数
    • DV 每隔 30 秒和邻居交换DV通告
    • 每个通告包括:最多25个目标子网

3.1.1 RIP 通告(advertisement)
  • DV:在邻居之间每30秒交换通告报文
    • 定期,而且在改变路由的时候发送通告报文
    • 在对方的请求下可以发送通告报文
  • 每一个通告: 至多AS(Autonomous System内部的25个目标网络的 DV
    • 目标网络+跳数
    • 一次公告最多25个子网 最大跳数为16

3.1.2 链路失效和恢复
  • 如果180秒没有收到通告信息-->邻居或者链路失效
    • 发现经过这个邻居的路由已失效
    • 新的通告报文会传递给邻居
    • 邻居因此发出新的通告 (如果路由变化的话)
    • 链路失效快速(?)地在整网中传输
    • 使用毒性逆转(poison reverse)阻止ping-pong回路 ( 不可达的距离:跳数无限 = 16 段)
3.1.3 进程处理
  • RIP 以应用进程的方式实现:route-d (daemon)
  • 通告报文通过UDP报文传送,周期性重复
  • 网络层的协议使用了传输层的服务,以应用层实体的 方式实现

3.2 OSPF(Open Shortest Path First)

  • open”: 标准可公开获得
  • 使用LS算法
    • LS 分组在网络中(一个AS内部)分发
    • 全局网络拓扑、代价在每一个节点中都保持
    • 路由计算采用Dijkstra算法
  • OSPF通告信息中携带:每一个邻居路由器一个表项
  • 通告信息会传遍AS全部(通过泛洪)
    • 在IP数据报上直接传送OSPF报文 (而不是通过UDP和TCP)
  • IS-IS路由协议:几乎和OSPF一样

OPSF “高级” 特性(RIP中没有的)

  • 安全:所有的OSPF报文都是经过认证的 (防止恶意的攻击)
  • 允许有多个代价相同的路径存在 (在RIP协议中只有一个)
  • 对于每一个链路,对于不同的TOS有多重代价矩阵
    • 例如:卫星链路代价对于尽力而为的服务代价设置比较低,对实时服务代价设置的比较高
    • 支持按照不同的代价计算最优路径,如:按照时间和延迟分别计算最优路径
  • 对单播和多播的集成支持:
    • Multicast OSPF (MOSPF) 使用相同的拓扑数据库, 就像在OSPF中一样
  • 在大型网络中支持层次性OSPF

层次化的OSPF路由

  • 2个级别的层次性:本地,骨干
    • 链路状态通告仅仅在本地区域Area范围内进行
    • 每一个节点拥有本地区域的拓扑信息
      • 关于其他区域,知道去它的方向,通过区域边界路由器(最短路径)
    • 区域边界路由器: “汇总(聚集)”到自己区域内网络的距离,向其它区域边界路由器通告.
    • 骨干路由器: 仅仅在骨干区域内,运行OSPF路由
    • 边界路由器:连接其它的AS’s.

四、ISP之间的路由选择: BGP

4.1 层次路由

  • 一个平面的路由
    • 一个网络中的所有路由器的地位一样
    • 通过LSDV,或者其他路由算法,所有路由器都要知道其他所有路由器(子网)如何走
    • 所有路由器在一个平面
  • 平面路由的问题
    • 规模巨大的网络中,路由信息的存储、传输和计算代价巨大
      • DV:距离矢量很大,且不能够收敛
      • LS:几百万个节点的LS分组的泛洪传输,存储以及最短路径算法的计算
    • 管理问题:
      • 不同的网络所有者希望按照自己的方式管理网络
      • 希望对外隐藏自己网络的细节
      • 当然,还希望和其它网络互联

  • 层次路由:将互联网分成一个个AS(路由器 区域)
    • 某个区域内的路由器集合,自治系统 “autonomous systems” (AS)
    • 一个ASAS Number(ASN)唯一标示
    • 一个ISP可能包括1个或者多个AS
  • 路由变成了:2个层次路由
    • AS内部路由:在同一个 AS 内路由器运行相同的路由协议
      • “intra-AS” routing protocol:内部网关协议
      • 不同的AS可能运行着不同的内部网关协议
      • 能够解决规模和管理问题
      • 如:RIPOSPFIGRP
      • 网关路由器:AS边缘路由器 ,可以连接到其他AS
    • AS间运行AS间路由协议
    • “inter-AS” routing protocol:外部网关协议
    • 解决AS之间的路由问题,完成AS之间的互联互通

层次路由的优点

  • 解决了规模问题
    • 内部网关协议解决:AS内部 数量有限 的路由器相互到达的问题,AS内部规模可控
      • 如AS节点太多,可分割AS,使 得AS内部的节点数量有限
    • AS之间的路由的规模问题
      • 增加一个AS,对于AS之间的路由从总体上来说,只是增加了一 个节点=子网(每个AS可以用一 个点来表示)
      • 对于其他AS来说只是增加了一 个表项,就是这个新增的AS如何走的问题
      • 扩展性强:规模增大,性能不会减得太多
  • 解决了管理问题
    • 各个AS可以运行不同的内部网关协议
    • 可以使自己网络的细节不向外透露

4.2 互联网AS间路由:BGP

  • BGP (Border Gateway Protocol)自治区域间路由协议“事实上的”标准
    • “将互联网各个AS粘在一起的胶水”
    • BGP 提供给每个AS以以下方法:
      • eBGP:从相邻的ASes那里获得子网可达信息
      • iBGP:将获得的子网可达信息传遍到AS内部的所有路由器
      • 根据子网可达信息和策略来决定到达子网的“好”路径
    • 允许子网向互联网其他网络通告“我在这里
    • 基于距离矢量算法(路径矢量)
      • 不仅仅是距离矢量,还包括到达各个目标网络的详细路径(AS序号的列表)能够避免简单DV算法的路由环路问题

eBGP,iBGP 连接

4.2.1 BGP基础
  • BGP 会话2BGP路由器(“peers”)在一个半永久的TCP连接上交换BGP报文:
    • 通告向不同目标子网前缀的“路径”(BGP是一个“路径 矢量”协议)
  • AS3网关路由器3aAS2的网关路由器2c通告路径:AS3,X
    • 3a参与AS内路由运算,知道本AS所有子网X信息
    • 语义上:AS3AS2承诺,它可以向子网X转发数据报
    • 3a2c关于X的下一跳(next hop

4.2.2 路径的属性& BGP 路由
  • 当通告一个子网前缀时,通告包括 BGP 属性
    • prefix + attributes = “route”
  • 2个重要的属性:
    • AS-PATH:前缀的通告所经过的AS列表:AS 67 AS 17
      • 检测环路:多路径选择
      • 在向其它AS转发时,需要将自己的AS号加在路径上
    • NEXT-HOP从当前AS到下一跳AS有多个链路,在NETX-HOP 属性中,告诉对方通过那个 I 转发.
    • 其它属性:路由偏好指标,如何被插入的属性
  • 基于策略的路由:
    • 当一个网关路由器接收到了一个路由通告,使用输入策略来接受或过滤(accept/decline.)
      • 过滤原因例1:不想经过某个AS,转发某些前缀的分组
      • 过滤原因例2:已经有了一条往某前缀的偏好路径
    • 策略也决定了是否向它别的邻居通告收到的这个路由信息
4.2.3 BGP 路径通告

  • 路由器AS2.2cAS3.3a接收到的AS3,X路由通告 (通过 eBGP)
  • 基于AS2的输入策略,AS2.2c决定接收AS3,X的通告,而且通过 iBGP)向AS2的所有路由器进行通告
  • 基于AS2的策略,AS2路由器2a通过eBGP向AS1.1c路由器通告 AS2,AS3,X 路由信息
    • 路径上加上了 AS2自己作为AS序列的一跳

网关路由器可能获取有关一个子网X的多条路径,从多个eBGP 会话上:

  • AS1 网关路由器1c从2a学习到路径:AS2,AS3,X
  • AS1网关路由器1c从3a处学习到路径AS3,X
  • 基于策略,AS1路由器1c选择了路径:AS3,X,而且通过iBGP 告诉所有AS1内部的路由器
4.2.4 BGP报文
  • 使用TCP协议交换BGP报文.
    • BGP 报文:
      • OPEN: 打开TCP连接,认证发送方
      • UPDATE: 通告新路径 (或者撤销原路径)
      • KEEPALIVE:在没有更新时保持连接,也用于对 OPEN 请求确认
      • NOTIFICATION: 报告以前消息的错误,也用来关闭 连接
4.2.5 BGP, OSPF, 转发表表项

4.2.6 BGP 路径选择
  • 路由器可能获得一个网络前缀的多个路径,路由 器必须进行路径的选择,路由选择可以基于:
    1. 本地偏好值属性: 偏好策略决定
    2. 最短AS-PATHAS的跳数
    3. 最近的NEXT-HOP路由器:热土豆路由
    4. 附加的判据:使用BGP标示
  • 一个前缀对应着多种路径,采用消除规则直到留下一条 路径
4.2.7 热土豆路由

  • 2d通过iBGP获知,它可以通过2a或者2c到达X
  • 热土豆策略:选择具备最小内部区域代价的网关作为往X 的出口(如:2d选择2a,即使往X可能有比较多的AS跳 数):不要操心域间的代价!
4.2.8 为什么内部网关协议和外部网关协议如此不同?
  • 策略
    • Inter-AS: 管理员需要控制通信路径,谁在使用它的网络 进行数据传输;
    • Intra-AS: 一个管理者,所以无需策略;
      • AS内部的各子网的主机尽可能地利用资源进行快速路由
  • 规模
    • AS间路由必须考虑规模问题,以便支持全网的数据转发
    • AS内部路由规模不是一个大的问题
      • 如果AS 太大,可将此AS分成小的AS;规模可控
      • AS之间只不过多了一个点而已
      • 或者AS内部路由支持层次性,层次性路由节约了表空间, 降低了更新的数据流量
  • 性能
    • Intra-AS: 关注性能
    • Inter-AS: 策略可能比性能更重要

五、SDN 控制平面

  • 互联网络网络层:历史上都是通过分布式、每个路由器的实现
    • 单个路由器包含了:交换设备硬件、私有路由器OS( 如:思科IOS)和其上运行的互联网标准协议(IP, RIP, IS-IS, OSPF, BGP)的私有实现
    • 需要不同的中间盒来实现不同网络层功能:防火墙, 负载均衡设备和NAT…
  • ~2005: 点燃重新思考互联网控制平面的兴趣

5.1 传统方式 VS SDN

传统方式:每一路由器(Per-router)控制平面

在每一个路由器中的单独路由器算法元件,在控制平面进行交互

SDN方式:逻辑上集中的控制平面

一个不同的(通常是远程的)控制器与本地控制代理(CAs) 交互

为什么需要一个逻辑上集中的控制平面?

  • 网络管理更加容易:避免路由器的错误配置,对于通信流的弹性更好
  • 基于流表的转发(回顾一下OpenFlow API),允许“可编程”的路由器
    • 集中式“编程”更加容易:集中计算流表然后分发
    • 传统方式分布式“编程”困难:在每个单独的路由器上分别运行分布式的算法,得到转发表(部署和升级代价低)
      • 而且要求各分布式计算出的转发表都得基本正确
  • 控制平面的开放实现(非私有)
    • 新的竞争生态

类比: 主框架到PC的演变

5.2 流量工程

流量工程: 传统路由比较困难

5.3 SDN特点

5.4 SDN 架构

数据平面交换机

  • 快速,简单,商业化交换设备 采用硬件实现通用转发功能
  • 流表被控制器计算和安装
  • 基于南向API(例如OpenFlow ),SDN控制器访问基于流的交换机
    • 定义了哪些可以被控制哪些不能
  • 也定义了和控制器的协议 (e.g., OpenFlow)

SDN 控制器(网络OS

  • 维护网络状态信息
  • 通过上面的北向API和网络 控制应用交互
  • 通过下面的南向API和网络 交换机交互
  • 逻辑上集中,但是在实现上通常由于性能、可扩展性、容错性以及鲁棒性采用分布式方法实现

网络控制应用

  • 控制的大脑: 采用下层提供 的服务(SDN控制器提供的 API),实现网络功能
    • 路由器 交换机
    • 接入控制 防火墙
    • 负载均衡
    • 其他功能
  • 非绑定:可以被第三方提供 ,与控制器厂商以通常上不同,与分组交换机厂商也可以不同

SDN控制器里的元件

5.5 OpenFlow

  • 控制器和SDN交换机交互的协议
  • 采用TCP 来交换报文
    • 加密可选
  • 3种OpenFlow报文类型
    • 控制器>交换机
    • 异步(交换机>控制器 )
    • 对称 (misc)

SDN: 控制/数据平面交互的例子

5.6 SDN: 面临的挑战

  • 强化控制平面:可信、可靠、性能可扩展性、 安全的分布式系统
    • 对于失效的鲁棒性: 利用为控制平面可靠分布式系统的强大理论
    • 可信任,安全:从开始就进行铸造
  • 网络、协议满足特殊任务的需求
    • e.g., 实时性,超高可靠性、超高安全性
  • 互联网络范围内的扩展性
    • 而不是仅仅在一个AS的内部部署,全网部署

六、IP组播

IP数据报的三种传输方式

  • 单播
    • 单播用于发送数据包到单个目的地,且每发送一份单播报文都使用一个单播IP地址作为目的地址。是一种点对点传输方式。
  • 广播
    • 广播是指发送数据包到同一广播域或子网内的所有设备的一种数据传输方式,是一种点对多点传输方式。
  • 组播(多播)
    • 当网络中的某些用户需要特定数据时,组播数据发送者仅发送一次数据借助组播路由协议为组播数据包建立组播分发树被传递的数据到达距离用户端尽可能近的节点后才开始复制和分发,是一种点对多点传输方式
    • 组播提高了数据传送效率。减少了主干网出现拥塞的可能性。组播组中的主机可以是在同一个物理网络,也可以来自不同的物理网络(如果有组播路由器的支持,即运行组播协议的路由器)。

IP组播地址让源设备能够将分组发送给一组设备。属于多播组的设备将被分配一个组播组IP地址(一群共同需求主机的相同标识)。

组播地址范围为224.0.0.0~239.255.255.255(D类地址),一个D类地址表示一个组播组。只能用作分组的目标地址。源地址总是为单播地址

  1. 组播数据报也是“尽力而为”,不提供可靠交付,应用于UDP
  2. 对组播数据报不产生ICMP差错报文。
  3. 并非所有D类地址都可以作为组播地址。

6.1 硬件组播

同单播地址一样,组播IP地址也需要相应的组播MAC地址在本地网络中实际传送帧。

  • IANA规定,将01:00:5E:00:00:00~01:00:5E:7F:FF:FF用于IP组播地址到以太网组播地址的映射。
    • 注意:IP—MAC映射关系不是唯一的
    • 余下24bit,因为D类有5位不用,使得剩下24bit最高位不用,然后剩下的23位来自D类IP地址
  • 收到多播数据报的主机,还要在IP层利用软件进行过滤,把不是本主机要接收的数据报丢弃。

6.2 网际组管理协议 IGMP 协议

IGMP协议让路由器知道本局域网上是否有主机(的进程)参加或退出了某个组播组

IGMP所处位置:

ROUND 1

  • 某主机要加入组播组时,该主机向组播组的组播地址发送一个IGMP报文,声明自己要称为该组的成员。本地组播路由器收到IGMP报文后,要利用组播路由选择协议把这组成员关系发给因特网上的其他组播路由器

ROUND 2

  • 本地组播路由器周期性探询本地局域网上的主机,以便知道这些主机是否还是组播组的成员。
    • 只要有一个主机对某个组响应,那么组播路由器就认为这个组是活跃的
    • 如果经过几次探询后没有一个主机响应,组播路由器就认为本网络上的没有此组播组的主机,因此就不再把这织的成员关系发给其他的组播路由器

组播路由器知道的成员关系只是所连接的局域网中有无组播组的成员。

IGMP v1报文格式:

6.3 组路由选择协议

  • 组播路由选择协议目的是找出以源主机为根节点的组播转发树。
  • 构造树可以避免在路由器之间兜圈子
  • 对不同的多播组对应于不同的多播转发树:同一个多播组,对不同的源点也会有不同的多播转发树。

组播路由选择协议常使用的三种算法:

  1. 基于链路状态的路由选择
  2. 基于距离-向量的路由选择
  3. 协议无关的组播(稀疏/密集)

组播路由选择协议尚未标准化,所以知道有这三类就行。

七、ICMP: Internet Control Message Protocol

IP协议是一种不可靠无连接的包传输。当数据包经过多个网络传输过程中,可能出现错误、目的主机不响应、包拥塞和包丢失等。为了处理这些问题,在IP层引入了一个子协议ICMP (Internet Control Message Protocol,因特网控制报文协议)

ICMP报文格式和类型

  • ICMP处在网络层,但是是 在IP协议的上面
    • ICMP消息由IP数据报承载
  • ICMP报文可以被IP协议层、传输层协议(TCP或UDP)和用户进程使用。

  • ICMP协议有两种报文:
    • 查询报文
    • 差错报文
  • 对错误的ICMP差错报文不会产生另一个ICMP差错报文

ICMP报文的主要类型(部分)

检查目的站的可达性

  • 为了诊断目的而设计:
    • 源主机IP软件要为数据报选路
    • 源—目的站之间的路由器必须正在运行,且正确为数据报选路
    • 目的主机必须正在运行,且ICMP和IP软件都在工作
    • 返回路径上的路由器必须有正确的路由
  • 最常用的调试工具是利用回送请求和回送回答报文来测试目的站的可达性

分组网间探测,Ping 程序

  • 用来测试主机或路由器间的连通性
  • 应用层直接使用网际层的ICMP(没有通过运输层的TCP或UDP)
  • 使用ICMP回送请求和回答报文

测试网络连通性的ping程序

利用了ICMP协议类型8的回显请求和类型0的回显应答完成

跟踪路由tracert程序

  • 用来测试IP数据报从源主机到达目的主机要经过哪些路由器
  • Windows版本
    • tracert命令
    • 应用层直接使用网际层ICMP
    • 使用了ICMP回送请求和回答报文以及差错报告报文
  • Unix版本
    • traceroute命令
    • 在运输层使用UDP协议
    • 仅使用ICMP差错报告报文

时间戳请求和回答

  • 两个机器(主机或路由器)可使用时间戳请求和时间戳回答报文来确定IP数据报在这两个机器之间来往所需的往返时间。
  • 它也可用作两个机器中的时钟的同步。
  • ICMP类型
    • 请求:类型=13
    • 回答:类型=14

ICMP地址掩码请求与响应

  • 向局域网上的路由器发送地址掩码请求报文,得到主机的掩码
    • 请求:类型=17
    • 回答:类型=18

ICMP差错报告报文共有以下五种:

  1. 终点不可达
    • 当路由器或主机不能交付数据报时,就向源点发送终点不可达报文。具体可再根据ICMP的代码字段细分为目的网络不可达目的主机不可达、目的协议不可达、目的端口不可达、目的网络未知、目的主机未知等13种错误。
  2. 源点抑制
    • 当路由器或主机由于拥塞而丢弃数据报时,就向源点发送源点抑制报文,使源点知道应当把数据报的发送速率放慢。
  3. 时间超过
    • 当路由器收到一个目的IP地址不是自己的IP数据报,会将其生存时间TTL字段的值减1。若结果不为0,则将该IP数据报转发出去:若结果为0,除丢该IP数据报外,还要向源点发送时间超过报文
    • 另外,当终点在预先规定的时间内不能收到一个数据报的全部数据报片时,就把已收到的数据报片都丢弃,也会向源点发送时间超过报文。
  4. 参数问题
    • 当路由器或目的主机收到IP数据报后,根据其首部中的检验和字段发现首部在传输过程中出现了误码,就丢弃该数据报,并向源点发送参数问题报文。
  5. 改变路由(重定向)
    • 路由器把改变路由报文发送给主机,让主机知道下次应将数据报发送给另外的路由器(可通过更好的路由)

以下情况不应发送ICMP差错报告报文

  • 对ICMP差错报告报文不再发送ICMP差错报告报文
  • 对第一个分片的数据报片的所有后续数据报片都不发送ICMP差错报告报文
  • 对具有多播地址的数据报都不发送ICMP差错报告报文
  • 对具有特殊地址(如127.0.0.0或0.0.0.0)的数据报不发送ICMP差错报告报文

八、小结

  • 网络层控制平面的方法
    • 每个路由器控制(传统方法)
    • 逻辑上集中的控制 (software defined networking)
  • 传统路由选择算法
    • 在互联网上的实现:RIP , OSPF, BGP
  • SDN控制器
    • 实际中的实现:ODL, ONO

相关文章:

五、网络层:控制平面,《计算机网络(自顶向下方法 第7版,James F.Kurose,Keith W.Ross)》

目录 一、导论 二、路由选择算法 2.1 路由(route)的概念 2.2 网络的图抽象 2.2.1 边和路由的代价 2.2.2 最优化原则 2.3 路由的原则 2.4 路由选择算法的分类 2.5 link state 算法 2.5.1 LS路由工作过程 2.5.2 链路状态路由选择(lin…...

Fix the “The repository no longer has a Release file” error on Ubuntu 23.04

背景信息 在Ubuntu 23.04操作系统上执行apt-get update命令更新操作系统时,得到以下错误 登录后复制 # apt-get update Ign:1 http://mirrors.aliyun.com/ubuntu lunar InRelease Ign:2 http://mirrors.aliyun.com/ubuntu lunar-updates InRelease Ign:3 http://mir…...

开源 AI 智能名片 S2B2C 商城小程序对私域流量运营的全方位助力

在当今竞争激烈的商业环境中,私域流量运营已成为企业实现可持续发展和提升竞争力的关键策略之一。开源 AI 智能名片 S2B2C 商城小程序凭借其独特的功能与特性,从多个维度为私域流量运营提供了强有力的支持与推动,以下将详细阐述其在各个方面的…...

Java Exception解决方法

Java中的Exception是所有异常的基类,它指的是程序在执行过程中发生的非严重错误,比如空指针异常、数组越界异常等。 为了解决Java中的Exception,从以下步骤进行排查解决: 阅读错误信息:查看异常的完整堆栈跟踪信息&a…...

HCIA-Access V2.5_2_2_2网络通信基础_IP编址与路由

网络层数据封装 首先IP地址封装在网络层,它用于标识一台网络设备,其中IP地址分为两个部分,网络地址和主机地址,通过我们采用点分十进制的形式进行表示。 IP地址分类 对IP地址而言,它细分为五类,A,B,C,D,E,…...

JeecgBoot passwordChange 任意用户密码重置漏洞复现

0x01 产品简介 Jeecg Boot是一个企业级低代码开发平台,基于前后端分离的架构,融合了SpringBoot、SpringCloud、Ant Design、Vue、Mybatis-plus、Shiro、JWT等多种主流技术,旨在帮助企业快速构建各种应用系统,提高开发效率,降低开发成本。采用最新主流的前后分离框架,使得…...

7-8 整型关键字的散列映射

给定一系列整型关键字和素数 p,用除留余数法定义的散列函数 H(key)key%p 将关键字映射到长度为 p 的散列表中。用线性探测法解决冲突。 输入格式: 输入第一行首先给出两个正整数 n(≤1000)和 p(≥n 的最小素数)&…...

谷粒商城—分布式高级①.md

1. ELASTICSEARCH 1、安装elastic search dokcer中安装elastic search (1)下载ealastic search和kibana docker pull elasticsearch:7.6.2 docker pull kibana:7.6.2(2)配置 mkdir -p /mydata/elasticsearch/config mkdir -p /mydata/elasticsearch/data echo "h…...

MySQL SQL语句性能优化

MySQL SQL语句性能优化指南 一、查询设计优化1. 避免 SELECT *2. 使用 WHERE 进行条件过滤3. 避免在索引列上使用函数和表达式4. 使用 LIMIT 限制返回行数5. 避免使用子查询6. 优化 JOIN 操作7. 避免全表扫描 二、索引优化1. 使用合适的索引2. 覆盖索引3. 索引选择性4. 多列索引…...

【潜意识Java】期末考试可能考的选择题(附带答案解析)

目录 选择题一:Java 数据类型 选择题二:Java 控制结构 选择题三:面向对象编程 选择题四:Java 集合框架 选择题五:Java 异常处理 选择题六:Java 方法 选择题七:Java 流程控制 选择题八&a…...

修炼之道 --- 其一

序言 大家对面试中的面经八股文是怎样的看法呢,从他的名字 八股文 就可以看出来大家可能并不喜欢他,八股文一般是 死板、浮于表面、不重实际 的特点。但是,我们需要通过辩证的角度来看待一个事情,不能单方面来定性!  …...

【前端】HTML

目录 一、HTML结构 1.1 HTML标签1.2 HTML文件基本结构1.3 快速生成框架 二、HTML常见标签 2.1 注释标签 !-- –2.2 标题标签 h1到h62.3 段落标签 p2.4 换行标签 br2.5 格式化标签2.6 图片标签 img2.7 超链接标签 a 三、表格标签 3.1 常用标签3.2 合并单元格 四、列表标签五、表…...

LabVIEW实现GPS通信

目录 1、GPS通信原理 2、硬件环境部署 3、程序架构 4、前面板设计 5、程序框图设计 6、测试验证 本专栏以LabVIEW为开发平台,讲解物联网通信组网原理与开发方法,覆盖RS232、TCP、MQTT、蓝牙、Wi-Fi、NB-IoT等协议。 结合实际案例,展示如何利用LabVIEW和常用模块实现物联网系…...

【Python 小课堂】第 2 课 Python 基础知识:语句、常量、变量和注释

第 2 课 基础知识:语句、常量/变量和注释 By Yichen Li 2024/12/14 一、内容简介 在本次课中,介绍Python语句、常量/变量以及代码注释的基本概念,一些详细的概念、扩展及用法等细节,留至后续介绍。 二、Python语句 一般来说&…...

基于STM32设计的工地扬尘与噪音实时监测系统(网页)

一、前言 当前项目使用的相关软件工具、传感器源代码工程已经上传到网盘(实时更新项目内容):https://ccnr8sukk85n.feishu.cn/wiki/QjY8weDYHibqRYkFP2qcA9aGnvb?fromfrom_copylink 1.1 项目开发背景 近年来,随着城市化进程的…...

LLM之RAG实战(五十)| FastAPI:构建基于LLM的WEB接口界面

FastAPI是WEB UI接口,随着LLM的蓬勃发展,FastAPI的生态也迎来了新的机遇。本文将围绕FastAPI、OpenAI的API以及FastCRUD,来创建一个个性化的电子邮件写作助手,以展示如何结合这些技术来构建强大的应用程序。 下面我们开始分步骤操…...

JavaScript 中的 Map方法

JavaScript 中的 Map方法 在 JavaScript 中,Map 是一种用于存储键值对的数据结构,相较于传统的对象(Object),Map 提供了更高效的键值对操作方式适合处理需要频繁操作键值对的场景。 1. 创建 Map const map new Map…...

img引入svg如何修改颜色

方法1:通过css中filter:drop-shadow 首先需要一个容纳图标的父盒子(下方实例中的.svg-img),通过css造一个图标的‘影子’(.svg-color中的drop-shadow),然后设置‘影子’的颜色,再把图标本体移出父盒子&…...

自然语言处理基础及应用场景

自然语言处理定义 让计算机理解人所说的文本 语音 Imitation Game 图灵测试 行为主义 鸭子理论 自然语言处理的基本任务 词性标注:区分每个词名词、动词、形容词等词性命名实体的识别:名词的具体指代是哪一类事物共指消解:代词指代的是前面…...

构建centos docker基础镜像

1、介绍 比较老的版本docker镜像,不太好找,可以尝试自己构建 各版本构建基础镜像方法不太一样,方式也不同,自己尝试,本文只介绍了我自己的尝试 2、构建centos5.11 docker镜像 准备iso文件 (1)安…...

etcd命令大全

默认安装自带etcdctl 命令行客户端,分两个版本ETCDCTL_API2和ETCDCTL_API3,两个版本不一样,操作的数据也不相容。 本文以v3 为例。 使用之前需要先设置:export ETCDCTL_API3。 1 etcd查询集群节点列表及状态 标准输出&#xff1…...

Go有限状态机实现和实战

Go有限状态机实现和实战 有限状态机 什么是状态机 有限状态机(Finite State Machine, FSM)是一种用于建模系统行为的计算模型,它包含有限数量的状态,并通过事件或条件实现状态之间的转换。FSM的状态数量是有限的,因此称…...

使用torch模拟 BMM int8量化计算。

使用torch模型BMM int8计算。 模拟:BMM->softmax->BMM 计算流程 import torch import numpy as np torch.manual_seed(777) def int8_quantize_per_token(x: torch.Tensor, axis: int -1, attnsFalse):if x.dtype ! torch.float32:x x.type(torch.float32)…...

vue3的watch一次性监听多个值用法

vue3的watch一次性监听多个值 1、监听单个值 watch(() > route.params.keyword, (newValue, oldValue) > {console.log(监听值变化, newVal, oldVal)state.a newValue});2、监听多个值 watch(() > [route.params.id, route.params.keyword], (newValue, oldValue) &g…...

【one-api和ollama结合使用】

将Ollama接入one-api one-api是一个开源AI中间件服务,可以聚合各家大模型API,比如OpenAI、ChatGLM、文心一言等,聚合后提供统一的OpenAI调用方法。举个例子:ChatGLM和文心一言的API调用方法并不相同,one-api可以对其进…...

Oracle PDB的开启和关闭

[生产环境关闭与开启Oracle PDB] 【运维场景】 在运维Oracle PDB的时候经常要开启和关闭PDB,对关闭和开启PDB的操作要非常熟悉。 【操作方法】 1. PDB的打开与关闭 关闭和开启DB的时候要看DB的警告日志,日志位置(在Oracle用户下查看&…...

十一、动态构建UI元素

装饰器Builder 装饰器BuilderParam <font style"color:rgba(0, 0, 0, 0.9);">BuilderParam</font> 该装饰器用于声明任意UI描述的一个元素&#xff0c;类似slot占位符。 链接 简而言之&#xff1a;就是自定义组件允许外部传递 UI // SonCom 的实现略…...

智能时代的基石:神经网络

智能时代的基石&#xff1a;神经网络 第一节&#xff1a;神经网络简介 课程目标 本节课程旨在全面介绍神经网络的基本概念、结构以及其在历史发展中的重要里程碑。通过深入理解神经网络的工作原理和演变过程&#xff0c;学员将能够掌握神经网络在现实世界中的多种应用&#…...

VScode配置GIT

在Visual Studio Code&#xff08;VSCode&#xff09;中检测不到已安装的Git可以通过以下步骤来解决‌&#xff1a; ‌确认Git是否正确安装‌&#xff1a;首先&#xff0c;确保在计算机上正确安装了Git。可以通过打开命令行窗口并输入git --version来检查是否能够显示Git的版本…...

【CSS】css 如何实现固定宽高比

今天和同事讨论这个问题&#xff0c;一时间还想不到了&#xff0c;于是学习了下&#xff0c;就顺便当个记录吧 要在CSS中实现固定宽高比&#xff0c;有两种主要的方法可以选择。一种是使用新的aspect-ratio属性&#xff0c;另一种是利用padding技巧。随着现代浏览器对aspect-ra…...

使用webrtc-streamer查看实时监控

摄像头配置&#xff08;海康摄像头为例&#xff09; 摄像头视频编码应改成H264格式 webrtc-streamer下载 webrtc-streamer下载地址 下载后解压出来双击运行&#xff0c;端口默认8000 VUE2项目引入文件 在项目静态文件“public”中需引入两个js文件“webrtcstreamer.js”与“…...

ansible部署nginx:1个简单的playbook脚本

文章目录 hosts--ventoryroles执行命令 使用ansible向3台centos7服务器上安装nginx hosts–ventory [rootstand playhook1]# cat /root/HOSTS # /root/HOSTS [webservers] 192.168.196.111 ansible_ssh_passpassword 192.168.196.112 ansible_ssh_passpassword 192.168.196.1…...

Ubuntu安装Gitlab详细图文教程

1、环境准备 1.1、Ubuntu环境 Ubuntu24.04Sever版安装教程 1.2、更新系统 sudo apt update -y sudo apt-get update sudo apt-get upgrade 2、安装Nginx 2.1 安装nginx # 安装 apt install nginx -y 2.2 修改nginx配置⽂件 # 修改nginx配置 vim /etc/nginx/si…...

前端面试准备问题2

1.防抖和节流分别是什么&#xff0c;应用场景 防抖&#xff1a;在事件被触发后&#xff0c;只有在指定的延迟时间内没有再次触发&#xff0c;才执行事件处理函数。 在我的理解中&#xff0c;简单的说就是在一个指定的时间内&#xff0c;仅触发一次&#xff0c;如果有多次重复触…...

uni-app之web-view组件 postMessage 通信【跨端开发系列】

&#x1f517; uniapp 跨端开发系列文章&#xff1a;&#x1f380;&#x1f380;&#x1f380; uni-app 组成和跨端原理 【跨端开发系列】 uni-app 各端差异注意事项 【跨端开发系列】uni-app 离线本地存储方案 【跨端开发系列】uni-app UI库、框架、组件选型指南 【跨端开…...

IntelliJ IDEA 使用技巧与插件推荐

目录 常用使用技巧 1. 使用快捷键提升开发效率 2. 多光标编辑 3. 代码自动补全 4. 使用 Find Action 快速执行操作 5. 集成版本控制系统&#xff08;VCS&#xff09; 6. 快速查看代码文档 推荐插件 1. Lombok Plugin 2. Rainbow Brackets 3. Key Promoter X 4. Chec…...

zookeeper基础命令详解

zookeeper基础命令详解目录 文章目录 zookeeper基础命令详解目录一、列出所有基础命令 一、列出所有基础命令 先启动一个zookeeper客户端连接zookeeper&#xff0c;如果还没有启动zookeeper集群的参考本文启动之后再做后续操作。 https://blog.csdn.net/weixin_42924400/artic…...

2025周易算命网站搭建详细方法+源码选择php环境的配置

以下是一个详细的搭建教程&#xff0c;包括网站分类、环境配置、程序设计和功能实现。 1. 环境准备 1.1 服务器选择 操作系统: Linux&#xff08;推荐使用Ubuntu或CentOS&#xff09;Web服务器: Nginx数据库: MySQLPHP版本: 7.4.x&#xff08;确保小于8.0&#xff09; 1.2 安…...

16:00面试,16:06就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到5月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…...

《杨辉三角》

题目描述 给出 n(1≤n≤20)n(1≤n≤20)&#xff0c;输出杨辉三角的前 nn 行。 如果你不知道什么是杨辉三角&#xff0c;可以观察样例找找规律。 输入格式 无 输出格式 无 输入输出样例 输入 #1复制 6 输出 #1复制 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 C语言…...

2024年03月中国电子学会青少年软件编程(Python)等级考试试卷(五级)答案 + 解析

青少年软件编程(Python)等级考试试卷(五级) 分数:100 题数:38 一、单选题(共25题,共50分) 1. 以下代码的输出结果是?( ) nums = list(range(100, 201)) print...

【游戏设计原理】7 - 加德纳的多元智能理论

虽然多元智能理论是对认知方式的分类&#xff0c;但它也可以为游戏设计提供丰富的思路和策略&#xff0c;帮助设计师创建更具吸引力、包容性和多样性的游戏。通过理解不同玩家的认知方式和优势&#xff0c;我们可以更精准地设计游戏的元素和玩法&#xff0c;使其能够吸引广泛的…...

Jackson @JsonProperty 注解

1. 概述 Jackson 是一个流行的Java库&#xff0c;用于将Java对象转换为JSON格式以及从JSON反序列化回Java对象。一种常见的需求是在序列化为JSON或从JSON反序列化时自定义字段的命名。Jackson 的 JsonProperty 注解正好满足了这一需求。 JsonProperty 注解概览 JsonProperty…...

【数据结构——栈与队列】链栈的基本运算(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 相关知识 测试说明 我的通关代码: 测试结果&#xff1a; 任务描述 本关任务&#xff1a;编写一个程序实现链栈的基本运算。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a; 初始化栈、销毁栈、判断栈是否为空、进栈、出栈、取栈…...

数据库乐观锁和悲观锁、redis分布式锁使用场景

前言 最近发现我们同事&#xff0c;但凡需要加锁的地方都用的是分布式锁。而且我们的后台系统&#xff0c;并没有什么并发量&#xff0c;而且还是单体应用。我真的有点怀疑我的同事不太清楚数据乐观锁、悲观锁和redis分布式的使用场景。 请今天就说一下各种锁的应用场景吧。 …...

React的状态管理库-Redux

核心思想&#xff1a;单一数据源、状态是只读的、以及使用纯函数更新状态。 组成部分 Store&#xff08;存储&#xff09; 应用的唯一状态容器&#xff0c;存储整个应用的状态树,使用 createStore() 创建。 getState()&#xff1a;获取当前状态。dispatch(action)&#xff…...

《自制编译器》--青木峰郎 -读书笔记 编译hello

在该书刚开始编译hello.cb时就遇到了问题。 本人用的是wsl&#xff0c;环境如下&#xff0c; 由于是64位&#xff0c;因此根据书中的提示&#xff0c;从git上下载了64位的cb编译器 cbc-64bit 问题一: 通过如下命令编译时,总是报错。 cbc -Wa,"--32" -Wl,"-…...

XSS(跨站攻击)

XSS漏洞&#xff08;跨站脚本&#xff09; 1.XSS 漏洞简介 ​ XSS又叫CSS&#xff08;Cross Site Script&#xff09;跨站脚本攻击是指恶意攻击者往Web页面里插入恶意Script代码&#xff0c;当用户浏览该页之时&#xff0c;嵌入其中Web里面的Script代码会被执行&#xff0c;从…...

华为自反ACL实验

一、实验背景 做这个实验的原因是最近公司里上了三台小程序服务器&#xff0c;由于三台服务器的端口都映射出去了&#xff0c;领导要求A网段的三台服务器不能访问内网B&#xff0c;C网段&#xff0c;同时B、C网段内网用户可以访问A段的94、95、96服务器&#xff1b; 也就是PC4\…...

MyBatisPlus实现多表查询

在MyBatisPlus中实现多表查询&#xff0c;主要有以下几种方法&#xff1a; 使用注解进行多表查询&#xff1a; 你可以在Mapper接口中使用Select注解来编写SQL查询语句&#xff0c;实现多表查询。例如&#xff0c;如果你想根据用户ID查询用户信息和对应的区域名称&#xff0c;可…...