网络路由相关的知识

article/2025/10/7 4:13:44

配置静态路由

手工配置的路由信息,包括网络地址 子网掩码和下一跳地址。在没有配置静态路由的情况下,这两个子网中的计算机a、b之间是不能通信的。从计算机a发往计算机b的ip包,在到达router后,router不知道如何到达计算机b所在的网段。

浮动静态路由

路由优先级范围0-255,数值越小越优先,静态路由默认的优先级为60。

通过配置去往相同的目的网段,但是优先级不同的静态路由,为了保证在网络中优先级较高的路由,即主路由失效的情况下,提供备份路由。正常情况下,备份路由时不会出现在路由表中的。

例如:在R1上配置静态路由,目的网段是主机b所在的网段,掩码为24位,下一跳是R2,同时将优先级设置为100(默认为60)。

ip route-static 192.168.10.0 24 10.0.10.2 preference 100

dis ip routing-table 查看路由表

备份路由表不会显示在路由表中,需要使用display ip routing-table protocol static查看静态路由路由信息。

负载

根据逐包

根据目的地址

逐流负载

路由递归查询(静态路由)

路由器逐跳将数据包发送到目的地,静态路由可以指定到目的地的每一跳,但是如果路径上某个节点出现问题,整条静态路由就不能工作了,合理的递归路由规划可以大大简化静态路由的维护工作量。

动态路由

最重要的作用是检测和补偿拓扑的更改,如果网络的最佳路径变得不可到达,协议必须寻找下一个最佳路径

路径选择

度量 最少Hop 带宽 负载 延迟 可靠性 汇聚 负载均衡

距离矢量路由协议

RIP是一种距离矢量算法协议,通过udp报文进行路由信息的交换。是简单的内部网关协议IGP,主要应用于规模较小的网络。可以深入了解一下Routing Information Protocol路由信息协议RIP。

大多数路由协议都属于两个类中的一个,距离矢量或链路状态。

典型的距离矢量路由协议使用一种路由算法,其中路由器定期向所有的邻居发送路由更新,通过广播他们的整个路由表。

距离矢量算法

Bellman-Ford or Ford-Fulkerson算法

定期更新

如果更新发送得太频繁,可能会出现拥塞,如果更新发送得太频繁,那么聚合时间可能会高得无法接受。

距离矢量路由协议将其更新发送到邻居路由器们,依赖他们将更新信息传递给他们的邻居路由器。

广播更新

当路由第一次在网络中变成有效的,最简单的办法是将更新信息发送到广播地址(IP为255.255.255.255),相邻的路由器说同样的路由协议将会听到广播并采取适当的行动,主机和其他对路由更新不关心的设备将会直接删除数据包。

发完整的路由表更新

大多数距离矢量路由协定采用了非常简单的方法通过广播他们的整个路由表来告诉他们的邻居他们知道的一切,接收到这些更新的邻居会收集他们需要的信息,然后丢弃所有的信息。

路由无效计时器

路由更新到路由表时,为其设置一个定时器,当这个路down掉将不会听到其更新信息,导致超时,标记该路径不可到达,并将在下一次更新中传递信息。如不这么做,那么一个黑洞在网络中打开了。

典型的路由器超时更新周期从3到6个不等,在一次更新被错过之后,路由器不希望使路由失效,因为这个事件可能是一个损坏或丢失的包或某种网络延迟的结果,如果周期太长,再汇聚将会非常缓慢。

水平分割

水平分割原理是RIP从某个接口学到的路由,不会从该接口再发回给邻居路由器。这样不但减少了带宽消耗,还可以防止路由环路。

水平分割两种:简单的水平分割,毒性逆转水平分割。

简单水平分割

当想指定接口发送更新,不要包含从这个接口到学习的更新。

例如:路由器C发送一个更新到路由器D,网络10.1.1.0,10.1.2.0和10.1.3.0。不包括网络10.1.4.0和10.1.5.0,因为它们是从路由器D中学到的。

对路由器B的更新包括10.1.4.0和10.1.5.0,没有提到10.1.1.0、10.1.2.0和10.1.3.0。

毒性逆转水平分割

在向指定接口发送更新信息时,指定从该接口上接收到的更新的任何网络都是不可访问的。

例如:路由器C实际上会向路由器D通知10.1.4.0和10.1.5.0,但是网络会被标记为不可到达的,可通过将度量值设置为无穷大,路径被标记为不可到达的,意味网络是无限远的。

毒性逆转比简单水平分割更安全、坚固,”坏消息总比没消息好“,假设B接收一个损坏的信息,导致相信,可以通过路由器C可以访问子网10.1.1.0。

简单水平分割什么也不会去做去更正这个错误,然而来自C的毒性逆转更新,会立刻停止这个可能出现的Loop,所以,大多数现代距离矢量实现使用毒性逆转水平分割,代价是路由更新包更大,这可能会加剧连接上的任何拥塞问题。

反向路由

路由器A广播它从路由器B中学到的网络,再给B,浪费资源B已经知道这些网络了。A从B收到再给B水平分割是一种防止两种路由器之间反向路由的技术。

--10.1.1.0-->A<--10.1.2.0-->B<--10.1.3.0-->C<--10.1.4.0-->D<--->10.1.5.0

比如:路由D的10.1.5.0网络down了,D会察觉这个故障,标记10.1.5.0网络不可访问,在下一个更新间隔传递这个信息给C,但是在D更新计时器触发更新之前,意想不到的事情发生了,C的更新信息来了,声称可以到达10.5.1.0网络,一个hop(跳)距离。

D不知道C在通告非法的下一个最佳路径,它会增加hop数,进入它的路由表,表明10.1.5.0可以通过路由器C的接口10.1.4.1到达,2个hop(跳)距离。

现在,带有10.1.5.3的目标地址的包到达路由器C,C查询其路由表并将包转发到D,D查阅它的路由表并将数据包转发到C,C将其转发到D,......一个路由循环发生了。

hop无穷大(maximum hop coun)

定义最大跳数(最大为15跳),当跳数为16跳时,目标为不可达。

ospf hello报文

hello协议将定义一个Hello包格式,用于交换数据包和处理数据包包含的信息的过程。

Hello包将包含一个路由器ID,要发送的数据包网络的地址。

在指定的最大期限内,路由器将等待听到一个Hello,然后再声明这个邻居dead。

两个路由器互相发现对方是邻居,他们通过一个进程同步他们的数据库中,他们交换和验证数据库信息,直到他们的数据库是相同的,关于数据库同步细节部分见OSPF。

执行数据库同步,邻居必须是临近的,他们必须在特定的特定协议的参数上达成一致,比如计时器、、支持可选功能。

用hello包建立邻接,链接状态协议可以以一种受控的方式交换信息,

hello和距离矢量比,距离矢量简单地广播更新为该路由协议配置的任何接口。

hello除了建立邻接,Hello包充当保持对邻接的监视,如果在某个确定的时间内,没有从相邻的邻居那里听到hellos,邻居被认为是不可到达的,and相邻的则被破坏了。

hello包交换的一个典型间隔是10秒,典型的死亡周期是四倍。

链路状态flooding

在建立了邻接之后,路由器就可以开始发送LSAs了。通告被发送给每个邻居,每个接收到的LSA都被复制并转发给每个邻居,除了发送LSA的那个。

这个过程是链接状态比距离矢量的优点之一,LSAs几乎立即被转发,而距离矢量必须运行它的算法并在路由更新之前更新它的路由表,当拓扑改变时,链路状态协议比距离向量协议汇聚速度快得多。

flooding过程是链接状态协议中最复杂的部分,有几种方法可以使flood更有效,更可靠,例如使用单播和多播地址、校验和和正确认,

这些主题在特定于协议的章节中进行了检查,但是两个过程对于flooding的过程至关重要:排序和老化。

序列号

正如目前所描述的,flooding的难度很大,当所有路由器接收到所有的LSAs时,flooding必须停止,包中的生存时间值可以简单地依赖于过期,但是让LSAs在网络间游荡直到它们过期,这几乎是不可能的。

在路由器A上的子网172.22.4.0已经失败,A已经将LSA淹没到它的邻居B和D中,并为链接的新状态做广告。B和D忠实地涌向他们的邻居,诸如此类。

接下来看看路由器C发生了什么,LSA在t1时刻从路由器B到达,被输入到C的拓扑数据库中。然后转发给F,在后来的t3期,相同的LSA的copy从a-d-e-f-c路由,路由器C看到它的数据库中已经有了LSA,C应该把这个LSA转发给路由器B吗?答案是否定的因为B已经收到了广告路由器C知道这一点,因为它从路由器F接收到的LSA的序列号与它从路由器b接收到的LSA的序列号相同。当路由器发送出LSA时,它在每个副本中包含一个相同的序列号。

这个序列号被记录在路由器的拓扑数据库中,以及LSA的其他部分当一个路由器接收到一个已经在数据库中的LSA,它的序列号是相同的,接收到的信息就会被丢弃。

如果信息是一样的但是序列的数量更大,接收到的信息和新的序列号被输入到数据库中,LSA被洪水淹没,这样,当所有路由器都看到了最新的LSA副本时,洪水就会减少。

似乎路由器仅仅可以验证它们的链路状态数据库包含与新接收到的LSA相同的LSA,并根据该信息做出一个不确定的/丢弃的决策

路由器A可能发出一个LSA的广告,这个网络是down的,它的序列号是166,然后它发送一个新的LSA,它宣布了相同的网络是up的,它的序列号是167,路由器C接收down的LSA,然后从a-b-C路径接收up的LSA,但是它从a-d-f-c通道接收到一个延迟的down的LSA,如果没有序列号,C就不知道是否相信延时的down的LSA,有了序列号,C的数据库就会表明,来自路由器A的信息有一个编号为167的序列编号,LSA的序列编号为166,因此被认为是旧信息并被丢弃。

因为序列号是在LSAs中的一个集合字段中进行的,所以数字必须有一定的上界。当达到这个最大的序列号时,会发生什么?

线性序列号空间

一种方法是使用一个线性序列空间,如此之大,以至于不太可能达到上限,一个32位的字段被使用,有2的3次方2=4,294,967,296个可用的序列编号从0开始,即使路由器每10秒创建一个新的链路状态包,也要花费大约1361年的时间来耗尽序列的数量,很少有路由器会持续这么长时间。

如果一个链路状态路由进程在某种程度上耗尽了序列数,它必须自己关闭,以及保持足够长的时间,让它的LSAs在所有数据库中退出,然后以最低的顺序开始,在路由器重启过程中出现一个更常见的困难,如果路由器A重新启动,它可能就无法记住它上次使用的序列号并且必须重新开始。如果它的邻居仍然有路由器A之前的序列号在他们的数据库中,较低的序列数将被解释为较老的序列数,并且将被忽略同样,路由过程必须保持下去,直到所有旧的LSA都从网络中退出。考虑到最大寿命可能是一个小时或更长,这个解决方案不太有吸引力。

更好的解决方案是为目前所描述的flooding行为添加一个新规则,如果一个重新启动的路由器向邻居发送一个带有一个序列号的LSA,这个数字看起来比邻居的存储序列号要老。邻居会把自己储存的LSA和序列号发送回路由器,这样,路由器就会知道它在重启之前所使用的序列号,并相应地进行调整。但是必须注意,最后使用的序列号并不是最接近于最大值的,否则,重启路由器将不得不重新启动。必须设置一个规则,限制路由器可能以序列数进行的“跳转”—例如规则可能会说,序列号不能使单个的增加超过整个序列空间的1/1。(实际的公式比这个例子要复杂得多,考虑到年龄限制。)

循环序列号空间

另一种方法是使用循环序列号空间,数字“包装”——也就是说,在32位空间中,数字4,294,967,295后面是0,故障可能导致有趣的两难境地,一个重新启动路由器可能会遇到与线性序列数字所讨论的相同的可信度问题。

循环序列编号产生了一种奇怪的逻辑。如果x是1和4,294,967,295之间的任意数,那么0小于x小于0。这种情况可以在行为良好的网络中进行管理,通过断言两个规则来确定一个序列数大于或小于另一个序列数的规则,给定一个序列数字n和两个序列a和b,a被认为是最近的(更大的)在下列情况中的一个:

为了简单起见,取一个6位的序列号空间,n=26=64,所以n/2=32

给定两个序列数字48和18,48是最近的因为根据规则1

48 > 18and(48 – 18) = 30,and30 < 32.

给定两个序列数字3和48,3是最近的因为根据规则

3 < 48and (48 – 3) = 45,and45 > 32.

给定两个序列数字3和18,18是最近的,因为规则

18 > 3and(18 – 3) = 15,and15 < 32>

所以这些规则似乎是在执行循环性

但是,一个行为不那么好的网络又如何呢? 如果一个运行6位序列空间的网络,假设网络上的一个路由器决定要垮台,它脱口而出,3个相同的LSAs和一个44序列号(101100),不幸的是,邻近的路由器也会出现故障,它正在位下降drop bits。这个邻居在第二个LSA的序列号上drop 1 bit,在第三个LSA上又drop 1 bit,三次都是洪水。结果是三个相同的LSAs和三个不同的序列数:

应用循环规则表明,44比40更近,比8更近,比44更近!其结果是,每个LSA都将被不断地淹没,数据库将不断地被“最新”LSA所覆盖,直到最终缓冲区被LSAs阻塞,cpu过载,整个网络崩溃。

这一连串的事件听起来很牵强。然而,这是事实。ARPANET是现代互联网的先驱,它运行了一个早期的链路状态协议,它有一个六比特的环形序列空间;在1980年10月27日,两个正在经历故障的路由器将整个ARPANET暂停了。

棒棒糖形状序列号空间

一种线性和循环序列空间的混合,棒棒糖有一个线性分量和一个圆形分量,循环空间的问题在于没有比其他数更少的数,线性空间的问题是它们不是圆的。也就是说,它们的序列数是有限的。

当路由器重新启动时,最好从数字A开始,它比所有其他的数字都要少,邻居们会意识到这个数字是什么,如果他们的数据库中有一个从路由器a开始的b,他们可以把这个数字发送到路由器A和路由器A会跳转到这个序列号,在重新启动之前,路由器A可能能够发送多于一个LSA,然后才会听到它所使用的序列号,因此,有足够的重新启动编号是很重要的,因此,A不能在邻居使用之前使用它们,或者将之前使用的数字或之前使用的数字从所有数据库中使用。

这些线性重启的数字构成了棒棒糖的棒状,当它们被用完后,或者是邻居提供了一个可以跳跃的序列数,输入一个圆形的数字空间,棒棒糖的糖果部分。


http://chatgpt.dhexx.cn/article/60ltbPrr.shtml

相关文章

网络路由知识大全

一、 如果ping域名的时候出现ping:unknown host xxx.xxx 但是ping IP地址的时候可以通的话 可知是dns服务器没有配置好&#xff0c;查看一下配置文件/etc/resolv.conf&#xff0c;里面是否有nameserver xxx.xxx.xxx.xxx&#xff0c;比如使用dns服务器 nameserver 8.8.8.8&am…

java解析rtc_RTC Java API 学习笔记

1 使用RTC Java API进行登录&#xff1a; Login的步骤分为以下&#xff1a; 1 初始化启动RTC的平台TeamPlatform&#xff1a;TeamPlatform.startup(); 2 获取RTC repository的连接 ITeamRepository teamRepository TeamPlatform.getTeamRepositoryService().getTeamRepository…

JS控制元素的显示和隐藏

开发工具与关键技术&#xff1a; DW、前端 作者&#xff1a;梁锦豪 撰写时间&#xff1a;2019/1/16当我们想要通过事件来控制元素时&#xff0c;我们可以用JavaScript来实现 下面是通过鼠标移入&#xff0c;移出事件来控制元素的显示与隐藏的例子&#xff1a; 首先&#xff0c;…

如何通过JS判断一个元素是否显示、隐藏

如何通过JS判断一个元素是否显示、隐藏 文章目录 如何通过JS判断一个元素是否显示、隐藏通过display是否等于none来判断通过jquery的:hidden/:visible 伪类来判断说明 通过display是否等于none来判断 通过判断当前元素的display的值来判断当前元素是否是可见状态。只能用displa…

js显示隐藏

其实这边我是新学的一点知识虽然不多但是新手还是比较容易上手的 <div id"panel"><button class"head">什么是jQuery?</button><div class"content">jQuery是继Prototype之后又一个优秀的JavaScript库&#xff0c;它是…

CSS隐藏元素的方法

隐藏元素之后&#xff0c;它在页面的行为如何&#xff1f; HTML文件如下 很简单&#xff0c;就一个div <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content&…

javascript隐藏和显示元素

使页面元素隐藏和显示可以有两种方式&#xff1a; 方式一&#xff1a;设置元素style属性中的display var t document.getElementById(test);//选取id为test的元素 t.style.display none; // 隐藏选择的元素 t.style.display block; // 以块级样式显示方式二&#xff1a;设…

JavaScript控制元素(标签)的显示与隐藏

使用JavaScript有多种方式来隐藏元素&#xff1a; 方式一、使用HTML 的hidden 属性&#xff0c;隐藏后不占用原来的位置 hidden 属性是一个 Boolean 类型的值&#xff0c;如果想要隐藏元素&#xff0c;就将值设置为 true&#xff0c;否则就将值设置为false 【HTML hidden 属性…

faceswap-GAN

一&#xff0c;https://github.com/shaoanlu/faceswap-GAN 二&#xff0c;GAN网络架构 auto encoder网络结构 辨别网络结构 三&#xff0c;训练与推断 1.训练阶段&#xff0c;从人的图片上获取人脸并对齐作业&#xff0c;为了提升模型能力&#xff0c;并对人脸进行warp操作&a…

faceswap尝试

主要参考&#xff1a;https://github.com/deepfakes/faceswap 安装cuda9.0cudnn7.3.1python各种库 训练样本用的川普和凯奇。 显卡&#xff1a;1050ti 主要显卡太low了&#xff0c;慢的无语。。。。。

使用faceswap进行视频换脸操作

一、下载源码安装环境 开源csdn代码下载地址 https://codechina.csdn.net/mirrors/deepfakes/faceswap Github下载地址 https://github.com/deepfakes/faceswap 先下载源码&#xff0c;然后下载Anaconda3安装 官网&#xff0c;可以进一步了解faceswap https://forum.fac…

Deepfake-faceswap代码测试

FaceSwap Github官方文档 下面来记录一下我安装和运行faceswap的流程 首先需要downland源代码 Github配置相关的环境参考INSTALL.md 提取配置好tensorflow cuda 等等 比如最基本的就是Python3&#xff0c;并且这个可以调用Opencv(如果有错误&#xff0c;请参考另一篇记录) p…

Faceswap开发(一) GAN网络的基本了解

来自 Github上 作者 shaoanlu 链接&#xff1a; https://github.com/shaoanlu/faceswap-GAN 最近在研究Faceswap&#xff0c;随之就一定要了解GAN网络在工程中的使用原理&#xff0c;就算是Google上资料也并不多&#xff0c;检索到Github上优秀作者"shaoanlu"的工程…

faceswap 安装使用详情

最近对AI换脸比较感兴趣&#xff0c;就看了一下faceswap的使用。 1.下载代码&#xff1a; https://github.com/deepfakes/faceswap 2.安装python 3.xx版本&#xff0c;之前是2.x不能正常工作 3.运行setup.py wudi:faceswap xiepengchong$ python setup.pyWARNING Running …

Windows安装faceswap

一、安装python3.7版本的anaconda3 下载地址 &#xff1a; Anaconda3-2020.02-Windows-x86_64.exe 然后安装&#xff0c;一路下一步安装&#xff0c;下边两个勾选上 二、在.condarc文件中写入如下内容 &#xff0c;配置Anaconda的国内镜像地址 channels:- defaults show_cha…

3D FaceSwap换脸

3D FaceSwap 一、算法原理二、实验过程1.实验代码2.配置环境 一、算法原理 FaceSwap是基于图形学的换脸方法&#xff0c;首先获取人脸关键点&#xff0c;然后通过3D模型对人脸关键点位置进行渲染&#xff0c;不断缩小目标形状和关键点定位间的差异&#xff0c;最后将渲染模型的…

faceswap模型训练过程准备——提取人脸

我使用录屏工具获得视频&#xff0c;并命名为.mp4格式 提取帧 ffmpeg -i /Users/hehui/Documents/video.mp4 /Users/hehui/faceswap/src/cage/video-frame-%d.png 从照片中提取人脸&#xff1a; #-*-coding:utf8-*- import os import cv2 import time import shutildef getAl…

faceswap的正确安装步骤

第一步下载项目 faceswap项目地址&#xff1a;https://github.com/deepfakes/faceswap&#xff0c;下载后解压 第二步&#xff0c;环境配置 安装anaconda并换上清华源或阿里源&#xff1b;安装CUDA&#xff0c;可以不装cuDNN conda create -n faceswap python3.8 创建一个名…

AI换脸项目faceswap研究报告

缘起 deepfakes是利用AI技术换脸的开源项目&#xff0c;目前基于deepfakes的开源项目很多&#xff0c;而faceswap认可度很高&#xff0c;到目前为止有28.5千Star&#xff0c;可以说是换脸这类项目最火的了。小弟在当下有换脸需求&#xff0c;选取了这个项目进行研究尝试&#…