Fork me on GitHub

OSI 模型与 TCP-IP 协议详解

OSI 参考模型

在计算机通信诞生之初,标准化和系统化并未得到足够的重视,各大厂商竞相研发各自的通信技术。随着异构机型之间通信的需求不断增加,通信技术的标准化也随之展开。于是,ISO(International Organization for Standard)制定了一个国际标准 OSI(Open System Interconnection),即广为人知的 OSI 参考模型,作为标准化通信技术的设计准则。

OSI 参考模型将通信协议中必要的功能分层了 7 层。每个分层接收下一层提供的特定服务,并负责为上一层提供特定的服务。这些功能上相对独立的分层可以构造一个扩展性和灵活性都较强的系统。

下表所示为 OSI 参考模型及其各个分层的职责。

  • 应用层:主要负责为应用程序提供服务并规定应用程序中通信相关的细节。在该层实现的协议有:文件传输、电子邮件、远程登录等协议。

  • 表示层:主要负责数据格式的转换。将应用处理的信息转换为适合网络传输的格式,或将来自下一层的数据转换为上层能够处理的格式。

  • 会话层:主要负责建立和断开通信连接(数据流动的逻辑通路),以及数据的分割等数据传输相关的管理。

  • 传输层:主要负责进行可靠传输。只在通信双方节点上进行处理,而无需在路由器上处理。

  • 网络层:主要负责寻址和路由选择,从而将数据传输到目标地址。目标地址可以是多个网络通过路由器连接而成的某个地址。

  • 数据链路层:主要负责物理层面上互连的、节点之间的通信传输。将 0、1 序列划分为具有意义的数据帧传送给对端(数据帧的生成与接收)。如与 1 个以太网相连的 2 个节点之间的通信。

  • 物理层:主要负责 0、1 比特流(0、1 序列)与电压的高低、光的闪灭之间的互换。

OSI 参考模型通信示例

下面举例说明 OSI 参考模型的功能。假设使用主机 A 的用户向使用主机 B 的用户发送一封邮件。

应用层

用户 A 在主机 A 上新建一封邮件,指定收件人为 B,并输入邮件内容为 “早上好”。用户确认发送时,开始进入应用层协议的处理。该协议在传送数据的前端附加一个首部信息。主机 B 在收到主机 A 发送至的数据后,分析其数据首部与数据正文,并将邮件存入本地。

表示层

表示层会将数据从“某个计算机特定的数据格式”转换为“网络通用的标准数据格式”后再发送出去。接收端主机收到数据以后将这些网络标准格式的数据恢复成“该计算机特有的数据格式”,然后在进行相应的处理。

此例中,“早上好”这段文字根据编码格式被转换成了“统一的网络数据格式”。由于文字的编码格式非常多,如:UTF-8、UTF-16、Unicode 等,如果未能按照特定格式编码,那么在接收端收到的邮件可能就是乱码。

会话层

假如用户 A 新建了 5 封邮件准备发送给用户 B。这 5 封邮件的发送顺序可以有多种:

  • 每发一封邮件时建立一次连接,随后断开连接
  • 一旦建立连接后,将 5 封邮件连续发送给对方
  • 同时建立 5 个连接,将 5 封邮件同时发送给对方

会话层的主要责任就是决定采用何种连接方式。

类似应用层、表示层,会话层在其收到的数据前端附加首部之后再转发给下一层。这些首部中 记录着数据传送顺序的信息

传输层

会话层只对何时建立连接、何时发送数据等问题进行管理,并不具备实际传输数据的功能。真正负责在网络上传输数据的是会话层以下的分层。

主机 A 确保与主机 B 之间的通信并准备发送数据。该过程称为“建立连接”。连接建立后即可使主机 A 发送的邮件到达主机 B。传输结束之后,有必要将连接断开。

上述两个主机之间创建逻辑上的通信连接是传输层的主要作用。此外,传输层为确保数据到达目标地址,会在通信两端的主机之间进行确认,如果数据没有到达,则负责进行重发。

示例中,如果主机 A 将“早上好”发送给主机 B,由于网络异常等原因导致只有部分数据到达目标地址。假设主机 B 只收到“早上”这部分数据,那么它会将没有收到“早上”之后那部分数据的事实告诉主机 A,主机 A 得知后会将“好”重新发送给主机 B,并再次确认对端是否收到。

因此,保证数据传输的可靠性是传输层的一个重要作用。为了确保可靠性,传输层也会对所要传输的数据附加首部以识别这一分层的数据。然而,实际上将数据传输给对端的处理是由网络层完成的。

网络层

网络层的作用是在网络与网络互连的环境中,将数据从发送端主机发送到接收端主机。如图所示,两端主机之间虽然有众多数据链路,但是能够将数据从主机 A 发送到主机 B 也都是网络层的功劳。

网络层的数据发送通过目标地址选择对应的计算机,因此目标地址是网络中唯一指定的序号,类似于电话号码。

数据链路层、物理层

通信传输本质上是通过物理的传输介质实现的。数据链路层的作用就是在这些通过介质互连的设备之间进行数据处理。

物理层则将数据的 0、1 转换为电压和脉冲光传输给物理的传输介质,而相互直连的设备之间使用地址实现传输。这种地址被称为 MAC 地址。采用 MAC 地址,目的是为了识别连接同一传输介质上的设备。物理层会将包含 MAC 地址的信息的首部附加到同网络层转发过来的数据上,并将其发送到网络中。

网络层与数据链路层都是基于目标地址将数据发送给接收端,其区别在于:

  • 网络层负责将整个数据发送给最终的目标地址
  • 数据链路层只负责发送一个分段内的数据

详见上图。

TCP/IP 协议分层模型

TCP/IP 的含义

从字面上看,有人可能会认为 TCP/IP 是指 TCP 与 IP 两种协议。虽然实际中的确有这两种协议,但是在很多情况下,它泛指 IP、ICMP、TCP、UDP、TELNET、FTP、HTTP 等协议群,所以有时也称 TCP/IP 为 网际协议族

数据包

包、帧、数据报、段、消息 等五个术语都用来表述数据的单位,其区别在于:

  • 包:全能性术语
  • 帧:表示数据链路层中包的单位
  • 数据报:表示 IP 和 UDP 等网络层以上分层中包的单位
  • 段:表示 TCP 数据流中的信息
  • 消息:表示应用层中数据的单位

网络中传输的数据包由两部分组成:一部分是协议所要用到的首部,另一部分是上层传来的数据。在数据包的首部,明确标明了协议应该如何读取数据。通过解析首部,能够了解该协议必要的信息以及要处理的内容。

TCP/IP 与 OSI 参考模型

关于 TCP/IP 与 OSI 参考模型的关系,我们可以认为 TCP/IP 是对 OSI 参考模型的一种具体实现。

  • 硬件(物理层)

    • TCP/IP 的最底层是负责数据传输的硬件,如以太网或电话线路等物理层的设备。物理层所使用的传输媒介不同(如使用网线或无线),网络的带宽、可靠性、安全性、延迟等都会有所不同。
  • 网络接口层(数据链路层)

    • 网络接口层利用以太网中的数据链路层进行通信,因此属于接口层,可认为是让 NIC(网卡)正常工作的驱动程序。
  • 互联网层(网络层)

    • 互联网层使用 IP 协议,对应 OSI 模型中的第 3 层网络层。IP 协议基于 IP 地址转发分组数据包。
    • TCP/IP 分层中的互联网层与传输层的功能通常由操作系统实现。尤其是路由器,它必须实现通过互联网曾转发分组数据包的功能。连接互联网的所有主机和路由器都必须实现 IP 的功能。

为什么要分组?
首先需要明确一个事实:一台计算机在收发数据时会独占其所在的整条通信线路。如果一条线路上连接了多台计算机,当计算机相互之间进行数据传输时,则需要等待线路中没有其他计算机占用时才能进行数据传输。如果某台计算机占用线路之后传输大量数据,则其他计算机始终保持等待状态。极端情况下根本无法进行通信。
采用分组(交换)技术,数据会被分成更小的单元,所有的计算机就可以并发收发数据,从而提高了通信线路的利用率。

IP
IP 是跨越网络传送数据包,使整个互联网都能收到数据的协议,这个过程中使用 IP 地址作为主机的标识。
IP 还隐含着数据链路的功能。通过 IP,相互通信的主机之间无论经过怎样的底层数据链路都能够实现通信。
IP 是分组交换的一种协议,但其并不具备重发机制。即使分组数据包未能达到对端主机也不会重发,属于非可靠传输协议。

ICMP
IP 数据包在发送途中一旦出现异常导致无法到达对端目标地址时,需要向发送端发送一个异常通知。ICMP 就是为这一功能而定制的,常用于 诊断网络的健康状况

ARP
从分组数据包的 IP 地址中解析出物理地址(MAC 地址)的一种协议。

  • 传输层
    • 传输层最主要的功能就是能够让应用程序之间实现通信。计算机内部,通常同时运行着多个程序。为了识
    • 别哪些程序之间在进行通信,使用 端口号 进行区分。

TCP
TCP 是一种面向有连接的传输层协议。它可以保证两端通信主机之间的通信可达。TCP 能够正确处理在传输过程中丢包、传输顺序乱掉等异常情况。此外,TCP 还能够有效利用带宽,缓解网络拥堵。
为了建立和断开连接,TCP 需要进行 3 次握手,4 次挥手,从而会导致网络流量的浪费。

UDP
UDP 是一种面向无连接的传输层协议。UDP 不会关注对端是否真的收到了传送过去的数据,如果需要检查对端是否收到分组数据包,或者对端是否连接到网络,则需要在应用程序中实现。
UDP 常用语分组数据较少或多播、广播通信以及视频通信等多媒体领域。

  • 应用层(会话层以上分层)
    • TCP/IP 协议分层模型将 OSI 参考模型中的会话层、表示层和应用层的功能都集中到了应用程序中实现。这些功能有时由一个单一的程序实现,有时也可能会由多个程序实现。

TCP/IP 协议分层模型通信示例

这里继续以上述电子邮件收发的示例来介绍 TCP/IP 协议分层模型的通信过程。

邮件收发过程可分为个主要步骤:

  • 发送数据包(发送端)
  • 接收数据包(接收端)

发送数据包

应用程序处理

应用程序在发送邮件那一刻建立 TCP 连接,从而利用该 TCP 连接发送数据。该过程首先将应用层发来的数据发送至下一层的 TCP,再做实际的转发处理。

TCP 模块处理

TCP 根据应用程序的指示,负责建立连接、发送数据、断开连接。TCP 会在应用层数据前端附加一个 TCP 首部,其中包括:源端口号目标端口号(用以识别发送主机和接收主机上的应用)、序号(用以标识发送包中哪部分是数据)、校验和(用以判断数据是否被损坏)。

IP 模块处理

IP 将 TCP 传来的 TCP 首部和 TCP 数据合起来作为自己的数据,并在数据前端附加一个 IP 首部,其中包括:接收端 IP 地址和发送端 IP 地址。

IP 包生成后,根据路由控制表决定接收此 IP 包的路由器或主机。随后,IP 包将被发送给连接到这些路由器或主机网络接口的驱动程序,以实现真正发送数据。

如果尚且不知道接收端的 MAC 地址,可利用 ARP 查找。只要知道了对端的 MAC 地址,就可将 MAC 地址和 IP 地址交给以太网的驱动程序,实现数据传输。

网络接口(以太网驱动)处理

以太网驱动会将 IP 传来的 IP 包的前端附加上以太网首部并进行发送处理。以太网首部包含:接收端 MAC 地址、发送端 MAC 地址、标志以太网类型的以太网数据的协议。由此产生的以太网数据包将被发送至物理层传输给接收端。

接收数据包

数据包的接收流程是发送流程的逆序过程。

网络接口(以太网驱动)处理

主机收到以太网包后,先从以太网包首部找到 MAC 地址判断是否为发给自己的包。如果不是则丢弃。

如果确认是发给自己的包,则查找以太网包首部中的类型域从而确定以太网协议所传送过来的数据类型。示例中数据的协议类型是 IP,因此将数据传送给处理 IP 的子程序(如果是 ARP,则把数据传给处理 ARP 的子程序)。如果无法识别协议类型,则丢弃数据。

IP 模块处理

IP 模块收到 IP 包首部以数据部分后,也做类似处理。如果判断首部中的 IP 地址与自己的 IP 地址匹配,则接收数据并从中查找上一层的协议。如果上一层协议为 TCP,则传给 TCP 处理;如果上一层协议为 UDP,则传给 UDP 处理;对于路由器,接收端 IP 地址往往不是自己的 IP 地址,此时会根据路由控制表,查询应送达的主机或路由器以后再转发数据

TCP 模块处理

TCP 模块会先计算校验和以确认数据是否被破坏。然后检查是否按照序号接收数据。最后检查端口号,确定具体的应用程序。

数据接收完毕后,接收端则发送一个“确认回执”给发送端。如果回执消息未能达到发送端,发送端会认为接收端没有接收到数据而一直重复发送。

数据被完整接收后,会传给由端口号识别的应用程序。

应用程序处理

接收端应用程序通过解析数据可最终获取到邮件的具体内容。

参考

  1. OSI 模型-维基百科
  2. 《图解 TCP/IP》
  3. 《TCP/IP 详解》
欣赏此文?求鼓励,求支持!