咱们老是在说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的反向解析的过程。3d
那若是不在同一网段呢?cdn
让咱们先看一张图:
是否是以为走错片场了?没走错、没走错,接下来就让我,用这张图,解释数据包(英雄)将如何从我方水晶(个人计算机)到敌方水晶(目标计算机)。
假设咱们是随机英雄,游戏加载完毕,英雄被建立出来(从应用层到网络层,层层包装),来到了我方泉水(链路层)。
游戏准备开始,呦,咱们的英雄是个瑞雯。假设咱们的瑞雯,出生就带着一个目标:从上路攻入敌方水晶。
可是咱们的瑞雯,只知道目标,其余啥都不知道!敌方上路怎么走?我是新手,不知道啊。泉水商人是个战争贩子,见多识广,去问问他吧!
泉水商人看到瑞雯的目标,给瑞雯指了条明路:你去找我方上路高地塔。
我方上路高地塔,看到了瑞雯的目标说话了:不要慌,虽然我不知道敌方上路到水晶怎么走,可是我知道我方上路门牙怎么走。你从我这走,去它那准没错!
瑞雯拖着符文之刃,来到了我方上路门牙。我方上路门牙一看目标,瑞雯的目的是敌方水晶!我方上路门牙,轻蔑一笑:小姑娘,我劝你不要去找死。
瑞雯冷哼一声:老娘,心悦会员666!此话一出,天也晴了,雨也停了,网络仿佛也很行了。
就这样咱们的瑞雯,左手人民币,右手大帽子,一路杀到敌方水晶,顺利完成目标。
解析一些上述加粗的内容:
名词 | 解释 |
---|---|
瑞雯: | 这个就很少说了,咱们的数据包。 |
目标: | 也就是咱们的目标IP。 |
泉水商人: | 能够理解默认网关,当咱们的数据包的目标IP不是源IP的同一网段时,这个包将交给默认网关,由它去处理。至于它怎么处理,下文咱们会说起。 |
上路高地塔、上路门牙: | 他们两者能够理解为数据包在网络传输过程当中若是跳转的路由器。 |
说实话,用联盟的例子,属实可能有些不是很准确,不过大的框架用此仍是能够解释清楚的。接下来咱们正经的来聊一聊这个过程~
其实这个过程彻底能够经过一个图解释:
数据包离开被发出前,须要先计算一下目标IP是否和本身是同一网段,这里就俩种可能:是与否。 若是是同一网络,直接经过ARP协议(使用“吼”的方式,等待对方应答),获得目标所在的mac,封装到数据包中,发过去便可。 若是不是同一网络,那么就须要先经过ARP协议获取到静态网关的mac地址(一样使用“吼的方式”),将包发给它,至于静态网关怎么找到目标地址,那就是静态网关的事了。
静态网关:静态网关是在操做系统启动时,经过DHCP协议配置好的,默认网关的IP地址是192.168.1.1。
静态网关就是网关,网关是它所属的这个局域网对外进出的关键。
而路由器则负责链接多个网关,用于转发数据包到某一个网关上,因此说路由器是管理网关的关键。
所以把网关比作路由器可能不是很恰当。两者并不是是同一个东西:若是把整个计算机网络世界比作古代世界的话。那么网关就像一个关卡,路由器则是一座城市。城池能够掌管多个关卡。关卡能够掌管多条官道。
若是咱们想从许昌到长安,那么这条路上,虎牢关和函谷关就能够称之为网关,洛阳器就是路由器。许昌和虎牢关能够看作同一个局域网。
许昌的人想从这个局域网出去,必需要从虎牢关(默认网关)出发,而想要到长安城,虎牢关这个网关知道要转发给洛阳城才行;洛阳做为路由器,经过自身的路由表,找到了长安的所在IP,须要转发给函谷关这个网关。
所以数据包就到达了函谷关所管辖的局域网之中,最终送达到了长安。
咱们的网络世界由路由器链接了一个有一个局域网,而网关则负责本身所管辖的一亩三分地(局域网)。
静态网关拿到数据包,继续根据目标IP计算该怎么转发这个包。好比静态网关知道这个目标IP应该有路由器4是转发。那么它会从新封装mac地址,将包发给路由器4。那么这里可能有引出来一个疑问:网络这么大,路由器们是怎么知道某个IP是发给谁的呢?这里就涉及到路由表以及路由协议了。
经过这张表,路由器知道进来的数据包该从那个网口(网关)出去。而这张表则是由路由协议生成的。
路由能够分为:静态路由和动态路由。静态路由能够理解为咱们本身去设置路由结构,从哪跳到哪,可是这个只适合于网络状况比较简单的问题。
因此,这部分咱们主要聊一聊动态路由。动态路由能够根据路由协议算法生成动态路由表,随网络运行情况的变化而变...
咱们的互联网世界是一个复杂且多变的环境,若是抽象出来,能够当作一个图的结构。那么如今的问题对于路由算法来讲就变成了,从图中找到目标的最短路径。
这里常见的有俩种:距离矢量路由算法、链路状态路由算法。
基于 Bellman-Ford 算法的。就是咱们数据结构中。求图的最短路径的算法。算法的基本思路是,每一个路由器都保存一个路由表,每一行包含两部分信息,一个是要到目标路由器,从那条线出去 ,另外一个是到目标路由器的距离。
由于篇幅缘由,这部份内容暂时不作展开,若是有小伙伴感兴趣,能够自行去了解呦。
基于 Dijkstra 算法,一样是咱们数据结构中的算法。 每一个启动的路由器,都会先找到并计算出于本身临近路由器的距离,而后将这个表广播发送给整个网络。最终每一个路由器都会有整个路由结构。
由于篇幅缘由,这部份内容暂时不作展开,若是有小伙伴感兴趣,能够自行去了解呦。
当咱们的路由器拥有了路由表,那么路由器就仿佛拥有了全世界,所以对于此时的计算机网络的世界来讲,任何一个都路由到的IP地址,都是能够被访问到的,无非是须要跳转几回个路由器而已。
当咱们的数据包,每到达一个路由器时,路由器都会检查这个包的目标IP,而后同本身的路由表内容进行配置,看一看应该发送到那个网关上。
网关接到数据包,若是发现不是本身这个局域网的,那么一样它也会转发给可以结构的路由器,循环往复这个过程,直至到达目的地。
一个数据离开网卡,会有俩个出路,一个是广播给同一个网段的某台计算机;另外一个出路是发送给配置好的默认网关。而这个网关则会发送对应的路由器,路由器经过本身的路由表肯定下一条的网关。下一个网关,会查看这个数据包是否是本身局域网内的IP,若是不是则发送给可以转发出去的路由器。周而复始的执行这个过程。直到合适的网关接到数据,广播给本身局域网内容的计算机。
其实本篇内容,偏向于流程的梳理,由于计算机网络的世界自己就是以及极为庞大且复杂的学问,三言俩雨根本没法解释清楚其中的复杂与智慧(说白了,就是我也不会)...所以,本文倾向于去通俗化的解释这个流程。
若是有小伙伴感兴趣,能够自行针对具体的内容,去学习更为专业的内容呦~
是咱们在从应届生过渡到开发这一路所踩过的坑,以及咱们一步步学习的记录,若是感兴趣的朋友能够关注一下,一同加油哦~