不仅需要背诵,而且特别需要将原理烂熟于胸的学科。很多问题看起来懂了,但是就怕往细里问,一问就发现你懂得没有那么透彻。
为什么网络要分层呀?二层设备、三层设备、四层 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,应用层),你向顺丰下单(第一次请求),顺丰接单(应答),你向手机小伙联系(回应应答),
你将消息放进盒子里(开始封装请求,会话层),
快递员封装一层盒子贴上快递单带回网店(传输层),
到快递点检查是否区域快件(网络层),
将快件交给运输车(链路层),
各个快递转运中心(物理层),
转运输车(链路层),
到达区域分发(网络层),
网点派送(传输层),
快递员方面签收(会话层),
拆开检查(表示层),
收到快递(应用层)。