一些关于协议的思考

/ 0评 / 1

通信协议(英语:Communications Protocol,也称传输协议)在电信中是指在任何物理介质中允许两个或多个在传输系统中的终端之间传播信息的系统标准,也是指计算机通信或网络设备的共同语言。 通信协议定义了通信中的语法学, 语义学和同步规则以及可能存在的错误检测与纠正。通信协议在硬件,软件或两者之间皆可实现 。

—— 中文维基百科

每日接触

打开熟悉的 Visual Studio 选择你正在调试的工程,打一个 Breakpoint,运行时你不出意外会在 VS 的左下角看到这样的一个窗口:

一块内存区域截图

很明显,这是一块以16进制展现数据的内存截图;我们都知道,内存用来在程序的运行时保存各种临时数据 - 作为计算机行业的爱好者,我们甚至可以脱口而出每个数据类型在各种平台上的默认长度等等...

但是,现在的问题是,谁能告诉我上面的一段内存区域表示了什么样的数据呢?

大家可能会觉得我这个问题问的十分的荒谬,因为事实上这个问题是无解的 - 在没有给定这片内存区域所表示数据的类型之前,这些数据是完全没有意义的。

那么,如果将我们作为信息的接收者,这个 Debug 的窗口作为发送者,这些内存数据作为被发送的信息,我们之所以无法理解这些信息,是因为在这个信息交换的过程中缺少了一个重要的组成部分:协议。

重新思考

在上面的例子中,我们将自己作为了信息的接受者;然而现实中,我们不像 Google 的大佬那样人人都是人形编译器,程序最终还是要交给编译器去编译的;编译器在编译的过程中同样需要知道每一个变量的类型:

sth = 1; // 不可以通过
int sth; // 可以编译通过

即使在动态类型语言中(例如 Pyhon),解释器在解释过程中仍然会为我们尝试推导这个变量最合适的类型;而我们都知道,在 Python 这样语言中是不存在单独声明变量的这种行为的,需要将变量的声明和赋值放在一起:

>>> a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined
>>> int a
  File "<stdin>", line 1
    int a
        ^
SyntaxError: invalid syntax
>>> a = 1
>>>

这就是因为 Python 需要为我们自动推导数据的类型进行存储,没有类型,解释器根本不知道需要为你申请多少内存,以及如何解读存下来的数据。

换个思路想想:在编程语言中,我们就可以将类型系统看作一种协议,它规定了程序 - 计算机内存之间的数据交换格式。

网络之中

回到最开始我们的定义 - 网络通信协议;我们大家都很熟悉 OSI 的 7 层模型 - 我们的互联网络像一个洋葱一样的层层工作,其中涉及到的协议千千万,但是就像维基百科给出的定义那样,在不考虑容错以及将消息同步交给下层协议工作的情况下,任何规定了语义的共同语言都可以算成一种通讯协议。

我们不妨看几个例子即可明白:

ARP协议

这是工作在链接层的 ARP 协议报文格式,由 RFC 826 提出定义,它用来将网络地址转换成为 MAC 地址,算是 IPv4 协议簇中非常重要也是很基础的一个协议。

HTTP帧格式

这是 RFC 7540 规定的 HTTP 帧格式,因为 HTTP 基于 TCP 协议实现,而 TCP 是一个以流方式工作的协议,所以 HTTP 以帧格式规定。

可以发现,即使是工作在应用层的 HTTP 协议,也和工作在链接层的 ARP 协议一样,核心都是规定了数据交换格式的一组语言,本质上并没有太大差别。

回到生活

那么现在回头想想,我们学习的外语是不是也可以看作一种协议呢?

我们每个人学习外语的过程可以看作是在大脑这个层面安装一种协议,这种协议规定了音频信号、视觉信号、还有语法信息的处理;在学会一种语言之前我们听外国人(老毛子)说话肯定是一脸懵逼;但在这之后,我们便能够了解音频信号中的信息含义。

而在说话时,我们大脑内的信息被这种协议的语法规定所编码,并通过大脑的指令信息让气流通过、声带振动发出声音。

总结

其实这些都是我瞎想的,但是认真思考一下,如果将协议的概念从互联网中剥离出来,并加以推广,我们的整个世界的信息交换过程都可以看作由各种各样的协议参与。

而人类之所以能够有如此的进步,其中的信息交换也离不开各种而样的协议参与。也许,人们正是被这种自然界中的“协议”潜移默化的影响着,才会将互联网协议设计成为今天的样子吧~

知识共享许可协议
本作品采用知识共享署名 4.0 国际许可协议进行许可。

发表评论

电子邮件地址不会被公开。 必填项已用*标注