计算机网络:TCP/IP 协议栈概述

参考模型

在网络刚刚被搞出来的年代,通常只有同一个厂家生产的设备才能彼此通信,不同的厂家的设备不能兼容。这是因为没有统一的标准去要求不同的厂家按照相同的方式进行通信,所以不同的厂家都闭门造车。为了解决这个问题,后来就产生出参考模型的概念。
参考模型是描述如何完成通信的概念模型,它指出了完成高效通信所需要的全部步骤,并将这些步骤划分为称之为“层”的逻辑组。分层最大的优点是为上层隐藏下层的细节,即对于开发者来说,如果他们要开发或实现某一层的协议,则他们只需要考虑这一层的功能即可。其它层都无需考虑,因为其它层的功能有其它层的协议来完成,上层只需要调用下层的接口即可。参考模型的优点如下:

  1. 将网络通信过程划分为更小、更简单的组件,使得组件的开发、设计和排错更为方便;
  2. 通过标准化网络组件,让不同的厂商能够协作开发;
  3. 定义了模型每层执行的功能,从而鼓励了行业标准化;
  4. 让不同类型的网络硬件和软件能够彼此通信;
  5. 避免让对一层的修改影响其它层,从而避免妨碍开发工作。

协议

计算机网络中的数据交换必须遵守事先约定好的规则,这些规则明确规定了所交换的数据的格式以及有关的同步问题,网络协议 (network protocol)是为进行网络中的数据交换而建立的规则、标准或约定。网络协议有 3 个要素:

  1. 语法:数据与控制信息的结构或格式;
  2. 语义:需要发出何种控制信息,完成何种动作以及做出何种响应;
  3. 同步:事件实现顺序的详细说明。

OSI 模型

OSI 模型旨在以协议的形式帮助厂商生产兼容的网络设备和软件,让不同厂商的网络能够协同工作。同时对于用户而言,OSI 能帮助不同的主机之间传输数据。OSI 并非是具体的模型,而是一组指导原则,开发者以此为依据开发网络应用。同时它也提供了框架,指导如何制定和实施网络标准、制造设备,以及制定网络互联的方案。
OSI 模型包含 7 层,上三层指定了终端中应用程序如何彼此通信,以及如何与用户交互,下四层指定了如何进行端到端数据传输。

应用层

上 3 层负责主机之间的应用程序通信,其中用户界面位于应用层。应用层是用户和计算机交互的层次,是用户唯一能够直接操作的场所。应用层可以让应用程序能够将信息沿着协议栈向下传输,充当了应用程序和下一层之间的接口。
应用层还负责确定目标通信方的可用性,并且判断对方是否有足够的资源。为什么应用层需要完成这个任务?因为很多网络应用的发展很快,但是这些技术却超过了现有物理网络的极限。

表示层

表示层向应用层提供数据,并负责数据转换和代码格式化。表示层能够保证从一个系统的应用层传输而来的数据可被另一个系统的应用层读取。

会话层

会话层负责在表示层实体之间建立、管理和终止对话,对设备或节点之间的对话进行控制。简而言之,会话层的基本功能是将不同应用程序的数据分离。

传输层

传输层将数据进行分段并重组为数据流,位于传输层的服务将来自上层应用的程序进行分段和重组,然后将它们合并到一个数据流中。传输层提供的是端到端的数据传输服务,并且可以在互联网络上的发送主机和目的主机之间建立逻辑连接。传输层提供的服务可以是有链接的,也可以是无连接的,可靠数据传输需要保证实现以下目标:

  1. 收到数据段后,向发送方进行确认;
  2. 重传所有未得到确认的数据段;
  3. 数据段到达目的主机之后,可以按序排列;
  4. 确保数据流量不超过处理能力,避免拥塞、过载和丢包。


面向连接的服务应该具备以下特征:建立虚电路、使用排序技术、使用确认和使用流量控制。

网络层

网络层的任务是管理设备编址、跟踪设备在网络中的位置,并确认最佳的数据传输路径,这意味着网络层必须在位于不同网络中的设备之间传输数据流。网络层传输的分组有以下 2 种:

  1. 数据分组:用于在互联网中传输用户数据;
  2. 路由更新分组:路由器的网络更新信息,将这些信息告知邻接的路由器。这些分组是由路由选择协议产生的,常见的有 RIP、OSPF 和 EIGRP 协议等。

路由器维护路由表来完成分组转发,路由表包含网络地址、接口和度量值的信息。因为路由器的每个接口都属于不同的网络,所以必须给网络每个接口都分配不同的网络表示号,且与同一个接口相连的每台主机都必须使用相同的网络号。

数据链路层

数据链路层提供数据的物理传输,并且处理错误通知、网络拓扑和流浪控制。链路层将报文封装成数据帧,并加上链路层的报头,包头中有目标的硬件地址和源硬件地址。链路层传输数据的过程中,分组的本身没有被修改过,而是封装了必要的控制信息,以此实现通过不同的介质传输。
IEEE 以太网数据链路层包含 2 个子层:

  1. 介质访问控制 (MAC) 子层:定义如何通过介质传输分组;
  2. 逻辑链路控制 (LLC) 子层:负责识别网络层协议并进行封装。

网络层的设备需要确定网络的位置,而链路层的设备要确定设备的位置。链路层值把帧转发到目标硬件地址所属的网段,如果目标设备和发送设备处于同一个网段,链路层设备将阻止它进入其他网段。

物理层

物理层具有发送和接收比特的功能,OSI 以标准的形式定义了物理层接头和各种物理拓扑,让不同的系统能彼此通信。

TCP/IP 协议栈

OSI 没有被推广

OSI 只获得了一些理论研究的成果,但是因为一些原因没有被推广到商业层面上。原因包括:

  1. OSI 的专家们在完成 OSI 标准时没有商业驱动力;
  2. OSI 的协议实现起来过分复杂,且运行效率很低;
  3. OSI 标准的制定周期太长,因而使得按 OSI 标准生产的设备无法及时进入市场;
  4. OSI 的层次划分也不太合理,有些功能在多个层次中重复出现。

四层协议系统

OSI 的七层协议体系结构的概念清楚,理论也较完整,但它既复杂又不实用。而网络协议通常分不同层次进行开发,每一层分别负责不同的通信功能。TCP/IP 协议栈是一组不同层次上的多个协议的组合,它通常被认为是一个四层协议系统,每一层负责不同的功能:

  1. 链路层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡,负责处理与电缆(或其他任何传输媒介)的物理接口细节
  2. 网络层,有时也称作互联网层,处理分组在网络中的活动,例如分组的选路。
  3. 运输层,主要为两台主机上的应用程序提供端到端的通信
  4. 应用层,负责处理特定的应用程序细节

但是 TCP/IP 最下面的网络接口层(链路层)并没有具体内容,因此实际应用的是综合 OSI 和 TCP/IP 的优点的只有五层协议的体系结构。

分层的意义

大多数的网络应用程序都被设计成客户—服务器模式,服务器为客户提供某种服务,例如 FTP 协议就是访问服务器所在主机上的文件。在同一层上,双方都有对应的一个或多个协议进行通信。应用程序通常是一个用户进程,而下三层则一般在(操作系统)内核中执行。顶层与下三层之间还有另一个关键的不同之处,应用层关心的是应用程序的细节,而不是数据在网络中的传输活动,下三层对应用程序一无所知,但它们要处理所有的通信细节。网络接口层和应用层的目的是很显然的——前者处理有关通信媒介的细节(以太网、令牌环网等),而后者处理某个特定的用户应用程序(FTP、Telnet 等)。
因此我们可以得出分层的意义所在:分层可以为上层隐藏下层的细节,这样上层的程序就不需要考虑下层的具体实现,只需要使用对应的接口即可。互联网的目的之一,就是在应用程序中隐藏所有的物理细节

网络层和传输层

从表面上看,网络层和运输层之间的区别不那么明显,为什么要把它们划分成两个不同的层次呢?为了理解这一点,我们必须把视野从单个网络扩展到一组网络。在 80 年代,网络不断增长的原因之一是:大家都意识到只有一台孤立的计算机构成的“孤岛”没有太大意义,于是就把这些孤立的系统组在一起形成网络。到了 90 年代,我们又逐渐认识到这种由单个网络构成的新的更大的“岛屿”同样没有太大的意义,于是人们又把多个网络连在一起形成一个网络的网络,或称作互连网 (internet)。
如图是一个包含两个网络的互连网,通过一个路由器互相连接,我们可以划分出端系统(两边的两台主机)和中间系统(中间的路由器)。应用层和运输层使用端到端(End-to-end)协议,在图中只有端系统需要这两层协议。但是网络层提供的是逐跳(Hop-by-hop)协议,两个端系统和每个中间系统都要使用它。

在 TCP/IP 协议族中,网络层 IP 提供的是一种不可靠的服务,它只是尽可能快地把分组从源结点送到目的结点。而另一方面,TCP 在不可靠的 IP 层上提供了一个可靠的运输层,通过超时重传、发送和接收端到端的确认分组等机制提供了可靠传输服务。由此可见,运输层和网络层分别负责不同的功能。

TCP/IP 协议分层

TCP 和 UDP 是两种最为著名的运输层协议,都使用 IP 作为网络层协议。虽然 TCP 使用不可靠的 IP 服务,但它却提供一种可靠的运输层服务。UDP 为应用程序发送和接收数据报,但是与 UDP 是不可靠的,它不能保证数据报能安全无误地到达最终目的。
IP 是网络层上的主要协议,同时被 TCP 和 UDP 使用。TCP 和 UDP 的每组数据都通过端系统和每个中间路由器中的 IP 层在互联网中进行传输。ICMP 是 IP 协议的附属协议,IP 层用它来与其他主机或路由器交换错误报文和其他重要信息。IGMP 是 Internet 组管理协议。它用来把一个 UDP 数据报多播到多个主机。
ARP(地址解析协议)和 RARP(逆地址解析协议)是某些网络接口(如以太网和令牌环网)使用的特殊协议,用来转换 IP 层和网络接口层使用的地址。

数据的收发

封装

当应用程序用 TCP 传送数据时,数据将被送入协议栈中,然后逐个通过每一层直到被当作一串比特流送入网络,每一层对收到的数据都要增加一些首部信息(有时还要增加尾部信息)。TCP 传给 IP 的数据单元称作 TCP 报文段或简称为 TCP 段(TCPs egment),UDP 传给 IP 的信息单元称作 UDP 数据报(UDP datagram),IP 传给网络接口层的数据单元称作 IP 数据报(IP datagram),通过以太网传输的比特流称作帧(Frame)

由于 TCP、UDP、ICMP 和 IGMP 都要向 IP 传送数据,因此 IP 必须在 IP 首部中表明数据属于哪一层,在 IP 数据报中使用协议域字段实现。类似地许多应用程序都可以使用 TCP 或 UDP 来传送数据,运输层协议在生成报文首部时要存入一个应用程序的标识符,这就是所谓的端口号,TCP 和 UDP 把源端口号和目的端口号分别存入报文首部中。网络接口分别要发送和接收 IP、ARP 和 RARP 数据,因此也必须在以太网的帧首部中加入标识指明生成数据的网络层协议,这就是所谓的帧类型域

分用

当目的主机收到一个以太网数据帧时,数据就开始从协议栈中由底向上升,同时去掉各层协议加上的报文首部。每层协议盒都要去检查报文首部中的协议标识,以确定接收数据的上层协议。这个过程称作分用,协议使用目的端口号、源 IP 地址和源端口号进行解包的。

TCP/IP 通信过程

当用户使用某个应用时一次网络通信就开始了,例如用户 A 给用户 B 使用 QQ 发送一个消息。因为 QQ 是一款软件,所以它属于应用层,此时在应用层上发生的是进程和进程之间的通信,也就是用户 A 需要将消息发送给用户 B 的端系统上的 QQ 这个进程。通信开始后,进程将封装好向下交付给传输层。
传输层接收到了应用层的信息后,如果是 UDP 则经过封装后直接交给下一层,如果是 TCP 则需要建立 TCP 连接。所谓 TCP 连接此时可以先这么理解,传输层上发生的是端系统和端系统之间的通信,也就是这一层的任务是将信息送到目的主机上。而如果使用 TCP 就需要和目的主机建立一条连接,2 台主机通过这条连接来通信。无论是 TCP 还是 UDP,它们封装好数据之后继续向下传递。
网络层接收到了传输层的信息后,就会进行路由,将信息发送给下一跳。因为网络是由网络节点和端系统组成的,端系统之间进行通信往往需要经过好几个网络节点的传输接力,网络节点往往是路由器。网络层上发生的是跳与跳之间的通信,路由器会通过路由表选择最合适的下一条路由器,把数据传输过去。
获得 IP 地址网络就可以通吗?不可能,因为 IP 地址是一种逻辑地址,不能代表物理层面上设备的位置。想要到达下一跳主机,网络层就需要把数据继续封装交付给链路层。链路层使用的是 MAC 地址,MAC 地址也称之为物理地址,通过 MAC 地址就可以找到具体的设备。
知道具体要传输给什么设备后,就可以把数据给物理层了。物理层就是实际在传输这些信息的地方,常用的物理介质有双绞线、同轴电缆和光缆等。
无论是路由器还是目的主机,当收到从物理层传过来,链路层接收到一个以太网数据帧时,数据就开始从协议栈中由底向上升开始“分用”。如果是路由器,在网络层接收到链路层的数据时,会根据目的 IP 地址进行路由,然后继续把数据给下一跳。如果是目的主机,在网络层接收到链路层的数据时发现目的 IP 地址是自己的 IP 地址,就会去掉网络层的头把数据交给传输层。传输层收到网络层传上来的报文段时,将根据端口号确定这个数据是哪个应用程序的,最后把这个数据交给对应的进程完成通信。

参考资料

《TCP/IP 详解 卷1:协议》(美)W.Richard Stevens 著,范建华 胥光辉 张涛 等译,谢希仁 校,机械工业出版社
《计算机网络(第七版)》 谢希仁 著,电子工业出版社
《CCNA 学习指南(第 7 版)》,[美] Todd Lammle 著,袁国忠 徐宏 译,人民邮电出版社

posted @ 2020-07-06 18:10  乌漆WhiteMoon  阅读(1539)  评论(0编辑  收藏  举报