开放式系统互联模型(Open System Interconnection Model,简称为 OSI 模型),描述了互联网的功能组成。

OSI 模型共分七层,如下图,每一层都实现了专有的功能,七层组合在一起,便实现了网络通信。

我们现在来看每一层的具体功能。

第一层:物理层

物理层负责传输 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 地址由设备厂商预先烧录在硬件上的地址,唯一标识这个设备。

网卡与交换机

除了网卡,交换机也工作在数据链路层。交换机主要负责网络间的通信。

总而言之,数据链路层的功能就是负责将数据包从一个网卡传输到另一个网卡。或者说数据链路层负责逐跳的传输数据。

第三层:网络层

网络层负责端到端的传输数据包。

网络层通过 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 和 UDP 使用不同的机制来传输数据,本文不做详细讨论。

总而言之,如果数据链路层负责逐跳传输数据,网络层负责端到端传输数据,那么传输层则是负责服务到服务的传输数据。

第五、六、七层

会话层、表示层和应用层负责对网络上传输过来的数据进行最后的处理。

站在网络传输的角度上来看,第五、六、七层已经不是十分重要,在 TCP/IP 模型open in new window 中更是将这三层合并成了一层。

本文不对这三层做特别说明。

封装与解封装

最后,我们要说一下在数据传输过程中的封装与解封装。

在网络中,数据会被逐层处理。在发送端,数据在被从上到下逐层处理的过程中,每一层都会添加额外的信息来实现这一层的功能,知道最终这些数据被转换成 0/1 比特流发送出去。

比如:

  • 传输层会向数据包中添加 TCP 头,里面包含源节点和目标节点的端口。
  • 网络层会向数据包中添加 IP 头,里面包含源节点和目标节点的 IP 地址。
  • 数据链路层会向数据包中添加以太网头,里面包含源节点和目标节点的 MAC 地址。

当数据到达接收端后,每一层的都会解封装数据包,移除这一层的头,然后将剩余的数据包往上层传递,直到应用层。

下图展示了数据包封装与解封装的过程。

封装与解封装

注意,上图仅仅是一个示例,具体每一层添加什么样的头会根据该层的通信协议确定。

总而言之,数据在传输过程中,先在发送端从上到下进行封装,每一层都会加上特定的头,直到最终数据被以 0/1 比特流的形式写入传输媒介中传输。数据到达接收端之后,会从下到上逐层去除之前加上的头,最终数据被传递给应用层使用。

参考资料

关注微信公众号,获取最新推送~