基础知识

第2讲 | 网络分层的真实含义是什么?

2018-12-13  本文已影响24人  hedgehog1112

不仅需要背诵,而且特别需要将原理烂熟于胸的学科。很多问题看起来懂了,但是就怕往细里问,一问就发现你懂得没有那么透彻。

为什么网络要分层呀?二层设备、三层设备、四层 LB 和七层 LB 中层,不同的层次之间有不同的沟通方式,这个叫作协议

第一个问题:请问经理握手时,员工在干什么? TCP 建立连接的三次握手协议时,IP和 MAC 层对应都有什么操作

除了上面这个不恰当的比喻,教科书还会列出每个层次所包含的协议,然后开始逐层地去讲这些协议。但是这些协议之间的关系呢?却很少有教科书会讲。

第三层:IP 协议里面包含目标地址源地址。第三层里路由协议, A原始地址)->B->C(中转站)->D(目标地址)通过路由转发的。

第二个问题:A 知道自己的下一个中转站是 B,那从 A 发出来的包,应该把 B 的 IP 地址放在哪里呢?如果放在 IP 协议中的目标地址,那包到了中转站,怎么知道最终的目的地址是 D 呢?

二层设备处理的通常是 MAC 层的东西。发送一个 HTTP 的包,在第七层工作,那是不是不需要经过二层设备?或者即便经过了,二层设备也不处理呢?或者换一种问法,二层设备处理的包里,有没有 HTTP 层的内容呢?

综合的问题。电脑通过 SSH 登录到公有云主机里面,都需要经历哪些过程?或者说你打开一个电商网站,都需要经历哪些过程?说得越详细越好。

网络为什么要分层?

复杂的程序都要分层。想象网络包就是一段 Buffer,或者一块内存,是有格式的。同时,想象自己是一个处理网络包的程序,而且这个程序可以跑在电脑上,可以跑在服务器上,可以跑在交换机上,也可以跑在路由器上。你想象自己有很多的网口,从某个口拿进一个网络包来,用自己的程序处理一下,再从另一个网口发送出去。

复杂的程序都要分层,这是程序设计的要求。比如,复杂的电商还会分数据库层、缓存层、Compose 层、Controller 层和接入层,每一层专注做本层的事情。

当一个网络包从一个网口经过的时候,你看到了,首先先看看要不要请进来,处理一把。有的网口配置了混杂模式经过的全部拿进来。

process_layer2(buffer):从 Buffer 中,摘掉二层的头,假设这个包的 MAC 地址和你的相符,那说明就是发给你的,调用process_layer3(buffer):摘掉三层的头,(如不是,转发出去)如果 IP 地址是自己的,那就是发给自己的。根据 IP 头里面的标示,拿掉三层的头,到底是调用process_tcp(buffer) 还是process_udp(buffer) 呢?

假设是 TCP 的,调用process_tcp(buffer)。查看四层的头,如果是发起或应答发送回复包正常数据包交给上层了。在四层的头里面有端口号,不同的应用监听不同的端口号。如果发现浏览器应用在监听这个端口,发给浏览器

浏览器解析 HTML,显示出页面来。电脑的主人看到页面很开心,就点了鼠标。点击鼠标的动作被浏览器捕获。浏览器知道,又要发起另一个 HTTP 请求了,于是使用端口号,将请求发给了你。

send_tcp(buffer)。Buffer 里面就是 HTTP 请求的内容。加 TCP 的头,记录源端口号。浏览器会给你目的端口号,一般为 80 端口。

send_layer3(buffer)。Buffer 里面已经有了 HTTP 的头和内容,以及 TCP 的头。加IP 的头,记录下源 IP 的地址和目标 IP 的地址。

send_layer2(buffer)。Buffer 里面已经有了 HTTP 的头和内容、TCP 的头,以及 IP 的头。这个函数里面要加一下 MAC 的头,记录下源 MAC 地址,得到的就是本机器的 MAC 地址和目标的 MAC 地址。知道就直接加上;不知道就要通过一定的协议处理过程,找到 MAC 地址。反正要填一个,不能空着。

只要 Buffer内容完整,从网口发出去了。

所有不能表示出层层封装含义的比喻,都是不恰当的。网络世界不是这样的。正确的应该是,总经理之间沟通的时候,经理将总经理放在自己兜里,然后组长把经理放自己兜里,员工把组长放自己兜里,像套娃娃一样。那员工直接沟通,不带上总经理,就不恰当了。

网络世界,应该是总经理说话,经理补充两句,组长补充两句,员工再补充两句。

当然是 TCP 发送每一个消息,都会带着 IP 层和 MAC 层了。因为,TCP 每发送一个消息,IP 层和 MAC 层的所有机制都要运行一遍。 TCP 三次握手了,其实IP 层和 MAC 层为此也忙活好久了。

只要是在网络上跑的包,都是完整的。可以有下层没上层,绝对不可能有上层没下层。

TCP 协议来说,三次握手也好,重试也好,只要想发出去包,就要有 IP 层和 MAC 层,不然是发不出去的。

所谓的二层设备、三层设备,都是这些设备上跑的程序不同而已。一个 HTTP 协议的包经过一个二层设备,二层设备收进去的是整个网络包。这里面 HTTP、TCP、 IP、 MAC 都有。什么叫二层设备呀,就是只把 MAC 头摘下来,看看到底是丢弃、转发,还是自己留着。那什么叫三层设备呢?就是把 MAC 头摘下来之后,再把 IP 头摘下来,看看到底是丢弃、转发,还是自己留着。

记住秘诀:始终想象自己是一个处理网络包的程序:如何拿到网络包,根据规则如何发出去;

评论1

很像发快递的过程(http,应用层),你向顺丰下单(第一次请求),顺丰接单(应答),你向手机小伙联系(回应应答),

你将消息放进盒子里(开始封装请求,会话层),

快递员封装一层盒子贴上快递单带回网店(传输层),

到快递点检查是否区域快件(网络层),

将快件交给运输车(链路层),

各个快递转运中心(物理层),

转运输车(链路层),

到达区域分发(网络层),

网点派送(传输层),

快递员方面签收(会话层),

拆开检查(表示层),

收到快递(应用层)。

上一篇 下一篇

猜你喜欢

热点阅读