本文原文来源于如下文章,我对一些有疑问章节做了删除和补充。
https://everfind.github.io/courses/network/osi-model.html
OSI 模型(Open System Interconnection Model)全称为开放系统互连模型,是一种由七个层次组成的计算机网络通信模型。
以下是从低层到高层逐一介绍:
物理层
物理层负责传输 0/1 比特流。
这一层负责处理两个网络节点之间的物理媒介,比如网线、WIFI。之所以命名为物理层,是因为这一层在上世纪 70 年代就已经被命名,那时候无线网络还未产生。
在物理层,数据的实际形式与传输的物理媒介息息相关。比如以太网,比特流是通过电脉冲传输的,而对于 WIFI 来说,比特流是通过无线电波传输的,对于光线来说,比特流是通过光脉冲传输的。
中继器和集线器也工作在物理层。
中继器将信号从一个媒介传输到另一个媒介,从而扩大信号的传输范围。比如大型 WIFI 网络的部署中,就需要中继器来扩大信号范围。
集线器是一个多端口中继器。如果一个集线器上连接有四个设备,一个设备上发出的数据将会被发送到另外三个设备上。
数据链路层
数据链路层负责与物理层交互,换句话说,数据链路层负责将 0/1 比特流放进传输媒介,和从传输媒介中读取 0/1 比特流。
网卡(Network Interface Card,NIC)就是典型的数据链路层设备。不管是直接插网线的网卡还是 WIFI 网卡,都是从传输媒介中读写 0/1 比特流,区别仅仅是操作媒介不同。
数据链路层会将 0/1 打包成一个个的数据块,这些块被称为帧(Frame)。
在数据链路层中,通过 MAC 地址(Media Access Control address)来实现寻址。MAC 地址由设备厂商预先烧录在硬件上的地址,唯一标识这个设备。
交换机也工作在数据链路层。交换机主要负责网络间的通信。关于交换机的说明还可以阅读这篇 https://sspai.com/post/64302
数据链路层的功能就是负责将数据包从一个网卡传输到另一个网卡。或者说数据链路层负责逐跳的传输数据。
网络层
网络层负责端到端的传输数据包。
网络层通过 IP 地址(Internet Protocol address)来确定网络中每一个节点的地址。IP 地址是个逻辑地址,不与具体的设备永久绑定,这一点与 MAC 地址不同。
路由器工作在网络层,它的主要职责是负责网络间的通信,是网络的边界。如果要与不在当前网络中的设备进行通信,则必须要使用路由器。
第二层和第三层的区别
搞清楚第二层和第三层之间的交互和区别对于理解数据如何在网络节点之间传输非常重要。
比如,既然在数据链路层已经有了 MAC 地址,为什么还要在网络层中使用 IP 地址呢?
其实,网络层和数据链路层的分工不同:
- 数据链路层使用 MAC 地址来逐跳的传输数据。
- 网络层使用 IP 地址来实现端到端的数据传输。
当网络中的一个节点要发送数据的时候,会将源节点 IP 和目标节点 IP 都封装在数据包的 IP 头中。
IP 头和数据将会被进一步的封装在 MAC 地址头中,这个地址头同时还封装了当前跳和下一跳的 MAC 地址。
注意,在每个路由器之间,MAC 地址头都被解开,然后在发往下一跳的时候重新封装。IP 头只会在最终目的节点被解开。也就是说 IP 负责端到端的数据传输,而 MAC 负责逐跳传输数据。
传输层
传输层负责处理网络中的数据流。
在已经连接到网络中的计算机上,同一时间可能同时运行着浏览器、音乐播放器、即时通讯系统比如微信等。每一个应用都是从网络上读写数据。
在网络层中,有两种协议,TCP 协议(Transmission Control Protocol)和 UDP 协议(User Datagram Protocol)。
TCP 和 UDP 都有 65536 个端口可供使用。每个应用数据流的 IP 报文中都含有源节点和目标节点的端口号。
总而言之,如果数据链路层负责逐跳传输数据,网络层负责端到端传输数据,那么传输层则是负责服务到服务的传输数据。
五、六、七层(会话层、表示层和应用层)
会话层、表示层和应用层负责对网络上传输过来的数据进行最后的处理。
站在网络传输的角度上来看,第五、六、七层已经不是十分重要,在 TCP/IP 模型
中更是将这三层合并成了一层。
整个OSI模型越是高层越靠近用户,越是底层就越接近硬件。
封装与解封装
在网络中,数据会被逐层处理。在发送端,数据在被从上到下逐层处理的过程中,每一层都会添加额外的信息来实现这一层的功能,知道最终这些数据被转换成 0/1 比特流发送出去。
比如:
- 传输层会向数据包中添加 TCP 头,里面包含源节点和目标节点的端口。
- 网络层会向数据包中添加 IP 头,里面包含源节点和目标节点的 IP 地址。
- 数据链路层会向数据包中添加以太网头,里面包含源节点和目标节点的 MAC 地址。
当数据到达接收端后,每一层的都会解封装数据包,移除这一层的头,然后将剩余的数据包往上层传递,直到应用层。