| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> 【计算机网络自顶向下方法】深入理解计算机网络分层和封装模型 -> 正文阅读 |
|
[网络协议]【计算机网络自顶向下方法】深入理解计算机网络分层和封装模型 |
1. 引言对于计算机网络的学习,很多人会觉得困难,主要是各类协议众多,而且相关知识点较为分散。对此,有人肯定会问是否有任何贯穿始终的主线可以让计算机网络的学习更加容易把握。答案是肯定的,这条主线就是协议的分层模型和数据包的封装模型。 2. 分层在正式讨论所谓协议的分层或数据包的封装模型前,下面先就一个实际的案例给出一个类比,以便后续针对计算机网络协议的分层或数据包封装进行讨论。 假定你需要向别人描述航空运输系统,做过飞机的读者应该都知道,因为整个过程涉及票务、安检、托运、检票等环节,还涉及飞行员、飞机、交通管控员等参与方,所以想要准确的描述整个过程还是比较困难的。 实际上,描述整个过程的一个方式可能是借由你从起点至终点所采取的一系列行为:
下图描述了上述的一系列行为: 在上面的类比案例中,航空运输系统将乘客从起点载往终点的过程类似于计算机网络中将数据包从源主机发送至目的主机的过程。 实际上,这还不是我们希望得到的类比。继续回头观察一下上图可以发现:
上述分析启发我们可以通过一种横向的视角来看待上图中的一系列行为及相关功能。下图将航空运输系统的功能分成了多层,每一层及其下面的所有层都实现了某种功能或服务。 例如:
因此,我们可以说,每一层都通过结合以下两种方式来向上提供服务:
上述这种分层架构使得在讨论一个大型复杂系统的特定部分时有章可循;更重要的是,这种架构分层也天然地引入了模块化,使得修改每一层所提供服务的实现也更为简单。 具体地,只要当前层向上一层始终提供相同的服务,同时当前层始终使用相同的下层服务,那么即使当前层提供的服务所基于的实现2发生了改变,整个系统其他部分都可以保持不变。针对处于不断迭代中的大型复杂系统,这种改变服务的实现方式而不影响系统其他组成部分的能力也是分层架构的一大优势。 协议分层下面基于上述通过类比引出的分层架构来讨论计算机网络协议的分层模型。实际上,在设计计算机网络之初,设计者们也是采用了分层的方式,即每个协议都属于某一特定层;类似地,每一层都通过结合下面两种方式来提供服务:
例如:某第 n n n 层协议提供的服务可能包括将报文可靠地从网络的一端传输至另一端。实现该服务可能是通过:
需要说明的是,处于不同层的所有协议被统称为协议栈,如下图所示,一般意义上当今互联网的协议栈共计包含 5 5 5 层:物理层、链路层、网络层、传输层和应用层。 应用层网络应用程序及其直接使用的协议处于应用层,互联网的应用层包含(不限于下列协议)多个协议:
应用层协议通常分布于大多数的互联网终端,一般由某终端上使用某应用层协议的应用程序和另一台使用相同协议的应用程序进行数据包的交换。一般将应用层的数据包称为报文(message)。 传输层互联网的传输层负责在两个应用之间传输应用层报文,互联网的传输层有两个协议,即 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? 后创建链路层数据帧。 由上述分析可以发现,每一层的数据包都包含两类信息:头部信息和数据信息,而数据信息一般是来自上一层的数据包。 为了让读者更好地理解上述封装的概念,这里通过一个寄快递的例子来说明。快递中装的物品就是报文,快递的包装就是报文头,头部有收件人和发件人的信息。 由上述分析可以发现,每一层的数据包都包含两类信息:头部信息和数据信息,而数据信息一般是来自上一层的数据包。 为了让读者更好地理解上述封装的概念,这里通过一个寄快递的例子来说明。快递中装的物品就是报文,快递的包装就是报文头,头部有收件人和发件人的信息。 |
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 9:29:57- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |