1网络为什么要分层?
因为,是个复杂的程序都要分层。
我们可以这样来理解,想象网络包是一块内存,自己是一个处理网络包的程序,而且这段程序可以跑在电脑上,可以跑在交换机上,也可以跑在路由器上。我们想象自己有很多的网口,从某个网口拿进一个包,用自己的程序处理一下,再从另一个网口发出去。
网络包的格式很复杂,这个程序也很复杂。
复杂的程序都要分层,这是程序设计的要求。
比如,复杂的电商还会分数据库层、缓存层、Compose层、Controller层和接入层,每一层专注做本层的事情。
2程序是如何工作的?
当一个网络包从一个网口经过的时候,我们(我们此刻的身份是程序,嘻嘻~)看到了,首先要看看是不是要请进来然后对它进行处理。有的网口配置了混杂模式,凡事经过的包全都会拿进来。
拿进来之后,就会交给一段程序进行处理,过程我就不再赘述啦,简而言之,就是每一层会有对应的程序对它进行处理,把它这一层封装的头部拿下来进行检查,看看它的MAC地址/IP地址是否对应,若对应则是自己的,否则就要转发出去;或者检查它是TCP还是UDP,然后交给相对应的程序去处理;又或者看看它的端口号对应哪个应用,然后交给这个应用去处理,etc。
发送请求的过程则是进行层层封装,上节课有讲过,这里就不赘述啦。
3揭秘层与层之间的关系
之前有听过一个不恰当的比喻:为什么要分层呀?因为不同的层次之间有不同的沟通方式,这个叫做协议。例如,一家公司也是分“层次”的,分总经理、经理、组长和员工。总经理之间有他们的交流方式,经理之间也有他们的交流方式,组长和员工也是一样的。
但是,所有不能体现出层层封装含义的比喻,都是不恰当的。
总经理握手的时候其他层次的员工无需在场,但在网络世界不是这样的。正确的应该是,总经理之间沟通的时候,把经理装在自己的包包里,经理把组长放在自己的包包里,组长把员工放在自己的包包里,像套娃娃一样。
在TCP三次握手的时候,它每发送一个消息,都会带着IP层和MAC层。因为,TCP每发送一个消息,IP层和MAC层的所有机制都要运行一遍。我们只看到了TCP的三次握手,其实,IP和MAC层为此也忙活好久了。
我们要记住一点:只要是在网络上跑的包,都是完整的,可以有下层无上层,但是绝对不可能有上层无下层。
(忽然明白我把上下层理解反了,这里的下层指的是IP和MAC在下,而TCP在上,应该是这样的~)
所以,对TCP协议来说,三次握手也好,重试也好,只要想发出去包,就要有IP层和MAC层,不然是发不出去的。
我们都听过二层设备和三层设备,二层设备通常处理的是MAC层的东西,三层设备通常处理的是IP层的东西。所谓的二层设备、三层设备,都是这些设备上跑的程序不同而已。一个HTTP协议经过二层设备、三层设备,它们收进去的都是整个网络包,这里面HTTP、TCP、IP、MAC什么都有~而二层设备只是把MAC层摘下来看看到底是丢弃、转发还是自己留着,三层设备是先把MAC头摘下来,然后再把IP头摘下来看看是丢弃、转发还是自己留着。
4小结
理解网络协议的工作模式,有两个小窍门:
1.始终想象自己是一个处理网络包的程序:如何拿到网络包、如何根据规则进行处理、如何发出去。
2.始终牢记一个原则:只要是在网络上跑的包,都是完整的。可以有下层没上层,绝对不可能有上层没下层。(是不是有外层没内层这样更易理解呢~)
通信协议就像没有天桥的双子楼,要从A座的24层到达B座的24层就得先下楼梯再上楼梯,其他协议也是如此。
关于MAC地址和IP地址的理解,MAC地址是局域网寻址,IP地址是网络寻址: