目录
协议
概念
示例 -- 摩斯密码
本质
作用
网络问题
引入
技术问题
应用问题
主机的对称性
问题对应的协议
问题出现的原因
理解协议(代码层面)
举例 -- 快递单
协议的最终表现形式
协议被双方主机认知的基础
协议
概念
- 协议是在计算机通信和数据传输中规定通信双方之间行为和数据格式的一组规则
- 这些规则确保了不同设备和系统之间的互操作性和正确的数据传递
- 协议定义了通信的步骤、数据的格式、错误处理机制等,使得通信双方能够理解和解释彼此之间传递的信息
示例 -- 摩斯密码
我们以现实中存在的协议来举例子,比如摩斯密码:
- 它规定,不同元素的排列代表了不同的含义:
- 也就是说,不用费劲巴拉的写复杂的字母和数字,二进制就可以完整的表示它们(简洁而统一)
并且双方都知道这些规则,只需要严格按照协议规定发送消息,就可以确保对方理解
- 它通常用于电报通信
- 摩斯密码的点和划可以通过电流的有无来表示
- 根据当时时代的发展限制,借助电流传导+二进制表示的方式,可以有效减少由于传输距离引起的信号衰减和失真
- 毕竟一套东西被设计出来,一定在某些方面是有用的,不然早就被淹没在历史长河中了
本质
协议本质上是一种约定,对所有人使用某资源的一种约定(就像你如果想要和中国人说话,就得会中文)
- 各方约定好一套规定,确保信息在参与方之间的一致性和可预测性
- 为什么要提出规定呢?自然是为了解决某个/某些问题
作用
协议本身,就是为了降低沟通的成本->也就减少了沟通出错的概率(相当于基数小了,自然出错的概率也会减少),比如:
- 面对不同的人/设备,统一的标准能减少问题的出现
- 如果要进行长距离传输,途中可能会出现各种问题,提前制定好应对措施可以减少出现错误的可能性
网络问题
引入
- 协议是为了解决某个具体问题才被提出的具体方案
- 而这里我们讨论的是关于网络的东西,所以针对的自然是网络通信中可能会出现的问题
- 知道了问题所在,也就能知道协议的内容和具体作用
技术问题
我们根据这张图,来思考不同主机在传递信息时会经过哪些,以及过程中会发生哪些问题:
数据传输必定通过设备来完成
- 所以,首先要考虑的是,数据如何准确无误地到达下一个设备?
设备与设备之间并不是一对一的
- 如何定位目标主机的位置呢?
在长距离传输中,会经过无数的设备,但我们无法确保设备不会出错,即使没有出错,也不能保证数据不出错
- 如何解决数据丢失/损坏的问题?
应用问题
除此之外,我们要明确一点,保证数据成功传输是我们最终的目的吗?
就像你网购,货物的运输过程你真的关心吗
- 实际上你需要的只是货物,以及拿到后我需要使用它
- 所以说,数据运输到位后如何被处理,也是我们需要考虑的(因为发来后,解码得到的只是二进制数据,并不是我们真正想要的形式)
- 比如,发来的视频数据可以被播放,图片数据可以被查看
主机的对称性
以上这些问题,在双方主机上都会存在,收发正常才能算可以通信
所以,需要在双方电脑上都解决这些问题,才能保证正常通信
问题对应的协议
上面说过,协议是为了解决某个具体问题提出的,所以针对这里的每个问题,都会有对应的协议
- 数据链路层协议 -- 解决设备之间的传输问题
- ip协议 -- 解决主机定位的问题
- tcp协议 -- 解决数据丢失/损坏的问题
- https/http/smtp/ftp -- 解决数据应用层面的问题
问题出现的原因
究其根本,为什么会出现这些问题呢?
- 如果我与你之间只有几十厘米,交流自然不成问题
- 扩大到几十米,就得喊着说了,中间还会存在各种阻碍(比如其他人/阻挡物)
- 再继续扩大,大到人与人不可能通过声音交流,就需要借助设备来交流
- 随着距离的增加,设备也会增加
- 自然而然的,随着以上需求的增加,技术就需要革新,这过程中必然有无数的问题暴露出来
理解协议(代码层面)
举例 -- 快递单
快递单其实也是一种协议
- 收件方,寄件方,快递公司都可以看懂上面的信息,比如:姓名,地址,邮寄编号,电话号码等等
- 通过这些信息你就可以确定对方的身份,这是多方之间做的一种约定(经手货物的人不同,但都认识快递单,可以通过快递单来得知需要的信息)
还有,快递一般都会有外包装(但实际上你只想要里面的货物),为什么要这样多此一举呢?
- 首先是保护隐私
- 其次是它上面贴着快递单,你需要快递单来确认信息
- 所以,和现实中类似,在网络世界中,你收到的信息不止有信息,还有一些额外的字段
- 他其实就是协议的具体实现,也被叫做"协议的报头"
协议的最终表现形式
回到代码方面,如果要用代码来表示快递单上的信息(姓名,电话,地址等等),你该如何做?
- 是不是就是定义一个结构体,用多个变量来表示?
- 而快递单的信息,正是由结构体+实际数据构成的
- 所以,协议的最终表现形式就是结构体对象
协议被双方主机认知的基础
所以,为什么协议可以被双方主机认识?
- 就是因为双方主机上都存在相同的结构体类型
- 传递一个结构体对象,就能使双方建立起约定
- (建立好约定后,就像双方都有相同的锁和钥匙,可以互相开对方的门)