协议的认识和理解

news2024/9/21 18:46:19

目录

1. 协议

1.1. 站在日常生活的角度初始协议

1.2. 网络分层结构 (OS vs 网络)

1.2.1. 软件分层

1.2.2. 网络分层

1.3. 站在语言的角度理解协议


1. 协议

对于协议,我们可以用一句话概括它:协议本质上就是一种约定。

1.1. 站在日常生活的角度初始协议

现在,由于国家和社会的高速发展,出国留学的人日益增多,小东就是一个海外留学的学生,出门在外,时常需要与父母打电话联系,但由于海外与国内打电话成本比较高且小东家庭的经济情况不是很好,为了减少成本,于是小东与父母就达成了一个约定,这个约定就是:

  • 如果小东打电话,电话铃声响了一声就挂断电话,那么代表的是小东没钱了,需要父母转钱;
  • 如果小东打电话,电话铃声响了两声就挂断电话,那么代表的是小东一切安好,报平安,望父母勿忧;
  • 如果小东打电话,电话铃声响了三声就挂断电话,那么代表的是小东与父母需要谈事情,此时小东父母才会与小东通过电话沟通。

上面这个例子,小东通过与父母达成的一个约定,达到了减少 (经济) 成本且与父母完成交互的目的。

而上面这种约定在网络我们称之为协议,其本质就是减少通信成本,提高通信效率

1.2. 网络分层结构 (OS vs 网络)

谈到网络分层,我们也需要理解一下什么叫软件分层。

1.2.1. 软件分层

事实上,对于软件分层这个概念,我们并不陌生,比如:

  1. 在学习系统时,我们知道进程的虚拟地址空间本质上就是进程和 (物理) 内存的一层中间软件层;
  2. 在学习文件系统时,我们谈过一切皆文件,即在内核看来,所有的硬件 (显示器、网卡、磁盘等等) 都被看做为一个一个的 struct file 结构,换言之, struct file 这个结构就是内核与底层硬件驱动程序之间的一层中间软件层,而我们以前也提过,struct file 这一层我们称之为 VFS (virtual file system);
  3. 在学习计算机宏观体系时,也知道计算机体系也是被分层的,自底向上分别为硬件、驱动、内核、system call、语言(以及各种库)、用户代码。

事实上,软件分层是计算机的一种设计理念 --- 任何问题都可以通过添加一层中间软件层来解决。

可是有一个疑问,软件分层为什么可以做到这样呢?换言之,软件分层的好处是什么呢?

我们还是通过一个实例来理解:在学习操作系统时,我们说过,操作系统是为了管理软硬件资源的 (对下),同时也需要为上层用户提供高效的、稳定的、安全的运行环境 (对上),对下我们就不谈了,我们主要谈谈OS如何对上层用户提供服务的,换言之,上层用户是如何使用OS提供的各种功能的呢? 

站在用户的视角,最简便的方案就是用户直接访问OS提供的功能,这是最方便直观的,但是有一个致命的问题,用户可不一定完全了解内核,且用户行为可能带有攻击性,简而言之,这种方案对内核自身的安全产生了威胁,如果内核自身安全都无法得到保证,何谈内核为上层用户提供服务呢?

在遇到困难时,我们或许可以考虑换个视角思考问题,因此,站在OS的视角,在OS为用户提供服务时,其首要前提是,内核自身需要保证安全,不能让用户影响到内核,故设计者在内核和上层用户添加了一层中间软件层,即 system call,上层用户通过 system call 这一层中间软件层访问内核,这样带来的好处就是,将上层用户和内核进行了解耦,换言之,上层用户的行为无法影响到内核,内核只需要将服务以系统调用接口的形式对外提供,这样就降低了系统的复杂度,以便于后续维护和扩展。

对于软件分层而言,我们也可以用一句话概括它,软件分层就是为了让层与层之间进行解耦,以达到降低系统复杂度,减少后续维护成本和可扩展的目的

1.2.2. 网络分层

有了软件分层的理解,那么对于网络分层,我们是可以有一个大概的认识的,尽管我们未见过它,但可以预见到,网络是一个比较大的模块,为了降低系统复杂度,以便于后期的维护、扩展等等目的,设计者们对网络进行高度抽象为各个模块,这些模块以层状结构体现。

再有了上面的认识后,我们首先提出一个问题,为什么会有网络呢?

首先,我们要清楚一点,网络本质上是为了通信,即数据交互。而为什么会有网络,我们可以从生活中的例子来理解 (艺术来源于生活嘛~~~):

在古代中,我们的祖先是如何通信的呢? 如果两个人距离非常近,那么直接交谈就行了,但如果两个人距离非常远,比如一个人在西域,另一个人在长安,那么这两个人直接交谈是无法成功的,因为距离太远了,因此,古人就通过书信的方式来进行通信,而这里的书信就相当于当下的网络。

那么为什么会有书信通信呢,如果两个人近在咫尺,需不需要通过书信来沟通呢? 一般情况下是不需要的,因为此时较于直接交流就显得成本过高了。

但如果两个人距离非常遥远,那么就必须要通过书信这种方式进行通信,因为此时直接交流是无法完成通信的,只能通过书信的方式来进行数据交互,换言之,之所以会有古代的书信通信以及当下的网络通信,其根本原因就是因为,通信双方的距离变长了。

一旦通信双方距离变长,那么就会引发新的问题,诸如:

  1. 如何转发数据:数据是需要进行转发的,可不是从 src 一下就到了 dest,而是需要进行中转的,既然要进行中转,那么数据是如何进行转发的呢?
  2. 将数据转发到哪里:既然数据要进行转发,那么也需要考虑将数据转发到哪里呢? 即从 src 到 dest 这个转发路线是怎样的?
  3. 数据在转发过程中的可靠性问题:数据在整个转发过程中,有没有可能出现数据丢失的可能呢? 答案是有的,因此,在数据转发过程中,数据的可靠性是怎样保证的?
  4. 通信数据如何使用:首先,我们要明确一点,通信可不是目的,获取数据以及对数据的处理才是目的,通信只是为了获取数据的一种手段,那么数据如何使用呢?

简而言之,上面想说的就一句话:通信双方距离变长,一定会引发新的问题,而网络就是解决这些新产生的问题的。

那么网络是如何解决这些新问题的呢?

网络通过各种协议解决上述问题,这些协议我们可以称之为 TCP/IP 协议,换言之,网络协议就是为了解决由于通信双方距离变长产生新的问题的一种解决方案,这就是其存在的主要原因。

既然网络协议是一种解决方案,而对于解决方案而言,那么必然会存在好的解决方案,以及坏的解决方案,那么如何区分它们呢?

一个好的解决方案体现出来的特点:整体体系复杂度低,可扩展、后期维护成本低。

因此,网络的设计者们将网络协议设计成为了层状结构。

至于具体的层状结构 (OSI七层模型 (理论上) 和 TCP/IP五层协议模型 (实际工程中)),我们就不说了,后续过程中,我们主要谈论的是 TCP/IP 五层协议模型。

但在这里,我们仍需强调一点,计算机体系的层状结构 vs 网络协议的层状结构,如图所示:

可以看出,网络协议层状中的传输层和网络层本质上是属于OS的,换言之,传输层和网络层中的协议本质上就是OS源码中的一部分。

在这里存在一个问题,既然传输层和网络层是由OS内部自身实现的,那么上层用户 (应用层) 可以直接使用这两层的协议吗?

答案是不能的,因为OS不相信任何用户,但同时OS又需要为上层提供网络服务,故OS也必须要有与网络通信相关的 system call,当有了与网络相关的 system call,上层用户就可以基于这些系统调用进行网络开发,同时,也有人对这些系统调用进行再次封装,形成网络库。

关于网络协议栈和操作系统的关系:TCP/IP四层模型 (不考虑物理层) 的下三层属于操作系统及驱动,其操作是是由操作系统和网络驱动程序自动处理的,上层应用通常不需要关心这些底层细节,只需通过操作系统提供的系统调用进行网络通信即可。

接下来,我们需要强调一下多主机的通信细节:

对于一台Linux机器和一台Windows机器而言,在内核管理中 (内存管理、进程管理、文件管理、驱动管理等等)肯定是不一样的,事实也是如此,同时,我们也知道,一台Linux机器是可以和Windows机器进行网络通信的,这是为什么? 

原因是因为它们的网络协议栈是一样的,它们都遵守同一个标准 (TCP/IP 协议模型),故而可以进行网络通信,换言之,如果一台设备 (无论是手机、手表、汽车等等),只要想入网,那么其前提条件就是必须遵守 TCP/IP 协议模型,只要遵守了这个标准,那么就可以进行网络传输,与机器是什么操作系统无关。

总的来说,对于一台机器而言,只要想入网,那么其内核可以是个性化的,但网络标准必须是共性化的,只有遵守共性化的网络标准,才可以进行网络通信。

1.3. 站在语言的角度理解协议

首先,我们知道,Linux操作系统是由C编写的,而传输层和网络层又隶属于OS,那么换言之,传输层和网络层这些协议以及对上层用户提供的系统调用都是由C实现的,同时,我们知道,传输层和网络层可不仅仅只有一个协议,换言之,系统内存在着大量的网络协议,网络协议如此之多,那么内核需不需要管理它们呢? 

答案是毋庸置疑的,必须要管理,如何管理? 先描述在组织。

既然是C实现的协议,那么如何描述? 当然是 struct ,换言之,这么多的协议,本质上就是一个一个的 struct 罢了,我们以下面这个结构体举例:

struct AAA
{
	int a;
	int b;
	int c;
};

当两台主机进行通信时,比如主机A和主机B,A向B发送这个结构化的数据,当B收到了这个结构化的数据,请问B可以解释这个结构化的数据吗?

当然可以解释,因为任何一台设备,只要想入网,必循遵守相同的网络协议标准,换言之,它们遵守的是相同的网络标准,其协议细节完全一样,而这个结构化的数据类型本质上就是通信双发达成的 "约定", 即协议。

在未来,我们学习到的任何一种网络协议,其本质上就是一个 struct 结构体类型, 由于网络标准的共性化,通信双方都可以认识并解释这些数据,这就是我们对于协议的认识和理解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2115646.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

由一个 SwiftData “诡异”运行时崩溃而引发的钩深索隐(四)

概述 在 WWDC 24 中,苹果推出了数据库框架 SwiftData 2.0,并为其加入了全新的 History Trace、“墓碑”等诸多激动人心的新功能。那么它们到底如何实际应用到我们的 App 中去呢? 想搞清楚历史记录追踪(History Trace)如何在 SwiftData 2.0 中大放异彩吗?看这篇就对了! …

压缩文件隐写

1、伪加密 (1)zip伪加密 考点:winhex打开压缩包;搜索504b0102(注意不是文件头部;zip文件头部伪504b0304);从50开始,往后面数第9,10个字符为加密字符,将其设置为0000即可变为无加密状…

攻防世界--->获取

做题笔记。 下载 查壳 64ida打开 main函数: 查找字符: 根据程序逻辑,创建了一个新文件并且进行了写入。 直接Linux上动调一下。 SharifCTF{b70c59275fcfa8aebf2d5911223c6589}

python安装以及访问openAI API

安装python 我是python小白,所以需要一步一步来,先安装。 一口吃不成胖子,记住。 从官网下载python,目前最新版本是3.12,但是据说稳定版3.11更好一点,所以,下载3.11,注意不要下载…

Hiredis的使用

Hiredis的使用 📸这里安利一个github仓库介绍 图片生成 Socialify 一键生成专业 GitHub 仓库简介图 一、Hiredis的安装与使用 1、下载hiredis软件包, https://github.com/redis/hiredis.git 或者使用git下载到本地 git clone https://github.com/redi…

Camtasia 2024破解版注册机包含激活码秘钥

🎬 嗨,亲爱的朋友们!今天我要给你们安利一款超级炫酷的屏幕录制和视频编辑软件——Camtasia 2024!🎉 camtasia2024绿色免费安装包winmac下载,点击链接即可保存。 https://pan.quark.cn/s/5ee0c4655701 C…

vite+vue3+typescript+elementPlus前端实现电子证书查询系统

实现背景:之前电子证书的实现是后端实现的,主要采用GD库技术,在底图上添加文字水印和图片水印实现的。这里采用前端技术实现电子证书的呈现以及点击证书下载,优点是:后端给前端传递的是一组数据,不需要传证…

假期学习-- iOS runloop了解和使用

iOS runloop的总结和理解 https://juejin.cn/post/7167497134294433829?searchId202408060922235E28560E3792F91107ED runloop的概念和数据结构 一般情况下,程序(或者说线程)在执行完毕后会立即退出或销毁;,但如果对…

体育馆智能可视化:提升场馆管理与观赛体验

利用图扑可视化技术,实时呈现体育馆内各项动态,优化场馆管理,提升观众的观赛体验。

基于人工智能的手写数字识别系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 手写数字识别是一种经典的计算机视觉任务,目标是让机器能够识别手写数字。通过人工智能技术,特别是卷积神经网…

JS_变量

二、JS的变量 JS中的变量具有如下特征 1 弱类型变量,可以统一声明成var 2 var声明的变量可以再次声明 3 变量可以使用不同的数据类型多次赋值 4 JS的语句可以以; 结尾,也可以不用;结尾 5 变量标识符严格区分大小写 6 标识符的命名规则参照JAVA 7 如果使用了 一个没有声明的变量…

JAVA基础:值传递和址传递

1 值传递和址传递 值传递 方法调用时,传递的实参是一个基本类型的数据 形参改变,实参不变 public static void doSum(int num1,int num2){} main(){doSum(10,20);int i 10 ;int j 20 ;doSum(i,j) ; } public static void t1(int num){num 20 ;Sys…

STM32CubeMX和HAL库-新建项目

目录 新建项目 选择开发板 MCU图形化配置界面总览 MCU配置 新建项目 新建项目包含选择MCU创建项目、选择开发板新建项目和交叉选择MCU新建项目三部分。 1. 选择MCU创建项目 单击主菜单项File→New Project,或Home视图上的ACCESS TO MCU SELECTOR 按钮&#xff0c…

Mac+Pycharm配置PyQt6教程

安装包 pip install PyQt6 PyQt6-tools #查看Qt版本 pip show PyQt6 pip show pyqt6-tools 配置扩展工具 QTD(界面设计) Program:/Users/wan/PycharmProjects/NewDemo/venv/lib/python3.11/site-packages/qt6_applications/Qt/bin/Designer.app Working directo…

dubbo 服务消费原理分析之服务目录

文章目录 前言一、RegistryDirectory1、DynamicDirectory2、RegistryProtocol.doCreateInvoker2、RegistryProtocol.subscribe3、ListenerRegistryWrapper.subscribe4、FailbackRegistry.subscribe5、ZookeeperRegistry.doSubscribe6、RegistryDirectory.notify7、RegistryDire…

无人叉车里程计模块专题

1.无人叉车里程计模块传感器要求 2.里程计功能需求 3.无人叉车里程计模块测试用例 4.无人叉车里程计算法方案 5.源码

合理应用词云图,快速提升你的幻灯展示效果!|科研插图·24-09-08

小罗碎碎念 本期主题:词云图 这一期推文介绍一个非常具有实用价值的图——词云图,正好最近在准备开题答辩的PPT,顺手写一期推文,和大家分享一下。 R语言和Python的代码都准备了一份,其中Python的版本就是我用自己开始…

复制PPT模板

文章目录 环境需求步骤参考 环境 Windows 11 家庭中文版WPS Office:2024夏季更新 (17827) 注:查看WPS Office版本的方法: 点击左上角的“WPS Office”图标,然后点击右上角的三条横线,在弹出菜单中,选择“…

仕考网:公务员面试流程介绍

通知进面信息——资格审查——面试签到——抽签候考 面试形式: 面试分为结构化和无领导小组两种形式 1.在结构化面试中,当轮到某位考生时,引导员将在候考室宣布其编号,随后考生跟随引导人员前往考场入口。考生在开始考试时需回…

Origin画图——怎么才能使折线图更好看

1.这是化的原始图,看着也不错,但是总觉得缺少什么东西 2.下面就来对其进行改造,首先改的是坐标轴和标签。刻度的显示,网格线取消,坐标轴上轴右轴的刻度取消,字体的大小与style改成Arial。 3.对图层底色…