120由浅入深学网络--静态路由与动态路由

120由浅入深学网络--静态路由与动态路由,第1张

我们在 VLAN 的实验中学习到 VLAN 能够很好的隔离网路,减小广播域,但是隔离了网络的广播域也就意味着它们将处于不同的网络之中,这样仅仅依靠数据链路层的帧是无法相互通信的。所以若是我们需要 VLAN 间能够相互通信就必须得依靠网络的第三层网络层,通过路由的功能来连接两个不同网络使之相互通信。

使两个 VLAN 相互通信我们称之为 VLAN 间的路由,而实现这一功能的方法有两个:

单臂路由

SVI 接口

单臂路由(one-armed router 或者 router-on-a-stick)是指在路由器的一个接口上通过配置子接口(或“逻辑接口”,并不存在真正物理接口)的方式,实现原来相互隔离的不同 VLAN(虚拟局域网)之间的互联互通。

单臂路由就是依靠的路由器的路由功能,因为二层交换机没有办法实现路由。同时一个接口只能接收来自一个 VLAN 的数据(因为一个接口不能隶属于多个 VLAN),传统的 VLAN 间路由方式便是在 Switch 与 Router 之间连接多个端口以保证多个接收多个 VLAN 的数据,但是当 VLAN 很多的情况下,Router 不可能满足这么多端口,所以出现了子端口的实现,这是一种依靠软件实现的逻辑上的端口。这样便只需要通过一根物理连接线来实现多个 VLAN 接口的连接。

我们通过这样的一个实验来实现单臂路由的功能:

实验目的:配置实现单臂路由

实验材料:三台交换机、一台路由器

实验方法:

拖动三台交换机、一台路由器至画布,两台用作模拟PC,一台用所模拟 Switch,一台用作 Router

配置路由器、交换机的名字与连接线路

配置交换机中的 vlan,以及三个接口的模式

配置两台 PC 的 IP 地址与默认网关(下文详解),他们处于不同的 VLAN 中

配置路由器的子接口,以及子接口的 IP 地址

尝试使用 PC 相互 ping 通

1构建实验环境,在画布中拖出三台交换机与一台路由器,并修改他们的设备名称,同时修改两台用作模拟 PC 的交换机图标,然后相互连接。结构如图所示:

2配置交换机相关的内容,在 Switch1 中配置两个 VLAN,分别为 vlan 2:test2、vlan 3:test3。同时将与 PC 连接的两个端口分别配置为 access vlan 2 与 access vlan 3,还有与路由器相连接的端口配置为 trunk 模式。若是与路由器相连接的端口不配置成 trunk 模式将无法发送多个 vlan 的数据包。

3修改 PC 端口的 IP 地址

此时我们可以尝试通过 PC1 去 ping PC2,我们会发现肯定是 ping 不通的,因为他们处于不同的网段同时处于不同的 VLAN 中。

3为两台 PC 配置默认网关(默认网关用于将数据包发送至路由端口,下文详解)

可用回到特权模式中,通过 show ip route 查看,是否成功配置:

4在路由器中配置逻辑子接口,分别用于接收 vlan2 与 vlan3 的数据。因为是接收来自交换机发来的信息,所以该子接口的数据封装模式与交换机中的相同,交换机此处 trunk 模式使用的是 dot1q 的封装方法,所以子接口中的也必须是这个方法。(还记得在 VLAN 划分实验中我们将到 trunk 模式主要作用是添加 VLAN 标签)

这样我们就成功的配置好了我们的子端口,我们可以通过 show ip int brief 查看接口信息中是否有这两个子接口的配置,还可以通过 show vlans 查看子接口的状态,以及通过 show ip route 命令来查看当前的路由信息,若是有两个直连路由表项,说明我们配置成功的生效了:

5完成了所有的配置,准备工作,我们再次尝试通过使用 PC1 去 Ping PC2 发现 5个点都变成了感叹号,表示所有的 ICMP 包(ping 工具使用的是 ICMP 协议)都得到了响应,PC1 可以与 PC2 正常通信了:

由上述的两个原因,为此出现了一种新的功能,便是在三层交换上的 SVI 接口,这样便不需要单独添加一台路由器了。

SVI 是 Switch Virtual Interface 的简称。它是三层交换机上的一个虚拟端口,类似于 Router 上的子端口,由软件实现。每个 SVI 只能关联一个 VLAN,设置一个 IP 地址。

基于上个实验,我们做出这样的修改:

去除 Router 设备

设置 SVI 接口地址

我们将去除 Router 设备,由我们的三层交换机来实现相关的功能,将之前的网关地址设置为 SVI 的 IP 地址即可

1去除 Router 设备,关闭 Switch 上的 e0/0 接口,同时配置 SVI 的 IP 地址:

如此便完成了 SVI 的配置,我们可以在 Switch 的特权模式中使用 show ip route 可以看到此时我们有两个直连的路由信息。同时我们还可以尝试使用 PC1 去 ping PC2。(若是配置与我完全一致,但是 ping 不通,可以尝试在 Switch 的全局模式中使用 no ip cef 命令)

此处使用 no ip cef 命令关闭转发机制便是该版本的镜像并没有很好的在 Linux 中实现其提供的功能,可能该镜像的设备本是使用硬件辅助实现该功能等等。若是不关闭 cef 的转发机制,将导致你明明配置无误,却无法正常的通信。

由此我们便成功的配置了单臂路由与 SVI 接口来成功的实现 VLAN 之间的相互通信了。

在之前的实验中我们经常提到默认网关之一名词,接下来我们便来了解一下该名词的含义。

默认网关由两个词组成默认与网关。其中什么叫做网关呢?

网关(Gateway)就是一个网络与另一个网络连接的关口。

比如成都市与广州市都只有一个邮局,而每个邮局前都会有一个专职的负责人,此时若是成都市的小明想与广州市的小红联系只能通过这样的一个过程:

首先将写好的信交给邮局的专职负责人,

邮局的专职负责人查看信封上的地址,发现该地址并不是本省中的地址,并且邮编写的是广东省的地址。

成都的邮局专职负责人便将该消息转发送给广州的邮局专职负责人,让他交给收件人

广州的邮局专职负责人收到信封后,发现目的地址便是本省中的地址,便寻找该地址将消息送到收件人的手中。

在这个例子中邮局的专职负责人便是网关。负责将本网段中的消息发送给其他网段的网关的接口。

默认网关的意思是一台主机如果找不到可用的网关,就把数据包发给默认指定的网关,由这个网关来处理数据包。只要指定了默认网关之后,只要主机在发送数据包之前由目的地址与其子网掩码做 AND 运算得出的网络号与本机的网络号不同,便将数据发送给默认网关,由默认网关处理数据该如何发送。

在全局模式中我们可以通过这样的命令来实现默认网关的配置:

通过 show ip route 我们可以看到这样的结果:

我们了解到数据包发送到其他网段是通过查询路由表,然后决定下一跳发送的路径。而路由表中的表项是如何得来的呢?

首先以路由的角度将协议分为:

可路由协议(Routed Protocol):利用网络层完成通信的协议,例如 IP、IPX 等,该对象是被路由的。

路由协议(Routing Protocol):主要用于创建与维护路由表,本质是实现路由功能,该对象是路由其他对象的,例如 RIP、OSPF、IGRP、IS-IS 等等。

而路由表中的信息分为两大类:

直连路由:也就是该设备中的接口所配置的 IP 地址与其所处的网络

远程路由:也就是发向其他路由设备所处的 IP 地址与其所处的网络

直连路由是在 IP 接口地址配置后便自动添加的,而远程路由的信息来源又会分为两大类:

静态路由:由人工配置的下一跳地址,在网络拓扑发生变化时同样需要人工修改,但是配置完成之后并不会占用过多的系统资源,与网络的带宽。在静态路由中有缺省路由(也就是默认路由)、浮动路由的存在。适用于小型网络与末梢网络

动态路由:通过动态路由协议,设备与设备之间相互通信,相互学习。再由某种路由算法计算出下一跳的路径,当有多条路径的时候还有优先级的排序,并且在网络拓扑发生变化的时候,会自动学习网络中的变化适当改变路径,适用于大型网络。

其中动态路由协议有这样几种分类的标准:

按算法分为:距离矢量(典型的协议有 RIP、IGRP、BGP)、链路状态(典型的协议有 OSPF IS-IS)、混合算法(典型的协议有 EIGRP)

按照是否发送子网掩码分为:有类(典型的有 RIP、IGRP)与无类(支持子网划分与路由汇总,典型的有 OSPF 等)

按照使用的网络规模分为:IGP(Interior gateway protocol),内部网关协议,几乎所有的路由协议都属于内部网关协议)与 EGP(Exterior Gateway Protocol),外部网关协议,BGP 用于自治系统之间的路由计算)

其中按照算法分的距离矢量表示的是根据源到目的的跳数来计算(之前有提过,下一跳表示去往下一个路由);所谓的链路状态便是多方面考虑如链路的开销、链路上的所有的相邻路由器、网络带宽,网络拥塞等等综合考虑;所谓的混合算法便是这两个的结合考虑。

其中的自治系统是表示属于某一个特定的网络机构中路由集合。在自治系统内部使用的路由协议就是内部网关协议,而自治系统之间的是外部网关协议。

反应路由性能的参考对象主要还是收敛时间与管理距离(在上一节实验我们都提到过):

收敛时间(convergence time):从网络拓扑变化到网络中所有的路由器都知道这个变化的时间就叫收敛时间;

管理距离(administrative distance):用于综合评价路由协议性能参数,描述路由协议计算路由条目的准确度与可信度。

所谓的静态路由便是由纯手工的配置在路由表项中,这样的配置路由方式非常的耗时,效率不高,并且在网络拓扑发生改变的时候需要手工的一项一项的修改,十分的麻烦,事情总是利弊双面的,有弊就有利,虽然麻烦但是就因为不会自动学习修改所以不会发送通告占用带宽,也不会占用太多的 CPU 与 RAM 这样的系统资源。并且可以手工控制数据包的转发路径,因此静态路由在小型企业中还是十分常用。

静态路由的配置很简单,只需要通过这样的一条命令即可:

我们可以通过这样的例子来学习静态路由的配置:

还是使用上述 SVI 的实验环境,我们在 Switch 上添加一个路由,并且配置为 20220300 这个网段下:

此时 PC 肯定是无法 ping 通 20220302 地址的,因为虽然在 Switch 中有该网段的路由表项(因为是直连网段),但是数据包在 Router 接收到之后,响应时发现路由表中无 19216810 网段表项,不知道怎么转发回来,便只有丢弃该数据包了。

通过 show ip route 我们可以看到静态路由成功的添加了:

并且此时可以 ping 通对端的 IP 地址:

这只是一条记录,并且只是 19216810 网段可以 ping 通,若是 PC2 去 ping 还是会不通,因为 PC2 在 19216820 网段,路由表中没有可以匹配的项。此时我们发现所有的地址都会通过 Switch,基本设备都是围绕它来的,他知道所有的路由路径,我便可以直接设置一个默认路由,也就是只要路由表中没有目的地址所匹配的表项,就都丢给默认路由。

既然如此也就代表着默认路由要匹配所有项,因为表中一旦无匹配就让他路由,换个角度就代表他得匹配所有项,而匹配所有项的地址便是 0000,同时子网掩码也是这个值。因为 0 表示的是任意的(wildcard)

默认路由就是一种特殊的静态路由,所以若是要配置默认路由只需要将上述的命令中的目的地址与子网掩码改成 0000 0000 即可。

我们可以在刚刚的环境中实验一次,先擦除原先的静态路由然后再配置:

这就是便是默认路由只要路由表中没有匹配的项就让它来路由。

当然按照我们之前所说的冗余思想,避免单点故障使得一个数据包到达目的地可能有多条路径,此时我们便可以配置浮动路由,所谓的浮动路由便是当优先级较高的路径出现问题时,还有一条路径能够及时的替补上来。而优先级的体现在于我们上节实验中所提到的 AD,当值越小的时候其优先级便越高。

浮动路由的配置很简单,就是在添加备选路径时,把静态路由命令的网关地址修改以及后面添加 AD 值,该值的取值范围是 0~255。例如:

但是三层交换机并不支持浮动路由,需要路由器才能实现。

在画布中拖动两台路由器,实现这样的拓扑结构,同时配置浮动路由使得在一条线路断掉时,还是可以工作。(需要借助环回接口,在全局模式中 int loopback 0(这个为编号,自取) 便可以像配置端口一般为其配置 IP 地址了)

验证方式:

首先查看路由表中的静态路由是 19216812,并且能够 Router 设备能够 ping 通 20220411

然后 shutdown s2/0 端口,再次 ping 20220411 还是能通,并且此时的路由表的静态路由项发生变化

注意:此处使用的两个都是串口,因为 GNS3 的路由串口实现没有问题,浮动路由只需要一个端口断开,另外一边不通就知道断开了便启用浮动路由。但是若是使用的以太口,GNS3 实现出来与真实设备不同,不同之处在 GNS3 用以太口实现的话检测不出对端断开了,必须同时断开此端口与对端端口才行,所以此处使用串口。

如此的话,说明系统有问题了。直接换个验证过的系统盘重装系统就行了,这样就可以全程自动、顺利解决 系统运行错误 的问题了。用u盘或者硬盘这些都是可以的,且安装速度非常快。但关键是:要有兼容性好的(兼容ide、achi、Raid模式的安装)并能自动永久激活的、能够自动安装机器硬件驱动序的系统盘,这就可以全程自动、顺利重装系统了。方法如下:

1、U盘安装:用ultraiso软件,打开下载好的系统安装盘文件(ISO文件),执行“写入映像文件”把U盘插到电脑上,点击“确定”,等待程序执行完毕后,这样就做好了启动及安装系统用的u盘,用这个做好的系统u盘引导启动机器后,即可顺利重装系统了;

2、硬盘安装:前提是,需要有一个可以正常运行的Windows系统,提取下载的ISO文件中的“GHO”和“安装系统EXE”到电脑的非系统分区,然后运行“安装系统EXE”,直接回车确认还原 *** 作,再次确认执行自动安装 *** 作。(执行前注意备份C盘重要资料!);

3、图文版教程:有这方面的详细图文版安装教程怎么给你?不能附加的。会被系统判为违规的。

重装系统的系统盘下载地址在“知道页面”右上角的…………si xin zhong…………有!望采纳!

内存不能为read的问题是一个非常复杂的问题,造成的原因是多方面的,有硬件的原因,也有软件的原因,一时半会儿很难搞的清楚。就是对那些整天玩电脑的老手来说也是一个非常辣手的问题。就我个人的理解,大多与使用非原版的系统而产生的不稳定性有关,轻易很难修复。所以我一般的主张是,只要不是频繁出现,可以不必管它,点一下“确定”或者“取消”就可以了。如果真有兴趣想研究一下的话,你可以试着从一下方面寻找原因:

1 内存条坏了或与主板不兼容 更换内存条

2 双内存不兼容 使用同品牌的内存或只要一条内存

3 内存质量问题 更换内存条

4 散热问题 加强机箱内部的散热

5 内存和主板没插好或其他硬件不兼容 重插内存或换个插槽

6 硬盘有问题 更换硬盘

7 驱动问题 重装驱动,如果是新系统,应先安装主板驱动

8 软件损坏 重装软件

9 软件有BUG 打补丁或更新到最新版本

10 软件和系统不兼容 给软件打上补丁或是试试系统的兼容模式

11 软件和软件之间有冲突 如果最近安装了什么新软件,卸载了试试

12 软件要使用其他相关的软件有问题 重装相关软件,比如播放某一格式的文件时出错,可能是这个文件的解码器有问题

13 病毒问题 杀毒

14 杀毒软件与系统或软件相冲突 由于杀毒软件是进入底层监控系统的,可能与一些软件相冲突,卸载试试

15 系统本身有问题 有时候 *** 作系统本身也会有BUG,要注意安装官方发行的更新程序,象SP的补丁,最好打上

——最后我再强调一下,不是所有的电脑问题我们普通人都能搞得清摸得透的,以上的方法即使都已试过,谁也不能保证一定能够解决你的问题,因为电脑的问题的确很复杂,“不能为read”这仅仅是一个症状,单凭这一个小小的症状是很难一下子找到问题所在的。我们都希望当说明了问题之后能够马上得到满意的回答,有时候是不可能的,必须慢慢的摸索才能知道问题所在。如果想省心的话,也许只有最后这两点建议最有用:一是不管它(反正也没有大碍),二是重装一个稳定的系统。说到系统,这也是我要说的重点,实际上我们的电脑之所以出现“内存不能为read的问题”,大多都与安装了Ghost系统有关,“内存不能为read”现象可以说是Ghost系统的一个不可修复的通病。所以我建议你用原版系统盘重装系统。关于什么是Ghost系统,我在这里也解释一下(好多现在正在使用Ghost系统的人都不知道自己的系统是Ghost系统),所谓Ghost系统,就是指像那些番茄花园、电脑公司版、雨林木风、萝卜家园等改版本的XP系统,即非原版的系统。你可以通过点“我的电脑”右键-属性来查看你的系统属性。

开始

首先,根据自身所使用的开发平台,可以去 这里 下载对应的发布版本。针对这个教程,我们需要下载1750或者更新的版本。当前支持的平台有Windows, Linux和Mac OS X。每一个版本都包含了当在特定平台上编译特定版本CEF3时所需要的所有文件和资源。您可以通过包含在里边的 REDMEtxt 文件或者在Wiki上GeneralUsage 中的 Getting Started,了解每个发布版本的具体内容和细节。

编译发布版本中的项目

以CEF发布版本为基础开发的应用程序可以使用标准的平台编译工具进行编译执行。包括 Windows 平台下的 Visual Studio, Mac OS X 平台下的 Xcode, 以及 Linux 平台下的 gcc/make。针对平台的不同,项目的编译过程也有些许的不同和要求。

Windows

Windows 平台下编译 Cefsimple 步骤:

1 用对应的 Visual Studio 版本打开项目解决方案。举个例子,如果你安装的是 Visual Studio 2010, 那么,打开的就是 cesimple2010sln。

2 如果你下载的是 x64版本,请确保你选择的是 x64的开发平台。

3 开始编译。

4 如果编译通过,那么,在当前解决方案的目录下,将出现“out/Debug”(或者 “out/Release”)文件夹。

5 执行文件夹下 cefsimpleexe, 确保能正确运行。

加载一个自定义URL

cefsimple项目中默认加载的URL是 googlecom,当然,你也可以用自定义的 URL 去替代它,最方便的就是通过命令行搞定。

# Load the local file “c:\example\examplehtml”

cefsimpleexe --url=file://c:/example/examplehtml

除了命令行的方法,也可以通过直接修改在 cefsimple/simplecpp 文件中的代码,达到你的目的。

# Load the local file “c:\example\examplehtml”

if (urlempty())

url = file://c:/example/examplehtml;

应用程序组成

所有的 CEF 应用程序都有一下主要组成部分:

1 CEF 的动态链接库 。(在 Windows 平台下就是 libcefdll)

2 支持库。(ICU, FFMPEG等)

3 资源。(html/js/css, strings等)

4 客户端执行文件。(本教程中就是 cefsimpleexe)

要点(必看)

1 CEF 使用的是多进程。应用程序主进程是浏览器进程,而其他子进程是由 renderer, plugins, GPU等创建。

2 在 Windows 和 Linux 平台下的执行文件可以被主进程和子进程使用。

3 CEF 中所有进程都可以是多线程的。CEF提供了许多功能和接口在不同的线程中传递任务。

4 一些回调方法和函数只能在特定的进程或者线程中使用。在你第一次使用新的回调方法或者函数之前,请确保你已经阅读了 API 头文件中源码,看使用要求。

流程分析

cefsimple 应用程序首先初始化CEF,然后创建了一个简单的d出浏览器窗口。当关闭了所有的浏览器窗口,应用程序就会结束。程序执行流程如下:

1 系统执行入口点函数(main or wWinMain),并创建浏览器进程。

2 入口点函数:

1 创建能够处理进程级别的回调方法的 SimpleApp 实例。

2 初始化 CEF,进入 CEF 消息循环。

3 初始化 CEF 之后,调用 SimpleApp::OnContextInitialized() 。这个方法中:

1 创建单例的 SimpleHandler 。

2 由 CefBrowserHost::CreateBrowsersync() 方法创建一个浏览器窗口。

4 所有的浏览器共享 SimpleHandler 实例, 此实例能定制浏览器行为、处理浏览器相关回调方法(life span, loading state, title display等)。

5 当一个浏览器窗口关闭的时候,调用 SimpleHandler::OnBeforeClose() 。当所有的浏览器窗口全部关闭时,OnBeforeClose() 函数就会执行跳出 CEF 消息循环的行为,退出应用程序。

入口点函数

程序的运行开始于浏览器进程中的入口点函数。这个函数会初始化 CEF 以及所有跟 *** 作系统有关的对象。

Windows

#include <windowsh>

#include "cefsimple/simple_apph"

#include "include/cef_sandbox_winh"

// Set to 0 to disable sandbox support

#define CEF_ENABLE_SANDBOX 1

#if CEF_ENABLE_SANDBOX

// The cef_sandboxlib static library is currently built with VS2010 It may not

// link successfully with other VS versions

#pragma comment(lib, "cef_sandboxlib")

#endif

// Entry point function for all processes

int APIENTRY wWinMain(HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPTSTR lpCmdLine,

int nCmdShow) {

UNREFERENCED_PARAMETER(hPrevInstance);

UNREFERENCED_PARAMETER(lpCmdLine);

void sandbox_info = NULL;

#if CEF_ENABLE_SANDBOX

// Manage the life span of the sandbox information object This is necessary

// for sandbox support on Windows See cef_sandbox_winh for complete details

CefScopedSandboxInfo scoped_sandbox;

sandbox_info = scoped_sandboxsandbox_info();

#endif

// Provide CEF with command-line arguments

CefMainArgs main_args(hInstance);

// SimpleApp implements application-level callbacks It will create the first

// browser instance in OnContextInitialized() after CEF has initialized

CefRefPtr<SimpleApp> app(new SimpleApp);

// CEF applications have multiple sub-processes (render, plugin, GPU, etc)

// that share the same executable This function checks the command-line and,

// if this is a sub-process, executes the appropriate logic

int exit_code = CefExecuteProcess(main_args, appget(), sandbox_info);

if (exit_code >= 0) {

// The sub-process has completed so return here

return exit_code;

}

// Specify CEF global settings here

CefSettings settings;

#if !CEF_ENABLE_SANDBOX

settingsno_sandbox = true;

#endif

// Initialize CEF

CefInitialize(main_args, settings, appget(), sandbox_info);

// Run the CEF message loop This will block until CefQuitMessageLoop() is

// called

CefRunMessageLoop();

// Shut down CEF

CefShutdown();

return 0;

}

SimpleApp

SimpleApp 负责处理进程级别的回调方法。它会曝露出一些在多进程中共享或者被特定进程使用的接口和方法。CefBrowserProcessHandler 接口,在浏览器进程中调用。还有一个被分离出 CefBrowserProcessHandler 接口(例子项目没有展示)只会在渲染进程中被调用。由于 CefBrowserProcessHandler 不光实现了 CefApp, 同时还有 CefBrowserProcessHandler,所以它的返回值必须是[this]。

// simple_apph

#include "include/cef_apph"

class SimpleApp : public CefApp,

public CefBrowserProcessHandler {

public:

SimpleApp();

// CefApp methods:

virtual CefRefPtr<CefBrowserProcessHandler> GetBrowserProcessHandler()

OVERRIDE { return this; }

// CefBrowserProcessHandler methods:

virtual void OnContextInitialized() OVERRIDE;

private:

// Include the default reference counting implementation

IMPLEMENT_REFCOUNTING(SimpleApp);

};

// simple_appcpp

#include "cefsimple/simple_apph"

#include <string>

#include "cefsimple/simple_handlerh"

#include "cefsimple/utilh"

#include "include/cef_browserh"

#include "include/cef_command_lineh"

SimpleApp::SimpleApp() {

}

void SimpleApp::OnContextInitialized() {

REQUIRE_UI_THREAD();

// Information used when creating the native window

CefWindowInfo window_info;

#if defined(OS_WIN)

// On Windows we need to specify certain flags that will be passed to

// CreateWindowEx()

window_infoSetAsPopup(NULL, "cefsimple");

#endif

// SimpleHandler implements browser-level callbacks

CefRefPtr<SimpleHandler> handler(new SimpleHandler());

// Specify CEF browser settings here

CefBrowserSettings browser_settings;

std::string url;

// Check if a "--url=" value was provided via the command-line If so, use

// that instead of the default URL

CefRefPtr<CefCommandLine> command_line =

CefCommandLine::GetGlobalCommandLine();

url = command_line->GetSwitchValue("url");

if (urlempty())

url = ">

可以通过实现ClientHandler类中的OnBeforePopup方法来控制d窗的显示和隐藏。

1、ClientHandler的类,并重写OnBeforePopup方法,在该方法中判断d窗的类型,如需要隐藏d窗,需要将参数handled设置为true,即忽略该d窗的显示请求。

2、在网页中使用JavaScript代码来隐藏d窗。通过获取d窗的DOM元素,设置元素的display、visibility等CSS属性为none,即可将d窗隐藏。

这个是思科的路由快速转发技术

当路由器对第一个packet进行发往目标地址的处理的时候,先查看路由表和选择出口接口,然后获取组成frame的信息(比如ARP表的查询)并进行封装,然后传输。之前获取的这些路由和数据链路信息将被保存在快速交换的cache中。接下来,当有要到达和第一个包相同的目标地址的包的时候,就可以不进行路由表和ARP表的查询,直接对packet进行交换。快速交换降低了CPU的占用和处理时间,并意味着去往某个目标地址的packet都从相同的路由器接口被路由出去。

当有到达同一网络不同主机的packet,路由器可能会吧这些packet通过另外一条链路进行路由。因此,路由器能做的最好的就是给予目标地址的均衡负载

所谓基于基于packet的均衡负载,是说假如有2条到达目标地址的路径,那么第一个packet将通过第一条链路到达目标设备,第二个packet将通过第二条链路到达目标设备,第三个packet又将通过第一条链路到达目标设备等等,以次类推。(这里考虑的是等价的均衡负载)

Cisco路由器工作在Process Switching(进程交换)模式的时候就采用基于packet的均衡负载进程交换,是指每次对packet的交换,都要查询路由表,选择出口接口和查询数据链路信息,因为每次的路由决策都是独立的。

github上有问题的描述

解决方法:

// browser是窗口上的浏览器控件

browserPreviewTextInput += (o, e) =>{

foreach (var character in eText)

   {        // 把每个字符向浏览器组件发送一遍

       browserGetBrowser()GetHost()SendKeyEvent((int)WMCHAR, (int)character, 0);

 

}

 // 不让cef自己处理

   eHandled = true;

};

没测试过,你最好自己测试下,题外话,其实用electron来开发不会更香吗?

以上就是关于120由浅入深学网络--静态路由与动态路由全部的内容,包括:120由浅入深学网络--静态路由与动态路由、无法定位程序输入点于动态链接库libcef.dll 之前缺失了 libcef.dll 我下载了一、最近我的电脑总是提示ox759b5e6指令引用的0x001dcef4不能read ,然后页面就自己关了是怎么回事啊等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/9637795.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存