[计算机网络] - 从英雄联盟,看数据包何去何从?

写在前面

我们总是在说TCP/IP协议。HTTP头怎么怎么样;TCP头怎么怎么样;IP头怎么怎么样;MAC头怎么怎么样。不过话又说回来,计算机网络的问题,大多都是问这些。深入了解这部分内容,的确是最优解。

不过作为德智体美劳全面发展的新时代码农,多了解一点,多学习一点。总归是没错的。(不就是多掉几根头发,怕啥!大不了用霸王)

今天,我们就来从英雄联盟入手,聊一聊数据包是怎么从我方水晶(我的计算机)到敌方水晶(目标计算机)的。

当然,如果不想看这些莫名其妙内容的小伙伴,可以直接拉到文章末尾看总结~

开搞

准备工作

首先来说,一般情况下,从应用层到链路层,我们逐层包装了HTTP协议的内容,TCP协议的内容,IP协议的内容。此时到了链路层,准备封装mac地址。

那么这个时候我们需要通过ARP协议得到目标IP的mac地址。第一步,一定要判断一下目标IP是否和自己是同一网段。

A-IP判断:B-IP是否和自己是同一网段,使用的方式是自己的(A-IP)子网掩码与B-IP的IP地址进行“与”(两位同时为“1”,结果才为“1”,否则为0)运算。

如果是同一网段,那么很舒服。直接局域网大吼一声,这个谁知道这个X-IP地址的mac。X-IP所在的网口一看:哎呦卧槽,这不是叫我的么?哥们,里边请里边请。

那么这个包很顺利的都进来了。那么接下来就是我们熟悉的TCP/IP的反向解析的过程。

那如果不在同一网段呢?

让我们先看一张图:

进入联盟的世界

是不是觉得走错片场了?没走错、没走错,接下来就让我,用这张图,解释数据包(英雄)将如何从我方水晶(我的计算机)到敌方水晶(目标计算机)。

假设我们是随机英雄,游戏加载完毕,英雄被创建出来(从应用层到网络层,层层包装),来到了我方泉水(链路层)。

游戏准备开始,呦,我们的英雄是个瑞雯。假设我们的瑞雯,出生就带着一个目标:从上路攻入敌方水晶。

但是我们的瑞雯,只知道目标,其他啥都不知道!敌方上路怎么走?我是新手,不知道啊。泉水商人是个战争贩子,见多识广,去问问他吧!

泉水商人看到瑞雯的目标,给瑞雯指了条明路:你去找我方上路高地塔。

我方上路高地塔,看到了瑞雯的目标说话了:不要慌,虽然我不知道敌方上路到水晶怎么走,但是我知道我方上路门牙怎么走。你从我这走,去它那准没错!

瑞雯拖着符文之刃,来到了我方上路门牙。我方上路门牙一看目标,瑞雯的目的是敌方水晶!我方上路门牙,轻蔑一笑:小姑娘,我劝你不要去找死。

瑞雯冷哼一声:老娘,心悦会员666!此话一出,天也晴了,雨也停了,网络仿佛也很行了。

就这样我们的瑞雯,左手人民币,右手大帽子,一路杀到敌方水晶,顺利完成目标。

正经的来一发

解析一些上述加粗的内容:

名词 解释
瑞雯 这个就不多说了,我们的数据包。
目标 也就是我们的目标IP。
泉水商人 可以理解默认网关,当我们的数据包的目标IP不是源IP的同一网段时,这个包将交给默认网关,由它去处理。至于它怎么处理,下文我们会提及。
上路高地塔、上路门牙 他们二者可以理解为数据包在网络传输过程中如果跳转的路由器。

说实话,用联盟的例子,属实可能有些不是很准确,不过大的框架用此还是可以解释清楚的。接下来我们正经的来聊一聊这个过程~

其实这个过程完全可以通过一个图解释:

数据包离开被发出前,需要先计算一下目标IP是否和自己是同一网段,这里就俩种可能:是与否。 如果是同一网络,直接通过ARP协议(使用“吼”的方式,等待对方应答),得到目标所在的mac,封装到数据包中,发过去即可。 如果不是同一网络,那么就需要先通过ARP协议获取到静态网关的mac地址(同样使用“吼的方式”),将包发给它,至于静态网关怎么找到目标地址,那就是静态网关的事了。

停一停,聊一聊网关与路由器

网关

静态网关:静态网关是在操作系统启动时,通过DHCP协议配置好的,默认网关的IP地址是192.168.1.1。

静态网关就是网关,网关是它所属的这个局域网对外进出的关键。

路由器

而路由器则负责连接多个网关,用于转发数据包到某一个网关上,所以说路由器是管理网关的关键。

因此把网关比做路由器可能不是很恰当。二者并非是同一个东西:如果把整个计算机网络世界比做古代世界的话。那么网关就像一个关卡,路由器则是一座城市。城池可以掌管多个关卡。关卡可以掌管多条官道。

三国志11的地图

如果我们想从许昌到长安,那么这条路上,虎牢关和函谷关就可以称之为网关,洛阳器就是路由器。许昌和虎牢关可以看做同一个局域网。

许昌的人想从这个局域网出去,必须要从虎牢关(默认网关)出发,而想要到长安城,虎牢关这个网关知道要转发给洛阳城才行;洛阳作为路由器,通过自身的路由表,找到了长安的所在IP,需要转发给函谷关这个网关。

因此数据包就到达了函谷关所管辖的局域网之中,最终送达到了长安。

我们的网络世界由路由器连接了一个有一个局域网,而网关则负责自己所管辖的一亩三分地(局域网)。

继续数据包的旅程

静态网关拿到数据包,继续根据目标IP计算该怎么转发这个包。比如静态网关知道这个目标IP应该有路由器4是转发。那么它会重新封装mac地址,将包发给路由器4。那么这里可能有引出来一个疑问:网络这么大,路由器们是怎么知道某个IP是发给谁的呢?这里就涉及到路由表以及路由协议了。

路由表

通过这张表,路由器知道进来的数据包该从那个网口(网关)出去。而这张表则是由路由协议生成的。

路由协议

路由可以分为:静态路由和动态路由。静态路由可以理解为我们自己去设置路由结构,从哪跳到哪,但是这个只适合于网络情况比较简单的问题。

所以,这部分我们主要聊一聊动态路由。动态路由可以根据路由协议算法生成动态路由表,随网络运行状况的变化而变...

我们的互联网世界是一个复杂且多变的环境,如果抽象出来,可以看成一个图的结构。那么现在的问题对于路由算法来说就变成了,从图中找到目标的最短路径。

这里常见的有俩种:距离矢量路由算法、链路状态路由算法。

动态路由算法 - 距离矢量路由算法:

基于 Bellman-Ford 算法的。就是我们数据结构中。求图的最短路径的算法。算法的基本思路是,每个路由器都保存一个路由表,每一行包含两部分信息,一个是要到目标路由器,从那条线出去 ,另一个是到目标路由器的距离。

因为篇幅原因,这部分内容暂时不做展开,如果有小伙伴感兴趣,可以自行去了解呦。

动态路由算法 - 链路状态路由算法

基于 Dijkstra 算法,同样是我们数据结构中的算法。 每个启动的路由器,都会先找到并计算出于自己临近路由器的距离,然后将这个表广播发送给整个网络。最终每个路由器都会有整个路由结构。

因为篇幅原因,这部分内容暂时不做展开,如果有小伙伴感兴趣,可以自行去了解呦。

再次继续数据包的旅程

当我们的路由器拥有了路由表,那么路由器就仿佛拥有了全世界,因此对于此时的计算机网络的世界来说,任何一个都路由到的IP地址,都是可以被访问到的,无非是需要跳转几次个路由器而已。

当我们的数据包,每到达一个路由器时,路由器都会检查这个包的目标IP,然后同自己的路由表内容进行配置,看一看应该发送到那个网关上。

网关接到数据包,如果发现不是自己这个局域网的,那么同样它也会转发给能够结构的路由器,循环往复这个过程,直至到达目的地。

总结

一个数据离开网卡,会有俩个出路,一个是广播给同一个网段的某台计算机;另一个出路是发送给配置好的默认网关。而这个网关则会发送对应的路由器,路由器通过自己的路由表确定下一条的网关。下一个网关,会查看这个数据包是不是自己局域网内的IP,如果不是则发送给能够转发出去的路由器。周而复始的执行这个过程。直到合适的网关接到数据,广播给自己局域网内容的计算机。

尾声

其实本篇内容,偏向于流程的梳理,因为计算机网络的世界本身就是以及极为庞大且复杂的学问,三言俩雨根本无法解释清楚其中的复杂与智慧(说白了,就是我也不会)...因此,本文倾向于去通俗化的解释这个流程。

如果有小伙伴感兴趣,可以自行针对具体的内容,去学习更为专业的内容呦~

这个公众号!

是我们在从应届生过渡到开发这一路所踩过的坑,以及我们一步步学习的记录,如果感兴趣的朋友可以关注一下,一同加油哦~

个人公众号:IT面试填坑小分队

猜你喜欢

转载自juejin.im/post/5b835af7f265da432515503f