一、什么是网络分层
二、为什么要分层
实现一个复杂的、多功能的程序,为了便于维护与拓展,程序的功能之间应该是解耦和的。因此,复杂的程序都要分层,这是程序设计的要求。
计算机网络是个非常复杂的系统,相互通信的两个计算机必须高度协调工作,但是这种协调是很复杂的;分层可以将庞大复杂的问题,转化成若干个较小的局部问题,这些局部的较小的问题就比较易于研究和处理。
就像MVC架构中将项目分成了Dao层、Service层、Controller层,每个层单独完成一份任务,专注一份任务,这就是分层的设计思路,主要还是贯彻了程序设计中解耦的思想
也可以理解为,分层可以屏蔽掉下层的实现,体现了封装的思想,有了分层之后,数据在网络中的传输我们可以抽象成层与层之间的直接传输,而不用在乎下层是怎么具体实现的。
三、层与层之间关系的理解
但是我们要知道,实际上数据的传输并不是层与层之间直接传输的,所有的数据都要经过一层层的封装以及一层层的解封才能完成传输
以客户端发送一个HTTP请求为例,我们都知道HTTP是工作在应用层的,那么HTTP报文就是客户端的应用层直接发送给服务端的应用层吗?其实不是的,首先,应用层会在要发送的HTTP正文的头部加一个HTTP头,然后交给下层传输层处理,如果传输层使用TCP协议,那么就会在当前报文的头部在加一个TCP头,包含源端口号和目的端口号等,再交给下层处理,同样,网络层再在头部加一个IP头,包含源和目的IP地址;数据链路层再在头部加一个MAC头,包含源和目的MAC地址,最后交给物理层传输,服务端收到报文后,每一层会摘下属于自己的头部,并根据头部内容决定是丢弃、转发还是自己留着。
所以层与层之间的关系是一个层层封装的关系,所有上层设备的工作都需要下层设备的参与,所以网络分层模型我们也可以把它看做一个中间没有天桥的双子楼,要从一栋楼的某一层到另一栋楼的某一层,必须下到地面上,没有捷径。也可以理解为一个文件从一个单位送到另一个单位,需要不同级别的人进行层层批注,收到的人只能读自己级别的批注并决定这份文件怎么处置。
所以分层其实是报文运输过程中的不同阶段,每个阶段只关心自己负责的部分,并根据自己的规则决定怎样进入下个阶段,至于下个阶段怎么处理那就是下一层的事情了。
参考文章:
《极客时间-趣谈网络协议》