【计算机网络自顶向下方法】深入理解计算机网络分层和封装模型

1. 引言

对于计算机网络的学习,很多人会觉得困难,主要是各类协议众多,而且相关知识点较为分散。对此,有人肯定会问是否有任何贯穿始终的主线可以让计算机网络的学习更加容易把握。答案是肯定的,这条主线就是协议的分层模型和数据包的封装模型。

2. 分层

在正式讨论所谓协议的分层或数据包的封装模型前,下面先就一个实际的案例给出一个类比,以便后续针对计算机网络协议的分层或数据包封装进行讨论。

假定你需要向别人描述航空运输系统,做过飞机的读者应该都知道,因为整个过程涉及票务、安检、托运、检票等环节,还涉及飞行员、飞机、交通管控员等参与方,所以想要准确的描述整个过程还是比较困难的。

实际上,描述整个过程的一个方式可能是借由你从起点至终点所采取的一系列行为:

  • 票务中心买票;
  • 安检;
  • 托运行李;
  • 登机口检票登机;
  • 飞机起飞;
  • 飞机根据路线前往目的地;
  • 飞机降落;
  • 出机口下飞机;
  • 提取行李;
  • 票务中心投诉(可能)。

下图描述了上述的一系列行为:

在这里插入图片描述

在上面的类比案例中,航空运输系统将乘客从起点载往终点的过程类似于计算机网络中将数据包从源主机发送至目的主机的过程。

实际上,这还不是我们希望得到的类比。继续回头观察一下上图可以发现:

  • 起点和终点都有票务功能;

  • 起点和终点都为买过票的乘客提供了行李功能;

  • 起点和终点都为既买过票又提供了行李服务的乘客提供了登机或出仓功能;

  • 对于既买过票又托运好行李还完成登机的乘客,其可以随着飞机起飞和降落。

上述分析启发我们可以通过一种横向的视角来看待上图中的一系列行为及相关功能。下图将航空运输系统的功能分成了多层,每一层及其下面的所有层都实现了某种功能或服务。

在这里插入图片描述

例如:

  • 票务层和其下所有层实现了将乘客从出发机场的柜台送往到抵达机场柜台的功能;
  • 行李层和其下所有层实现了乘客将行李从出发机场托运到抵达机场提取的功能1
  • 机口层和其下所有层实现了将乘客及其随身包裹从出发机场登机口送往抵达机场出机口的功能;
  • 跑道层和其下所有层实现了将乘客及其随身包裹从出发机场跑道送往抵达机场跑道的功能。

因此,我们可以说,每一层都通过结合以下两种方式来向上提供服务:

  1. 实现当前层的特有功能(例如:在机口层,该特有功能就是登机和出仓);
  2. 使用和当前层紧邻的下层服务(例如:机口层使用跑道层提供的起飞、降落服务)。

上述这种分层架构使得在讨论一个大型复杂系统的特定部分时有章可循;更重要的是,这种架构分层也天然地引入了模块化,使得修改每一层所提供服务的实现也更为简单。

具体地,只要当前层向上一层始终提供相同的服务,同时当前层始终使用相同的下层服务,那么即使当前层提供的服务所基于的实现2发生了改变,整个系统其他部分都可以保持不变。针对处于不断迭代中的大型复杂系统,这种改变服务的实现方式而不影响系统其他组成部分的能力也是分层架构的一大优势。

协议分层

下面基于上述通过类比引出的分层架构来讨论计算机网络协议的分层模型。实际上,在设计计算机网络之初,设计者们也是采用了分层的方式,即每个协议都属于某一特定层;类似地,每一层都通过结合下面两种方式来提供服务:

  1. 实现当前层的特定功能;
  2. 使用和当前层紧邻的下层服务。

例如:某第 n n n 层协议提供的服务可能包括将报文可靠地从网络的一端传输至另一端。实现该服务可能是通过:

  1. 使用某第 n − 1 n-1 n1 层协议提供的不可靠报文传输服务;
  2. 使用该第 n n n 层协议自身为应对不可靠报文传输而实现的丢包检测和报文重传等功能。

需要说明的是,处于不同层的所有协议被统称为协议栈,如下图所示,一般意义上当今互联网的协议栈共计包含 5 5 5 层:物理层、链路层、网络层、传输层和应用层。

在这里插入图片描述

应用层

网络应用程序及其直接使用的协议处于应用层,互联网的应用层包含(不限于下列协议)多个协议:

  • HTTP 协议:用于 Web 文件的请求和传输;
  • SMTP 协议:用于传输电子邮件报文;
  • FTP 协议:用于两台主机之间传输文件;
  • DNS 协议:用于将域名转换为 IP 地址。

应用层协议通常分布于大多数的互联网终端,一般由某终端上使用某应用层协议的应用程序和另一台使用相同协议的应用程序进行数据包的交换。一般将应用层的数据包称为报文(message)。

传输层

互联网的传输层负责在两个应用之间传输应用层报文,互联网的传输层有两个协议,即 TCP 和 UDP ,其中:

  • TCP 向应用程序提供面向连接的服务,该服务可以确保应用层报文能可靠地传输至互联网的目的位置,TCP 还能实现收发双方的速率匹配即流控;同时,TCP 还可以将长的报文分割成更短的数据段并且提供拥塞控制机制,这意味着发送端可以在网络拥堵时降低向对端的发送速率;
  • UDP 向应用程序提供面向无连接的服务,该协议不保证可靠的数据传输,也不提供流控或拥塞控制等机制。

一般将传输层的数据包称为数据段(segment)。

网络层

一般将网络层的数据包称为数据报(datagram),网络层负责将数据报从一台主机传输至另一台主机。互联网中一台源主机上的传输层协议(TCP 或 UDP)会将传输层的数据段和目的主机 IP 传递给网络层,这就好比现实中你在投递给邮政服务的信件上写上收件人地址,然后网络层会将数据段传输至目的主机上的传输层。

互联网的网络层包括著名的 IP 协议,该协议存在于所有具有网络层互联网终端设备中,该协议除了定义数据报中的各个数据域,还规定了终端和路由器应该如何处理这些数据域。

互联网的网络层还包括各种路由协议,路由协议用于确定数据报从源端发往目的端的路由。

链路层

互联网的网络层用于将数据报经由一系列路由器从源端路由至目的端。为了能将数据包从路由线路上的一个节点(主机或路由器)发送至下一个节点,网络层需要依赖链路层的服务。具体地,在每一个节点处,网络层将数据报向下传递至链路层,链路层会将该数据报沿着路由发送至下一个节点,在下一个节点中,链路层将数据报向上传递至网络层。

链路层提供的服务取决于链路上使用的链路层协议。常见的链路层协议包括以太网、WiFi 等。需要指出的是,由于一个数据报从源端到目的端的路由需要经过多条链路,因此在路由的不同链路上,数据报可能由不同的链路层协议处理,也就是说根据链路层协议的不同,其提供给网络层的服务也不同。

一般将链路层的数据包称为数据帧

物理层

尽管链路层的任务是将整个数据帧从一个节点传输至另一个节点,而物理层则负责将数据帧中的每一位从一个节点传输至另一个节点。

同链路层类似,物理层的协议也和链路有关同时取决于链路的传输介质(例如:双绞线、单模光纤)。

OSI 模型

实际上,互联网协议栈并非唯一的协议栈。早在上世纪 70 70 70 年代,国际标准化组织(ISO)就提出了计算机网络的 7 7 7 层模型,该模型被称为开放系统互连(Open Systems Interconnection:OSI)模型。虽然 OSI 模型成形于互联网协议的萌芽期间,当时也只是众多处于研发阶段的协议簇之一,但是由于 OSI 模型诞生之初就被众多高校等机构采纳用于编写计算机网络相关教程,因此在现今即使互联网协议栈已成既定事实的背景下,OSI 模型仍存在于不少教材和培训课程中。

如上图所示,OSI 参考模型的 7 7 7 层分别是:应用层、表示层、会话层、传输层、网络层、数据链路层以及物理层,OSI 参考模型中和互联网协议栈同名的 5 5 5 层功能基本相同,因此这里仅额外说明一下 OSI 参考模型中特有的两层,即表示层和会话层。

  • 表示层提供的服务主要是让通信的两个应用程序可以解译所交换数据的含义;
  • 会话层提供的服务主要用于数据交换的定界和同步,包括设置检查点和建立恢复机制的方法。

有些读者可能会问,既然互联网的协议栈中没有上述两层,这是否意味着 OSI 参考模型中的这两层无关紧要?如果应用程序的确需要这两层提供的服务该怎么办?

实际上,互联网协议栈的设计者对此的态度都是这取决于开发者自身,即如果开发者认为两层所提供的服务重要,或者其应用程序中确需这两层对应的服务,那么开发者自身应该在开发应用程序时将相关服务纳入其中。

3. 封装

下图显示了数据从发送端到接收端的物理路径,即数据先沿着发送端的协议栈一直向下,然后通过先上后下的顺序经过中间的链路层交换机和路由器,最终沿着接收端的协议栈向上到达应用程序。

值得注意的是,路由器和链路层交换机都没有实现协议栈的所有层,而仅仅实现底下的若干层。如下图所示,链路层交换机仅仅实现了协议栈中的第 1 1 1 层和第 2 2 2 层,而路由器还额外实现了第 3 3 3 层,所以链路层交换机一般称为 2 2 2 层交换机,而路由器一般被称为 3 3 3 层交换机。

值得特别注意的是,发送端和接收端的主机都实现了协议栈的所有 5 5 5 层,这实际上体现了互联网这一极度复杂系统的设计哲学,即将复杂性尽可能放在计算机网络的边界。

在这里插入图片描述

实际上,通过上图,这里最想详细介绍的是计算机网络中另一个重要的概念——封装。在发送端,应用层报文 M \text{M} M 会先传递至传输层,然后传输层会在报文前加上额外的信息,即传输层的头部 H t \text{H}_t Ht ,该头部信息后续会被接收端传输层使用。这里应用层的报文和传输层的头部共同组成了传输层数据段。这里就可以说传输层封装了应用层的报文。其中传输层的头部可能包含了能让接收端传输层将报文传递给指定应用程序的信息,或者指示报文传输过程中是否发生误码的信息等。

传输层接着会把数据段传递给网络层,网络层又会加上自身的头部 H n \text{H}_n Hn ,该头部信息中会包含收发两端的地址信息,传输层的数据段和网络层头部共同组成了网络层数据报。

网络层又会把数据报传递给链路层,后者也会在加上自身的头部 H l \text{H}_l Hl 后创建链路层数据帧。

由上述分析可以发现,每一层的数据包都包含两类信息:头部信息和数据信息,而数据信息一般是来自上一层的数据包。

为了让读者更好地理解上述封装的概念,这里通过一个寄快递的例子来说明。快递中装的物品就是报文,快递的包装就是报文头,头部有收件人和发件人的信息。


  1. 需要注意的是,行李层仅为已经购买机票的乘客提供服务。 ↩︎

  2. 需要注意的是,改变当前层的服务和改变服务的实现方式是不同的概念。例如:登机和出仓服务原先是基于性别和年龄的,可以将其改为基于身高,而更改前后航空运输系统的其他部分都可以保持不变。 ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值