Blog

路由协议中的管理距离(Administrative Distance,AD)

Content #

路由协议中的管理距离(Administrative Distance,简称AD)是一种对路由选择信息的可信度进行排序的方法。每一种路由协议按可靠性从高到低,依次分配一个信任等级,这个信任等级就是管理距离。正常情况下,管理距离越小,它的优先级就越高,即可信度越高。

对于两种不同的路由协议到一个目的地的路由信息,路由器首先根据管理距离决定相信哪一个协议。例如,直连的AD=0,static静态的AD=1,EIGRP的AD=90, IGRP的AD=100,OSPF的AD=110,RIP的AD=120。这意味着,当路由器面对多种路由协议的信息时,会优先考虑管理距离小的协议。

此外,管理距离的值是一个从0到255的整数值,0是最可信赖的,而255则意味着不会有业务量通过这个路由。值得注意的是,尽管管理距离可以配置为1~9,但它们被保留内部使用,并不推荐使用。

From #

区分服务(DiffServ)模型

Content #

Diffserv 体系模型的核心思想是:

在网络边界将数据流按 QoS 要求进行简单分类,不同的类别在内部节点的每次转发中实现不同的转发特性。

Diffserv 体系使得 ISP 能够提供给每个用户不同等级和质量的服务。用户(或网络边界节点)通过设置每个数据包的 DS 字段(IPV4 首标中的服务类型(ToS)字段或 IPV6 首标中的通信类(TrafficClass)字段)的值要求特定的服务等级。其中,被设置的 DS 字段被称为区分服务码点(DSCP)。这样就维持了现有的 IP 分组格式不变。

From #

局域网设计的三层模型

Content #

三层模型将大型局域网划分为核心层、汇聚层和接入层,每一层都有特定的作用。

  1. 核心层

因特网络的高速骨干网,由于其重要性,因此在设计中应该采用冗余组件设计。在设计核心层设备的功能时,应尽量避免使用数据包过滤和策略路由等降低数据包转发速率的功能。如果需要连接因特网和外部网络,核心层还应包括一条或多条连接到外部网络的连接。

  1. 汇聚层

核心层和接入层之间的分界点,应尽量将资源访问控制、流量的控制等在汇聚层实现。为保证层次化的特性,汇聚层应该向核心层隐藏接入层的细节,例如不管接入层划分了多少个子网,汇聚层向核心层路由器进行路由宣告时,仅宣告由多个子网地址汇聚而成的网络。为保证核心层能够连接运行不同协议的区域网络,各种协议的转换都应在汇聚层完成。

  1. 接入层

为用户提供在本地网段访问应用系统的能力,也要为相邻用户之间的互访需求提供足够的带宽。接入层还应该负责一些用户管理功能,以及户信息的收集工作。

From #

层次化网络设计的原则

Content #

  1. 在设计时,设计者应该尽量控制层次化的程度,一般情况下,由核心层、汇聚层、接入层三个层次就足够了,过多的层次会导致整体网络性能的下降,并且会提高网络的延迟,但是方便网络故障排查和文档编写。

  2. 在接入层应当保持对网络结构的严格控制,接入层的用户总是为了获得更大的外部网络访问带宽,而随意申请其他的渠道访问外部网络是不允许的。

  3. 为了保证网络的层次性,不能在设计中随意加入额外连接,额外连接是指打破层次性,在不相邻层次间的连接,这些连接会导致网络中的各种问题,例如缺乏汇聚层的访问控制和数据报过滤等。

  4. 在进行设计时,应当首先设计接入层,根据流量负载、流量和行为的分析,对上层进行更精细的容量规划,再依次完成各上层的设计。

  5. 除去接入层的其他层次,应尽量采用模块化方式,每个层次由多个模块或者设备集合构成,每个模块间的边界应非常清晰。

From #

前向纠错与后向纠错

Content #

前向纠错是一种在数据发送之前预先加入冗余码的技术。发送方按照特定的算法生成冗余码,并将其插入到要传输的数据流中。接收方在接收到数据流后,使用相同的算法进行解码,并根据接收到的码流确定误码的位置并进行纠错。这种方式的主要特点是发送方无需等待接收方的反馈,可以直接发送带有纠错码的数据,因此通信信道的利用率较高。然而,由于需要添加冗余码,前向纠错可能会带来一定的带宽代价。

后向纠错(通常通过ARQ实现),则是一种按需重传的机制。在这种方式中,接收方如果发现数据传输中有错误,会向发送方发送反馈,请求重新传输出错的数据单元。发送方在接收到反馈后,会重传出错的数据。这种方式的主要缺点是通信信道的利用率不高,因为需要等待接收方的反馈和重传数据,这会影响传输效率。此外,发送方通常需要设置一个缓冲区来存储数据,这也增加了实现的复杂性。

From #

求CRC校验码

Content #

使用多项式(模2除法)运算后的余数为校验字段,若信息位为n,则将其左移k 位,被长度位k+1的生成多项式相除,所得的K位余数即成为K个信息位,构成n+k 位编码。

例题:假设原始信息串为10110,CRC 的生成多项式为\(G(x)=x^4+x+1\),求CRC校验码。

  1. 在原始信息位后面添0,假设生成多项式的阶为r,则在原始信息位后添加r个 0,本题中,G(x)阶为4,则在原始信息串后加4个0,得到的新串为101100000,作为被除数。
  2. 由多项式得到除数,多项式中x的幂指数存在的位置1,不存在的位置0。本题中,x的幂指数为0,1,4的变量都存在,而幂指数为2,3的不存在,因此得到串 10011。
  3. 生成CRC校验码,将前两步得出的被除数和除数进行模2除法运算(即不进位也不借位的除法运算)。
  4. 生成最终发送信息串,将余数添加到原始信息后。上例中,原始信息为10110,添加余数1111后,结果为10110 1111。发送方将此数据发送给接收方。
  5. 接收方进行校验。接收方的CRC 校验过程与生成过程类似,接收方接收了带校验和的帧后,用多项式G(x)来除。余数为0,则表示信息无错;否则要求发送方进行重传。

注意:收发信息双方需使用相同的生成多项式。

From #

信号量实现前驱关系

信号量实现前驱关系的做题法门 #

  1. 有几个有向边就设置几个信号量
  2. 这几个信号量的初始值为0
  3. 按顺序将几个信号量放在有向边上。(注意有向边的排放是重点)
  4. 进程在进行前要进行P操作,当前进程、执行后进行V操作,P前面的信号量,V后面的信号量

题目 #

进程P1、P2、P3、P4和P5的前趋图如下图所示: 若用PV操作控制进程P1、P2、P3、P4和P5并发执行的过程,则需要设置5个信号 S1、S2、S3、S4和S5,且信号量S1~S5的初值都等于零。

Answer #

a: V(S1) V(S2) b: V(S3) c: P(S2) d: V(S4) e: V(S5) f: P(S4) P(S5)

工作流水线同步问题(信号量解决)

Content #

某企业生产流水线M共有两位生产者,生产者甲不断地将其工序上加工的半成品放入半成品箱,生产者乙从半成品箱取出继续加工。假设半成品箱可存放n件半成品,采用PV操作实现生产者甲和生产者乙的同步可以设置三个信号量S、S1和S2,其同步模型如下图所示。

信号量S是一个互斥信号量,初值为1。 S1的值应该为n,表示生产者甲最多只能生产n个半成品放入半成品箱,就需要生产者乙来协调工作。而S2的值为0,表示开始时半成品箱中没有半成品。

From #

信号量的PV操作

Content #

P操作 #

申请资源,减量操作

  1. 将信号量S的值减1,即S=S-1;
  2. 如果S>=0,则该进程继续执行;否则该进程置为等待状态。

V操作 #

释放资源,增量操作

  1. 将信号量S的值加1,即S=S+1;
  2. 如果S>0该进程继续执行;否则说明有等待队列中有等待进程,需要唤醒等待进程。

PV操作必须成对出现,但是没有严格的先后顺序。

From #

信号量的实现

groupby之后使用reset_index

Content #

activity.groupby('player_id').min().reset_index()

按照player_id进行分组,并找到每个player_id组中的event_date的最小值。这将返回一个只包含player_id和聚合后的event_date(最小日期)的DataFrame,其索引是基于player_id的。

如果要一个更“常规”的DataFrame,其中player_id是一个普通的列,而不是索引,就需要使用reset_index()方法。这将重置索引,把原来的索引列(在这里是player_id)转换为一个新的普通列,并给DataFrame一个新的整数索引。

From #