数据包的旅程 - OSI 模型
原文链接
开放式系统互联通信模型 (Open Systems Interconnect model - OSI model)是一种概念模型,由国际化标准组织提出,描述了使各种计算机互联为网络的标准框架。
OSI 模型分为相互独立的七层,每层实现特定的功能,共同实现计算机之间互相通信互联。以下进行分层讨论
OSI 物理层(Physical Layer)
物理层主要负责实现数据的传输,在传输时数据以由 0 和 1 的形式存在。
物理层主要是在节点之间传输数据的物理载体。例如,网线等。但物理层并不限于必须具有物理形态,其命名是在 20 世纪 70 年代确定的,彼时无线通信还未出现。因此,像 wifi 无线通信协议,虽然不依赖与具体的物理形态,其仍然是物理层的协议。
总的来说,物理层表示实现在节点间进行数据交换功能的任何事物。
在“线”上传输时,数据的真实形态随着介质的不同而不同。在以太网中,数据以电脉冲信号的形式传输;在 wifi 中,数据以无限电波的形式传播;在光缆中,数据以光脉冲信号的形式传播。
除了物理线缆外,中继器(Repeater)和集线器(Hub)也在这一层工作。
中继器通过在链式或环状(daisy chain)连接的网络拓扑中进行信号的重复,使得信号可以突破单个介质可以传输的限制,扩大信号传输范围。这在 wifi 网络中非常常见,通过设置无线接入点(access-points),可以扩大 wifi 信号的覆盖范围。
集线器可以视为一个多端口的中继器。如果有一个连接着四个网络设备的集线器,那么其中任何一个端口发送的信号都会被复制发送至其他三个端口。
OSI 数据链路层(Data Link)
数据链路层(以下简称 Layer 2)负责接入物理层的数据。换句话说,Layer 2 负责将数据写入传输介质,或者从传输介质上读取数据。
我们插入网线的网络接口卡(网卡)(Network Interface Card, NIC)负责实现数据链路层的功能。网卡从网线上接收信号,或者向网线上传输信号。
wifi 网卡也类似,通过接收和传输无线电信号实现数据传输。
Layer 2 将由 1 和 0 构成的数据划分成数据帧(Frames)。
在 Layer 2 , 存在一套被称作 Media Acess Control (MAC) address 的寻址系统。网卡的 MAC 地址是其唯一标识,每块网卡设备在出厂前都被预设置了一个 MAC 地址。事实上,有时 MAC 地址又被称为烧录地址(Burned In Address, BIA)。
除了网卡,交换机也工作在 Layer 2. 交换机主要负责实现一个网络内部的通信。
总的来说,Layer 2 的主要职责是负责在网卡之间传输数据包。或者换句话说,Layer 2 的主要职责是负责节点间传输数据(hop to hop)。
OSI 网络层(Network)
网络层主要负责端到端(end to end)的数据包传递。
网络层主要通过另外一套寻址体系实现其职责,这套寻址体系在逻辑上能够唯一标识接入互联网的每一个设备。这套寻址体系就是熟知的 IP 地址(Internet Protocol Address, IP Address)。
IP 地址之所以被视作是逻辑地址,是因为这套寻址体系并不能作为计算机的永久地址,不像 MAC 地址,IP 地址并未在计算机出厂时就设定。
路由器(Routers)是工作于 Layer 3 的另一个个设备。其主要负责实现网络间的数据通信。路由器可以被视作在两个网络之间创造了一个边界。为了实现于不在当前网络中的其他设备的通信,必须借助于路由器。
OSI Layer 2 和 Layer 3 的关系和对比
理解 Layer 2 和 Layer 3 之间的交互关系和区别对于理解数据在计算机间进行传输非常关键。例如,既然已经有了工作于 L2 的 MAC 寻址体系,为什么还需要 L3 的 IP 寻址体系?
答案是:两种寻址体系分别负责不同的职责。
-
Layer 2 采用 MAC 地址,负责实现数据在相邻网络节点间的传递(hop to hop)。
-
Layer 3 采用 IP 地址,负责实现数据的端到端传递(end to end)。
当一个计算机需要通过网络进行数据传输时,会在数据包的 IP 头(IP header)中封装源端和目标端的 IP 地址,用来标识通信的两端。
进一步的,IP 头和数据会一同被进一步封装,添加 MAC 地址头(MAC address header),MAC 地址头包含了当前节点和下一跳(next hop)目标节点的 MAC 地址信息。
下图进一步阐释了这个过程。
注意到,当经过路由器时,MAC 地址会被解析并替换为下一跳的目标 MAC 地址。源端封装的 IP 头在传输过程中并不会被解析,仅在传输至目标计算机时才会被解析,因此,IP 头用于完成“end to end”的数据传输,而传输过程中的 MAC 头则用于完成“hop to hop”的数据传输。
OSI 传输层(Transport)
传输层主要负责区分网络数据流。
在任何时刻,一个个人计算机上可能同时存在:打开的浏览器、网络音乐播放器、在线聊天工具等多个应用。这些应用都会通过网络接收数据,而所有的数据都会以 0 和 1 的形式到达这个计算机的同一个网卡。
因此,必须有一种机制来区分这些数据是音乐播放数据,或者是聊天数据,或者是浏览器中的网页数据。Layer 4 负责实现这一功能:
Layer 4 也通过一套寻址体系实现这一机制,这就是端口号。
更进一步,有两种方式实现对网络上的数据流进行区分。他们分别被称为 TCP(Transmission Control Protocol) 和 UDP(User Datagram Protocol)协议。
TCP 和 UDP 最大都可以分配 65536(2^16)个端口,通过源端口和目标端口(加上源 IP 地址和目标 IP 地址)可以唯一区分某一个应用的网络数据流。
TCP 和 UDP 分别采用不同的数据传输策略。理解这种两种机制同样非常重要,但这里并不进行讨论。
小结一下,Layer 2 负责 hop to hop 的数据传输,Layer 3 负责 end to end 的数据传输,Layer 4 负责 service to service 的数据传输。
OSI Layer 5, 6, 7
OSI 模型中的会话层(Session)、展现层(Presentation)和应用层(Application)负责将数据呈现给用户前的最后工作。
从纯粹的网络工程角度看,5,6,7 层之间的区别并不显著。事实上,在著名的 TCP/IP 网络模型中,这三层被统一归为一层。
这三层的区别从软件工程的视角去看的话更加显著。这里不加进一步讨论。
许多网络工程师一般将这几层称作 L5-7, L5+或者 L7。
数据的封装和解析
在进一步讨论之前,需要对数据的封装和解析进行一下解释。这两个名词分别表示了在数据发送和接收时,经过各层时所做的工作。
在通过网络进行数据发送时,数据会首先经过各层处理,经过每一层时,各层都会添加为完成数据的准确传达所需的必须要信息。
-
Layer 4 会添加包含源端口和目标端口的 TCP 头。
-
Layer 3 会添加包含源 IP 地址和目标 IP 地址的 IP 头。
-
Layer 2 会添加包含源 MAC 地址和目标 MAC 地址以太网头(Ethernet header)
在接收端,每一层会一次解析数据头的信息,并逐层将数据传递至应用层,下图表示了这一过程:
需要注意的是,上图只是一个实例,随着通信协议的不同,各层添加的包头会不同。例如,UDP 协议会添加 UDP 的包头,Layer 3 可能会添加 IPv6 包头等。
不论如何,这里的重点在于,数据在通过物理介质传输的前后,会依次通过协议栈的各层进行封包或者解包,最终送达应用层。
本文将网络传输中的各项功能分解到 OSI 模型的各层当中。
需要注意的是 OSI 只是一个概念模型,并不是每一个协议都严格的属于某一层当中。