经常听一些技术牛人演讲,张嘴闭嘴就是某某协议。各种协议成百上千种,小白听了一脸懵,又不敢多问。协议像只能意会不能言传的东西。介绍具体协议的资料通篇生硬的描述,只有本来就懂的人才能看懂。
本文不解读具体协议,仅用通俗的话谈谈对计算机世界“协议”的理解。一句话,协议就是法律,这个法律规定了不同的系统之间交换信息时如何解读信息。
如果一个人看一篇没有标点符号的文章,他可以根据常识,对文章进行断句,能大概分辨标题、作者、正文,以及文章表达了什么。但计算机系统不是人,不能对接受的一串信息进行智能的断句。所以要硬性的规定,第几个字到第几个字是标题,第几个字到第几个字是作者,......第几个字到第几个字是故事正文。有了这个规定,即使盲人也能将标题、作者、正文准确的提取出来了,一个一个数就可以了呀。当然这是最简单的规定,复杂的也可以用空格,回车,空行,关键字,特殊符号,标签等来区分信息要素。这些规定就是计算机世界的法律,被称作协议。这些协议保证了计算机各个系统可以正确的交换信息。生活中的法律有多种,适用不同的情况。同理计算机世界协议几百上千种。浏览网页有http协议,传输文件有ftp协议,发邮件有smtp协议。程序员按规定的接口(函数长什么样子)实现代码,这也是在遵守一种协议,否则不同人开发的代码没法成功互相调用。
有的大公司自己有内部协议,也可能被叫做报文格式。如果你参与开发这类公司的系统,还要遵守这些内部协议,否则内部系统之间就没法交流了。
上图是http协议的格式规定,所有用来浏览网页的客户端和服务端,无论用什么语言开发,什么架构,都要按照上图的样子发送数据和解析接收到的数据。如果你违背了这个协议,比如你发送数据没按上面的格式拼,所有网页都打不开。服务器接收数据没按照上面的格式解析,那就完全不知道对方在请求什么了。
下面wireshark抓包工具,抓取访问中国日报cn.chinadaily.com.cn的http数据为例,说明浏览器是严格按照http协议要求发送请求的。
下面的红框表示数据流是http协议的。在上面红框处,右键->追踪流->http,查看http数据如下
对照抓包数据和http请求的协议规定的格式,方法是GET ,URL是/image/2016/p-19.jpg,协议版本是HTTP/1.1,后面都是头部字段名:值回车换行的格式了。这些格式都是浏览器按照规范拼装的,所有浏览器无论具体实现差异多大,发送出的数据都是这个模子的。
大家可能听说过RFC文档,编号都不知道到多少了。这些文档规定了很多互联网数据格式。例如RFC2821,RFC2822对电子邮件数据格式做了规定。其中一条是,邮件头和邮件体之间必须要有一个空行,假设你用Python写发送邮件的功能,拼装的邮件数据缺少这一空行,很可能这封邮件是发送不出去的。说很可能是因为有的邮件服务器没有严格遵守协议,或者就是个bug,用这个邮件服务器对应的邮箱是能成功发送邮件的。但是为了保证用任何邮件服务器都能成功,大家开发相关功能时最好严格遵守相关协议。
通信领域的各种协议也是一样的道理,不管各家公司具体怎么实现,只要最后的数据拼的符合协议,信号符合规定,就完成了功能。
总之,协议就是法律,做哪个领域的工作,就遵守那个领域的法律。遇到大牛说协议不用慌,找到对应文档一句一句读,读完你比他都熟悉这个协议了。