打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
计算机学习笔记:网络是怎么连接的​(下)
userphoto

2023.11.05 安徽

关注

网络传输

    随着技术的演化,集线器现在应该基本不用了,而交换机和路由器的界限可能渐渐模糊了,包括说路由器也可以内置交换机的功能。所以我们这里更多说的是一种概念上的交换机和路由器。也就是说,此处交换机代表的是一种以太网内部的传输设备,路由器代表的是一种互联网传输的设备。

此外我们要了解两个事情:

  1. 每个包都是独立转发的。每个包在传输到目的地的过程都是独立的,相互之间没有关联。

  2. 转发设备在转发包时并不会看数据内容,也就是HTTP请求方法、或者TCP确认响应,这个包来自客户端还是服务器等等,都与包的传输无关。

以太网传输(交换机)

    我们先看一下包是如何通过交换机的。下图是交换机的结构和原理示意图。

    首先从结构图里我们可以看到,交换机它也有MAC, PHY这些模块,他们会将传过来的信号转换为数字信息,然后通过包末尾的FCS校验错误,没有错误就放在内存的缓存区中。

    然后交换机会根据自己的MAC地址表进行转发。那这个MAC地址表是怎么来的,怎么维护的呢?

    主要有两种:一种是如果连接在此交换机上的某个设备发送过网络包,它的MAC地址就会被记录到地址表中。另一种是为了防止网络中设备的增减、移动。会定时删除地址中的记录。比如我们开会的时候,把电脑从工会拿到了另一栋楼的会议室之类的动作,我们电脑所处的网络可能就发生了变化。这时候原网络的交换机就会定时删除掉这些信息。

    因此当一个包存入缓存区后,交换机就会查询自己的MAC地址表,看应该转发到哪个端口上。而如果说在MAC地址表上找不到指定的MAC地址(可能因为这个连接的设备还没发送过包,或者一段时间没工作被删除了),那交换机就会把包转发到除了源端口之外的所有端口上,然后目标设备收到了就会做出响应,交换机就会相应地去更新地址表了。

    最后可以看一下交换机转发的方式:

    这是一个交换电路,将输入端和输出端连接起来。其中每个交叉点有一个交换开关,交换开关是电子控制的,通过切换开关的状态就可以改变信号的流向。假设我们要把2号端口的包转发到7号端口,那就把将左起的6个开关水平导通,而将第7个开关切换为垂直导通。包就可以转发到7号端口了。

(所以可见从硬件层去做转发是非常快的)

互联网传输(路由器)

    那么网络包经由交换机的传输后,现在到达了路由器,并且要被转发到下一个路由器。

    大体上说,路由器也是收到包,然后查询自己的路由表,然后转发到对应的端口。路由器会将接受到的网络包的接收方IP地址与路由表中的目标地址进行比较,找到记录后将包转发到对应的接口。

    路由器和交换机一个最大的不同在于对地址表(路由表)的维护。交换机需要掌握的信息比较少,就是他所在的以太网的那些机器就够了(也许几个,几十个,几百个)。但路由器需要掌握的信息是海量的,是整个互联网。所以他们维护地址表的方式肯定也不一样,交换机的维护表的方式是无法满足路由器的需求的。那路由器的路由表是怎么维护的呢?我们下面就来看一下。

    这本质上是一个大型分布式网络的CAP问题。我们从最简单直观的想法开始,看怎么一步步完善我们的设计。

路由协议
泛洪法

    我们先不去考虑任何性能的损耗、优化什么的,只要能达到目的:把消息送到我们的目的地。有什么办法呢?让我们从生活中找找灵感。

    我们知道往往流言蜚语的传播能力是最强的,为什么呢?究其本质,是因为中间有一大波对这类内容感兴趣的“节点”,会拿着这个消息逢人就说。然后谣言也就越传越广,最后往往还能传回到当事人耳朵里。绝对是无差别传播。

    所以第一种方法就是:让网络中的每个节点在收到包后向所有它的直连节点转发。

    这种方法的坏处很明显:网络负担很重,因为要转发的包数量非常多。尤其在网络拓扑中,环路是非常常见的,那么这种方式就会导致包在环路中一直打转。因此进而引进了包的TTL信息,每经过一个节点就减1,为0则被抛弃,以防止陷入死循环。

    但它也有它的好处,好处就是可达性非常强。无论这个网络怎么变化,线路怎么被破坏,但凡还有一条通路,消息都能被传过去。因此在对可达性要求很高比如军事场景下,会使用这种方式。

固定路由法

    OK,那我们用了泛洪法,很好,每条消息都确实能到达我们的目的地了。

    但是呢,渐渐地,时过境迁,全球经济陷入了衰退周期,单边主义盛行,世界最大的经济体由合作转为对抗,局部地区还有战争爆发,在一个旧秩序可能瓦解、新秩序可能建立的时代浪潮里,投资者不投钱了,经营者也就囊中羞涩,需要缩减预算,开源节流。那我们就不能再用这种泛洪法了,得想个办法减少成本。

    那怎么办呢?那我们就不能再往每个直连节点都传播了,我们要去做一些筛选,找到最划算的路径。

    那么首先,我们得对“划算”下一个定义,就得有计量标准,比如R2到R3的线路网速是1MB/S,而R2到R4的网速是10MB/S,那后者的花费就是1,前者是10。这里我们方便起见,假设每条链路花费都是1。然后我们希望每次到目标节点都是选的可选路径里花费最低的一条。那我们需要一些方法来计算一个图中A点到B点的最短路径。这个已经有了一个叫Dijkstra算法,可以计算出这个最短路径。最后我们有了汇集了所有最短路径的路由表后,将它分发给这个网络里的每个节点,包就可以根据路由表选出最划算的下一条节点了。

    经过这种方案优化后,我们的花费大大降低了,但它也带来了一些新的问题:那就是很不灵活,一旦说网络的拓扑结构发生变化后(比如节点的增减,链路的故障等等),都要用Dijksrta算法重新计算一遍,再由网络管理员重新下发到各个节点更新路由表。所以如果网络结构比较稳定,那还好,但如果是比较复杂、经常发生状况的网络,这种方案就有点力不从心了。因此为了提高的它的灵活性和健壮性,我们还需要给它增加一些动态的元素,让他对于网络的变化有自适应的能力。

集中路由法

    怎么增加呢。最直观的方法就是我们增加一个控制中心,定时计算最短路径,然后下发到网络中的节点上。通过这种方式,控制中心取代了网络管理员的角色,将分发这个动作变得自动化了,这样确实是更灵活了,但是也带来了隐患:就是这个系统非常依赖控制中心,万一控制中心出了什么问题,整个系统就可能面临瘫痪。当然我们可以做双机备份,但那又会带来数据一致性之类这样的新问题。

    既然中心结构无法令我们满意,我们就来看看扁平结构的思路是否可行。

逆向学习法

    扁平结构要怎么做呢?要将一个组织架构从中心结构转为扁平结构,我们需要把集中在中心的权力分散到组织里的每个节点手上。所谓群策群力,自下而上的改革背后也是这个道理

(《国际歌》 唐朝乐队)

    回到路由器的话题上。原先我们是一个控制中心告诉所有节点路由表,转变为由每个节点自己去探索、生成自己的路由表。

    首先我们再路由表结构中增加源节点和距离两个信息。

    然后比如R5向站点C发送一个包,这个包走的路径是R5-R3-R4-R8-R11-站点C。其中每走一步,距离就增加1。那么此时经过R8的时候,R8就知道了,从R4调过来,源节点为R5的花费是3,那么它记下来这个信息。

    过了一会儿,又来了一个包,这个包走的路径是R5-R3-R8-R11-站点C。这时候R8一比较,发现源节点为R5,下一跳是R3的路径花费是2,比3小,那就更新自己的路由表。之后R8向R5发送数据的时候,就会选择R3而不是R4

    以此类推,一段时间后,每个节点就都会学习到自己到其他节点的最优路径了。

    这种方案就具备一定的自适应能力了,比如后来R2和R6之间新架设了一条链路。很快R6会发现从R2过来的距离是2,比从R4过来更短,他就会去更新自己的路由表,学习到这条新路径。但是面对链路的崩溃,它的局限性就暴露了:比如前面R8已经学习到到R2的最短路径是2(R8-R3-R2),但是R3-R2的链路崩溃后,实际上走R3就需要通过R4绕行到R2,增大了花费。但是由于网络中其他路径都大于等于2,所以一直无法更新R8的这条记录。这个错误的信息也就一直存在于R8的路由表内。

    到目前为止,我们的方案虽然已经在不断优化,但其实缺陷都比较明显,因此都没有得到广泛的使用。最后真正流行在网络世界中的是另外两个方案:RIP,以及后来替代RIP的OSPF。

RIP

    RIP方案和逆向学习方案其实都是让节点去自学习路由表,但是学习策略做了改变。怎么改呢?我们看上面提到的逆向学习,它的问题在于什么?他的问题在于在学习过程中落入了惯性思维的陷阱,被困在了知识茧房中。最终成了刻舟求剑。而RIP则采用了定时广播绕开了这个陷阱。我们看下RIP的过程:

    一开始,每个节点把自己的直连节点距离设置为1。

    每个节点每隔30秒向相邻的节点广播自己的路由表。同时每个节点结合别的节点广播的路由表来更新自己的路由表。比如下图中R2收到R1的广播后,就知道自己到R5的距离是2,并将这个信息添加到自己的路由表中。

    就这样,在每个路由节点经过若干次向直连节点广播路由表后,整个网络中所有节点都获得了最优路径的路由表。用学术术语来说就是收敛了。

    RIP方案具备了更强的自适应能力,但是它对于一些链路故障也会无能为力或者出现慢收敛。下面举个例子。

    在这样一个网络中,加入R1和R2的线路断了,通过广播,R1和R2很快发现彼此是不可达的。但是接下来R2和R3在广播中,双方不断地认为对方藏了点不为人知的好东西,于是开启互吹模式,导致双方到彼此的距离不断膨胀,就出现了“无穷计数现象”。为了解决这个问题(或者说改善这个问题),RIP会选择一个数作为无穷大,一般来说是16。到了这个数就认为目标节点是不可达的。后面为了进一步优化,提出了类似水平分割和触发更新之类的改良方案,但是都没能完全解决问题。

OSPF

    最后取代RIP方案的是OSPF方案。OSPF的流程比RIP复杂很多,但是也非常强大。我们来看下它是怎么做的。

        Step1: 首先每个节点会每隔10秒向自己的直连节点发送消息以发现自己的邻居并确定连通情况。如果一个节点连续4次没有响应则认为此链路不可用。

        Step2: 每个节点和它的可达链路就形成了一个LSA(link statement advertisement),并把它存入到自己的数据库中

        Step3: 邻居之间互相交换数据库信息并进行对比、填充,达到一致后,关系晋升为邻接关系。值得注意的是,当节点收到一个有效的LSA的时候,会把这个LSA以泛洪的方式发给和它形成“领接”关系的节点。比如在图中,R2收到R3的LSA的时候,会把它发送给R1。但如果说此时R1的数据库里已经有了这个LSA了,就不会继续泛洪,以此来避免环路振荡的问题。

        Step4: 不断重复Step3,最后所有节点数据库中都获得了所有节点的LSA。那么此时每个节点都能靠自己复原出整个网络的全貌。接下来当然就可以计算自己到任何一个节点的最佳路径了。(这样也就自然可以避开前面诸多方案头疼的环路问题)。

    在OSPF的方案下,当某个节点发生变化(节点故障,链路增减等等),它或者它的邻居可以通过检测得知某个LSA已经改变,就会泛洪到自己的邻接节点,接下来整个网络上的各个节点就会很快更新并重新达到一致。

    OSPF取代RIP后,屹立几十年,经久不衰,到今天依然是流行的路由协议。

    最后需要补充说明的是:虽然一路以来一直在以迭代的方式在说各种方案,但俗话说:尺有所短,寸有所长。固然OSPF是当下最流行的路由协议,其他协议也都有各自擅长的场景。比如AS(自治体,巨大网络)之间会采用BGP, 家用路由器可能用的RIP,军事网络可能用的是泛洪法等等,在今天依然有他们自己的使用场景,不可一概而论。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
91.What makes a good school
OSPF的3种路由类型
计算机网络中的路由选择背后的原理到底是什么样的?
因特网路由技术及发展
OSPF大型网络配置系列
OSPF协议
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服