基本分层概述
为了使不同体系结构的计算机网络都能互联,国际标准化组织于 1977 年成立了专门机构研究该问题。不久他们就提出了一个试图使各种计算机在世界范围内互联的标准框架,也就是著名的开放系统互联参考模型,简称为OSI。
该模型是一个七层协议的体系结构,从下往上依次是物理层、数据链路层、网络层、运输层、会话层、表示层、应用层。它是法律上的国际标准。到了 20 世纪 90 年代初期,虽然整套的 OSI 国际标准都已经制定出来了,但这时因特网已抢先在全世界覆盖了相当大的范围。
因特网从 1983 年开始使用 TCP/IP 协议族,并逐步演变成 TCP/IP 参考模型:
该模型是一个四层协议的体系结构,从下往上依次是网络接口层、网际层、运输层、应用层。它是事实上的国际标准。
一个新标准的出现,有时不一定反映出其技术水平是最先进的,而是往往有着一定的市场背景。从这种意义上说,能够占领市场的就是标准。 OSI 标准失败的原因可归纳为:
- OSI 的专家们缺乏实际经验,他们在完成 OSI 标准时没有商业驱动力
- OSI 的协议实现起来过分复杂,而且运行效率很低
- OSI 标准的制定周期太长,因而使得按 OSI 标准生产的设备无法及时进入市场
- OSI 的层次划分也不太合理,有些功能在多个层次中重复出现
对比这两个体系结构可以看出, TCP/IP 体系结构相当于将 OSI 体系结构的物理层和数据链路层合并为了网络接口层,并去掉了会话层和表示层。
TCP/IP 在网络层使用的协议是 IP 协议, IP 协议的中文意思是网际协议,因此 TCP/IP 体系结构的网络层常称为网际层。大多数用户每天都有接入因特网的需求,这就要求用户的主机必须使用 TCP/IP 协议。当然了,即使用户的网络不需要接入因特网,也可以使用 TCP/IP 协议。在用户主机的操作系统中,通常都带有符合 TCP/IP 体系结构标准的 TCP/IP 协议族,而用于网络互联的路由器中也带有符合 TCP/IP 体系结构标准的 TCP/IP 协议族,只不过路由器一般只包含网络接口层和网际层。
TCP/IP 体系结构的网络接口层并没有规定什么具体的内容,这样做的目的是可以互联全世界各种不同的网络接口,例如有线的以太网接口、无线局域网的 WiFi接口,而不限定仅使用一种或几种网络接口。因此本质上 TCP/IP 体系结构只有上面的三层 IP 协议是 TCP/IP。
运输层的核心协议 TCP 和 UDP 是 TCP/IP 体系结构运输层的两个重要协议。
应用层包含了大量的应用层协议,例如HTTP、SMTP、DNS、RTP 等。
IP 协议可以将不同的网络接口进行互联,并向其上的 TCP 协议和 UDP 协议提供网络互联服务。
而 TCP 协议在享受 IP 协议提供的网络互联服务的基础上,可向应用层的相应协议提供可靠传输的服务。 UDP 协议在享受 IP 协议提供的网络互联服务的基础上,可向应用层的相应协议提供不可靠传输的服务。
IP 协议作为 TCP/IP 体系结构中的核心协议,一方面负责互联不同的网络接口,也就是IP over Everything:
另一方面为各种网络应用提供服务,也就是 Everything over IP
:
在 TCP/IP 体系结构中包含有大量的协议, IP 协议和 TCP 协议是其中非常重要的两个协议,因此用 TCP 和 IP 这两个协议来表示整个协议大家族常称为 TCP/IP 协议族。
由于 TCP/IP 体系结构为了将不同的网络接口进行互联,因此它的网络接口层并没有规定什么具体的内容。然而这对于我们学习计算机网络的完整体系而言就会缺少一部分内容。因此在学习计算机网络原理时,往往采取折中的办法,也就是综合 OSI 和 TCP/IP 的优点,采用一种五层协议的原理体系结构从下到上依次为物理层、数据链路层、网络层、运输层、应用层
可以看出,五层协议的原理体系结构,将 TCP/IP 体系结构的网络接口层又重新划分为了物理层和数据链路层。这样更有利于我们对计算机网络原理的学习。
各层次的任务
物理层
首先来看最简单的情况,两台计算机通过一条网线连接起来。
对于这种最简单的情况,我们需要考虑以下问题:
- 采用怎样的传输媒体,进行传输
- 在计算机上采用怎样的物理接口来连接传输媒体
- 使用怎样的信号来表示比特 0 和 1,
解决了这些问题,两台计算机就可以通过信号来传输比特 0 或 1 了。即要考虑数据以何种形式,通过什么介质传递,以及计算机如何接收到传输过来的数据这三大问题。
我们可以将这些问题划归到物理层。这里我们需要说明,严格来说传输媒体并不属于物理层,它并不包含在体系结构之中。
数据链路层
一般的计算机网络一般都由多台主机构成,例如主机a、b、c、d、 e 通过总线互联构成了一个总线型网络。
假设我们已经解决了物理层的问题,也就是说主机间可以发送信号来传输比特 0 / 1。我们来看看在这样一个总线形的网络上还面临什么需要解决的问题。
如图所示,主机 A 要给主机 C 发送数据,但是表示数据的信号会通过总线传播到总线上的每一个主机。那么问题来了,主机 C 如何知道该数据是发给自己的?自己要接受,而主机 BDE 又如何知道该数据并不是发送给自己的,自己应该拒绝呢?这就很自然地引出了如何标识网络中各主机的问题,也就是主机编址问题。
大家可能听说过网卡上的 Mac 地址,其实它就是主机在网络中的地址。主机在发送数据时,应该给数据附加上目的地址,当其他主机收到后,根据目的地址和自身地址来决定是否接受数据
这就又引出了一个问题,目的主机如何从信号所表示的一连串比特流中区分出地址和数据,也就是需要解决分钟组的封装格式问题。
另外对于总线型的网络还会出现下面这种典型的问题:
例如某个时刻总线是空闲的,也就是没有主机使用总线来发送数据,片刻之后,主机 B 和 D 同时向总线发送数据,这必然会造成信号碰撞。因此,如何协调各主机征用总线也是必须要解决的问题。
需要说明的是,这种总线型的网络早已淘汰,现在常用的是使用以太网交换机将多台主机互联形成的交换式以太网。那么以太网交换机又是如何实现的呢?
我在上面高亮标识的几个问题,它们全部划归到数据链路层。
网络层
我们来看这个例子:
这是一个由三个路由器、四个网络互联起来的小型互联网,我们可以把它看作是英特网中很小的一部分。在之前的例子中仅有一个网络,我们不需要对网络进行标识,而在本图中有多个网络。
很显然,我们面临着如何标识各网络以及各网络中各主机的问题,也就是网络和主机共同编址的问题。
我们再来看另一个问题:原主机与目的主机之间的传输路径往往不止一条,分组从源主机到目的主机可走不同的路径:
这样就引出了路由器如何转发分组的问题,以及如何进行路由选择的问题。我们将这些问题全部划归到网络层。
运输层
至此我们解决了物理层、数据链路层以及网络层各自的问题,则可以实现分组在网络间传输的问题。但是对于计算机网络应用而言,这仍然不够。例如,假设这台主机中运行着两个与网络通信相关的应用进程,一个是浏览器进程,另一个是 QQ 进程:
这台服务器中运行着与网络通信相关的服务器进程。某个时刻,主机收到了来自服务器的分组,那么这些分组应该交给浏览器进程处理,还是应该交给 QQ 进程处理呢?这就引出了我们如何标识与网络通信相关的应用进程,进而解决进程之间基于网络通信的问题。
另外,如果某个分组在传输过程中出现了误码,或者由于路由器繁忙导致路由器丢弃分组,换句话说,若出现传输错误应该如何处理?这也是需要解决的问题。我们将这些问题全部划归到运输层。
应用层
至此我们解决了物理层、数据链路层、网络层以及运输层各自的问题,则可以实现进程之间基于网络的通信。
在此基础上,只需制定各种应用层协议,并按协议标准编写相应的应用程序,通过应用进程间的交互来完成特定的网络应用。例如,支持万维网应用的 HTTP 协议,支持电子邮件的 SMTP 协议,支持文件传送的 FTP 协议等。我们将这些问题全部划归到应用层。
至此,我们将实现计算机网络所需要解决的各种主要问题分别划归到了物理层、数据链路层、网络层、运输层和应用层,进而构成了五层协议体系的原理体系结构。
物理层:解决使用何种信号来表示比特的问题,
数据链路层:解决分组在一个网络或一段链路上传输的问题。
网络层:解决分组在多个网络上传输和路由的问题。
运输层:解决进程之间基于网络的通信问题。
应用层:解决通过应用进程的交互来实现特定网络应用的问题。
假设你是一名程序员,要编程解决实现计算机网络所面临的所有软件问题,那么你是愿意将这些问题全部放在一个模块中编程实现,还是愿意将它们划分到不同的模块中逐模块编程实现?相信你一定会选择后者。这样你也许就能够深刻体会到计算机网络体系结构分层的必要性。
数据传递过程
现在我们将通过一个具体的网络通信实例来看看计算机网络体系结构分层处理方法。假设网络拓扑如下所示:
主机1 和 主机2 通过路由器互联,现在主机1向主机2传递数据。那么体系结构的各层在整个过程中起到怎样的作用呢?
应用层按协议的规定构建一个报文:
应用层将报文交付给运输层处理:
运输层给报文添加一个 H4 首部,使之成为报文段。该首部的作用主要是为了区分应用进程以及实现可靠传输。
运输层将报文段交付给网络层处理:
网络层给 H5 报文段添加一个 H4 首部,使之成为数据报。该首部的作用主要是为了使数据报可以在互联网上传输,也就是被路由器转发。
网络层将数据报交付给数据链路层处理:
数据链路层给 IP 数据报添加一个首部和一个尾部,使之成为帧
。
- 首部的作用主要是为了让帧能够在一段链路上或一个网络上传输,能够被相应的目的主机接收。
- 尾部的作用是为了让目的主机检查所接收到的真是否有误码数据。
链路层将帧交付给物理层,物理层将帧看作是比特流:
物理层将比特流变换成相应的信号发送到传输媒体。信号通过传输媒体到达路由器,路由器的物理层将信号变换为比特流:
然后将其交付给数据链路层,这实际上交付的是帧:
数据链路层将帧的首部和尾部去掉后,将其交付给网络层:
这实际上交付的是数据报。网络层解析数据报的首部,从中提取出目的网络地址,然后查找自身的路由表,确定转发端口,以便进行转发。
网络层将数据报交付给数据链路层:
数据链路层给数据报添加一个新的首部和一个新的尾部,使之成为帧。
数据链路层将帧交付给物理层,物理层将真看作是比特流:
物理层将比特流变换成相应的信号发送到传输媒体:
信号通过传输媒体到达目的主机,我们来看目的主机的处理过程。
物理层将信号变换为比特流,然后将其交付给数据链路层,这实际上交付的是帧:
数据链路层将真的首部和尾部去掉后,将其交付给网络层,这实际上交付的是数据报:
网络层将数据报的首部去掉后,将其交付给运输层,这实际上交付的是报文段:
运输层将报文段的首部去掉后,将其交付给应用层,这实际上交付的是报文:
应用层对报文进行解析,然后执行相应操作。
这就是完整的数据在不同层次的传输过程,每个层次都发挥了自己的功能,对数据进行不同处理,让其可以正确的传播到目的地。
分层体系常见概念
刚才我们通过一个简单的应用实例讲述了计算机网络体系结构的分层思想。相信大家已经对计算机网络体系结构有了初步的认识,现在我们将对计算机网络体系结构中的专用术语进行介绍,以便大家对计算机网络体系结构有更深入的理解。需要说明的是,这些专用术语来源于 OSI 的 7 层协议体系结构,但也适用于 TCP/IP 的四层体系结构和五层协议原理体系结构。
我们将这些专用术语中最具代表性的三个作为分类名称,它们分别是实体,协议,服务。
实体
我们首先来看实体,实体是指任何可发送或接收信息的硬件或软件进程。例如这是通信双方的五层原理体系结构,我们在他们的各层中用标有字母的小方格来表示实体。
有了实体的概念,我们再来看对等实体,对等实体
是指通信双方相同层次中的实体。
例如图中实体 A与实体 F 为对等实体,B 与 G 为对等实体,以此类推。
协议
介绍完实体,我们再来介绍协议,协议是控制两个对等实体进行逻辑通信的规则的集合。
例如应用层对等实体在应用层协议的控制下进行逻辑通信。运输层对等实体在运输层协议的控制下进行逻辑通信。网络层对等实体在网络层协议的控制下进行逻辑通信,以此类推:
需要注意的是,之所以称为逻辑通信,是因为这种通信其实并不存在,它只是我们假设出来的一种通信,目的在于方便我们单独研究体系结构某一层,而不用考虑其他层。
计算机网络协议有三个要素,它们是语法
,语义
,同步
。
语法:定义通信双方所交换信息的格式。
例如这是 IP 数据报的格式:
其中的小格子称为字段或域数字,表示字段的长度,单位是位,也就是比特。语法就是定义了这些小格子的长度和先后顺序。换句话说,语法定义了所交换信息由哪些字段以及何种顺序构成。
需要说明的是,我们没有必要记住每种分组的格式,只要我们能看懂他们的格式说明就可以了。
语义:定义通信双方所要完成的操作
比如某台主机要访问浏览器的页面,其会构建一个HTTP请求报文,发向目的主机。目的主机受到请求报文后,通过报文的内容得知对方想要访问浏览器资源,于是发送一个HTTP响应报文给源主机。最后源主机接收到这个相应报文,从这个响应报文的内容解析出了浏览器页面。
这个例子中,可以体现出通信双方收到分组后完成怎样的操作,这是 HTTP 协议的语义所规定的。
同步:定义通信双方的时序关系
例如这是 TCP 采用三次握手建立连接的过程:
要想进行运输层 TCP 实体间的逻辑通信,首先必须建立连接,从连接建立的过程就可以看出 TCP 客户端和 TCP 服务器之间的时序关系以及各自的状态转换,只有双方建立连接后才能进行 TCP 数据传输。这个例子可以充分体现计算机网络协议三要素中的同步。
服务
有了协议的概念,我们再来介绍服务:
在协议的控制下,两个对等实体间的逻辑通信使得本层能够向上一层提供服务
每个层次在实现本层功能之前,本层协议还需要使用下面一层所提供的服务:
- 数据链路层对等实体享受物理层提供的服务,给网络层提供服务。
- 网络层对等实体享受数据链路层提供的服务,给运输层提供服务。
- 运输层对等实体享受网络层提供的服务,给应用层提供服务。
- 应用层对等实体享受运输层提供的服务,并在应用层协议的控制下给其上层,也就是用户提供服务。
很明显,协议是水平的,而服务是垂直的。需要特别注意的是,实体看得见下层所提供的服务,但并不知道实现该服务的具体协议。换句话说,下层的协议对上层的实体是透明的,这就好比我们肯定看得见手机为我们提供的各种服务,但我们只是享受这些服务,而没有必要弄懂手机的工作原理。
再来看服务访问点
的概念:
服务访问点:指在同一系统中相邻两层的实体交换信息的逻辑接口,用于区分不同的服务类型
例如数据链路层的服务访问点为帧的类型字段,网络层的服务访问点为 IP 数据报首部中的协议字段,运输层的服务访问点为端口号。简单地说就是每层需要通过访问哪一个节点来进行服务。
上层要使用下层所提供的服务,必须通过与下层交换一些命令,这些命令称为服务元语
。
服务原语:指协议中的下层协议通过接口为上层协议提供某种服务而发送的指令的操作
在计算机网络体系结构中,对通信双方所交互的数据包有专门的术语,我们把对等层次之间传送的数据包称为该层的协议数据单元
,英文缩写词为PDU。
协议数据单元:指对等层次之间传递的数据单位
- 物理层对等实体逻辑通信的数据包称为比特流
- 数据链路层对等实体逻辑通信的数据包称为帧
- 网络层对等实体逻辑通信的数据包称为分组。如果使用 IP 协议,也称为 IP 数据报。
- 运输层对等实体逻辑通信的数据包一般根据协议而定。例如使用 TCP 协议则称为 TCP 报文段。使用 UDP 协议则称为 UDP 用户数据包
- 应用层对等实体逻辑通信的数据包一般称为应用报文。
上述各层数据包可以统称为协议数据单元
PDU:
我们把同一系统内,层与层之间交换的数据包称为服务数据单元
,英文缩写词为SDU: