1.1 协议与协议分层
上文说过,设备之间要想进行通信,必须遵循一套相同的通信标准,而这个标准就是“协议”。鉴于协议的作用是保障通信设备不会自说自话,因此很多同类图书会将协议比作计算机之间交流的“语言”。只有遵循“协议”制定的传输标准,网络中的所有设备才可以相互通信,否则就会遇到鸡同鸭讲的尴尬局面。
下面说说啥叫协议分层。
我不说估计你也知道:计算机网卡上连接的那根5类线只能传输电信号,别说传不了照片、声音、视频、文字,就连数字也没法传输。所以,如果你需要通过它把照片、声音、视频、文字传输给朋友,就得用你的那台计算机把这些照片、声音、视频、文字用电信号描述出来,再通过这根线发送出去。这些电信号经过繁多的网络设备,最终转发到你朋友面前的那台计算机连接的5类线中。于是,你朋友的计算机也就通过这根5类线接收到了描述这些照片、声音、视频、文字的电信号,然后由这台计算机再把它们解读成原先的照片、声音、视频、文字。
然而,你要是认为上面的过程就是通信的全部,那么会忽略通信过程中最重要却最容易被人们遗忘的环节。
我在部队大院里长大,院里的服务社旁边有个邮筒。我们家在上海、无锡等地都有亲戚。小时候,家人经常带我去给亲戚寄信,但寄信这件事让年幼的我对邮筒这个东西产生了莫名的好奇。我相当有把握地以为,只要把信投到了邮筒里,信就会沿着邮筒下面那根空心的柱子,一直飞到收信人那一边(见图1-2)。所以,我很好奇邮筒是怎么让装在里面的信件突破万有引力定律,沿着地下四通八达的通道飞到各地邮筒中的。五岁的一天,我路过邮筒,惊讶地发现有一个穿着制服的叔叔把里面的信件都掏了出来,装在一个大麻布袋子里!我向邮筒里探头张望时,清楚地看到里面根本没有什么通道。那一刻,我感到自己幼小的心灵被无情地欺骗了。我愤怒地冲过去质问那个叔叔,是不是所有的信都是他假装成亲戚回复给我们的。
伪装成收信人回复信息这种事,在网络技术领域中倒是真实存在的,属于通过中间人攻击(MITM)实现欺骗攻击的一种网络攻击方式。但在现实世界中,除了政、商大咖和各国特工,恐怕也很少有人会遇到这种糟心事。那个身穿制服的叔叔大概认为这孩子简直是无理取闹,关上邮箱一溜烟跑了。是奶奶后来在晚上看电视的时候给我解释了整个通信的过程。原来,信件在传递的过程中并不是只由收发双方经手,中途还要经过很多人的转发。
图1-2 我所理解的寄信过程
既然信件不是写信人与收信人之间的直接对话,网络通信当然也不是。但是当用户通过网络进行远程通信时,他们也会自然而然地忽略中间的过程——遗忘那些跨越万水千山为他们转发信息的设备,尽管这些设备客观存在。当然,这些“网络邮递员”设备和我们那些连着鼠标、键盘、显示器的家用计算机在职能上相去甚远。用户发送的数据在转换成电信号发送给这些设备时,也需要经过它们的解读才能转发,就像邮递员也得看过信封上的地址才知道该把信件送去哪里的道理一样。
以很多人熟悉的QQ为例,我们都知道QQ不光可以传输文字,还可以传输图片、文件,甚至还能实现语音、视频通话。那么这些文字、图片、声音和图像是以什么形式在网线中传输的呢?就像前面所介绍的那样,这些数据是以电信号的形式在网线中传输的。而在QQ通信的例子中,数据是经过了多种协议的处理,经历了多重形式上的改变,历经了多台设备的转发,最终才到达目的地,并以正确的形式展示给你的朋友。在这个过程中,信息每穿越一台设备,就必须经过一些由电信号转换为数据、再由数据转换为电信号的过程。
这个过程光是想想就觉得头大,但它还涉及了一系列的问题,比如下面列举的情形。
● 我们的计算机需要知道去对方计算机的具体路径吗?
● 中间的传输设备需要了解我们双方的聊天内容吗?
这就像是在问:当我向邮筒里投入信件的时候,我自己需要知道怎么去这些亲戚家吗?邮递员需要知道信件的内容吗?
答案应该没有争议:不需要。
在通信的过程中,让所有参与通信的设备都具备所有能力、获得所有信息,这既不可能也不必要。我们的计算机只管捕捉声音和图像,中间传输设备只管将数据传输到正确的目的地。它们是工作在不同层面的设备。
只通过设备解释分层的问题,未免失之肤浅,我们再深入一步,尝试在一台设备内部解释一下分层的原因。
我每个月都会收到某银行信用卡中心发来的信件,内容无非是推荐我购买什么乱七八糟的奢侈品,或者消费什么五花八门的服务。那家银行告诉我,拥有他们银行白金、黑金信用卡的客户就会收到这种信件。我不自恋,确定自己不是这个星球上唯一一个拥有这家银行高端信用卡的客户,甚至亲眼看过YESLAB的总裁余建威老师在请客吃饭的时候刷过卡面和我这张完全相同的信用卡。我估计,余老师每个月也会和我一样花几秒来拆开一封类似的信件,再花十几分钟浏览其中那些让人眼花缭乱的彩页,最后用几秒时间把这封信丢进废纸篓。但就这家银行来说,每个月恐怕得发非常多这类信件。那么,银行内部的流程是什么样的呢?
如果在你的脑海中是这样一幅场景,那么你一定不太擅长管理类工作:在某机构,汇聚了很多负责向信用卡客户发送信件的人员,他们每个人的工作流程都是相同的——每个人分别设计一封这样的信件;然后对它进行排版;再把它印刷出来;接下来打印一个信封,把信装进信封封好;最后去邮政部门投递出去。于是,该机构到最近的邮局之间有一支长长的队伍,每人手里都拿着一封等待投递的信件(见图1-3)。
图1-3 排队投递信件
如果这还不能定义为荒唐,我对“荒唐”这个词的理解一定有偏差。
但我毕竟不为这家银行工作,所以也不敢肯定他们的流程到底是什么样的。为了写本书,我还专门请教了这家银行的理财经理。他告诉我,虽然他也不太了解这类事务,但他估计流程是这样的:信用卡中心的市场部门有专门的市场人员负责设计这封信件的内容,然后交给设计部门的人员对内容进行排版,再由某家印刷公司的员工把它们印刷出来,同时安排另一些人员按照客户的姓名和住址印制信封,此后由专人把信封封好,再由邮政或快递公司取走这些信封。
上述两种工作机制哪种更优秀不言自明。这说明了一个道理,当一个问题比较复杂的时候,最好的方法就是把它按照逻辑分成很多部分或者很多步骤,然后分别交由具有专门功能的机制来处理。如果我们把银行看成一台计算机,把最终发出来的信件解释成信息,你会发现这封信在交给快递之前的处理过程就是分层完成的。
如果除了效率,你还需要别的理由来理解分层处理的优越性,我再介绍两点。
● 容易排错:如果有一天,信用卡中心的负责人接到投诉,发现有些客户没有及时收到这封信,他/她只要看一看处理过程卡在了哪一步,就可以立刻进行处理,否则只能进行全面排查。
● 可以分别对各层的工作进行调整和替换:比如有一天,信用卡中心的负责人突然意识到有另一家快递公司比他们目前使用的这家更便宜,那么他/她只需要告诉负责将信发送给快递公司的人员就可以了。
同理,让计算机和传输设备分别使用不同层级的协议,实现不同的功能,这种“铁路警察,各管一段”的做法不但效率更高,而且在出现问题时也能够更好地定位问题涉及的范围,便于排错。更重要的是,技术管理人员可以针对某一层中的技术进行更新和替换,协议设计人员也可以针对某一层来设计相关的程序和标准。
关于协议分层,我们说了这么多的内容。在下一小节中,我需要介绍一个无法回避但同时也是最知名且最不靠谱的分层模型。