天王盖地虎,你怎么回应?什么是协议
HTTP协议作为互联网的基础协议之一,其重要性不用多言。很多初学者对HTTP协议都是一直蒙、一直蒙、一直蒙......
直到某一天,似乎是天灵盖被雷劈了一下,任督二脉瞬间打通,对于HTTP协议突然全明白了。
学习技术本来没有那么复杂,只是作为书本中的文字首先要做到的是准确无误,这并不容易,最好的办法就是采用专业的术语,所以要学习专业的文章得先把这篇文章的专业术语搞清楚,这就给初学者造成很多的困扰,也是我曾经的困扰。
所以一直想写一个系列文章,帮助初学者,不需要去学习那么多的专业基础知识就能快速的理解HTTP协议,文章中举的例子,用的术语可能不专业,甚至有解释放在更深层去讲会有些错误,这些只是为了帮助初学者能更容易的理解场景所涉及的概念。如果您发现对初学者会造成误导请告诉我,我一定会纠正。
接下来言归正传,进入正文。
天王盖地虎
多年前的某天,老妖误入“糗百”,得知“天王盖地虎”这一暗号,心血来潮想知道身边还有哪些人是组织的人,于是跑去跟老妖婆说:天王盖地虎。
老妖婆答曰:宝塔镇河妖。
老妖白眼一翻,不是组织的人,闪之。
到厕所拿出手机,朋友圈发个消息:天王盖地虎。不到半小时,10多人回复:小鸡炖蘑菇。另有七大姑八大姨、大舅、二舅、三舅等等回复:宝塔镇河妖。
看出来了么?一句暗号,两种不同回复,自然分出了两类人群。 回复“宝塔镇河妖” 的是看过《林海雪源》的人群,回复“小鸡炖蘑菇”的是新一代网民。
这暗号就是人们之间的默契,而这个默契只有你们知道,其它人并不知道。人与之间共同的规则、习惯我们可以称之为默契、暗号等。而放在软件开发领域,这就是协议。
互联网上每时每刻都在发生着这样的事情:手机、电脑打开一个网页、发送一个请求、提交一个数据包......
试想一下如果大家没有统一的规则来处理这些数据包,那就像各种不同语言的人坐在一起聊天一样,谁也不知道谁在说什么。
所以,简单来说,协议就是不同的人(计算机)采用同样的一套规则来处理他们之间传输的数据、信息。
下面来看看专业的解释:
协议,网络协议的简称,网络协议是通信计算机双方必须共同遵从的一组约定。如怎么样建立连接、怎么样互相识别等。只有遵守这个约定,计算机之间才能相互通信交流。它的三要素是:语法、语义、时序。
这其中“语法、语义、时序”三要素是非常重要的,但对很多人来说这三要素并不好理解。
这里我想吐槽一下:语文学不好、知识面不够,干什么都吃亏,你都不知道人家在说什么。没有高人给你指点,被人骂你还觉得很开心,所以遇到蒙B的概念,找人问是王道。
好吧,我们来看看这三要素吧。
语法
语法:即数据与控制信息的结构或格式;
你看,对于这样的解释,我在学习的过程中天天吐槽。什么数据、什么控制信息的结构,都不知道说的什么鸟语,其实简单粗暴一点理解,就是文字(数据包)的顺序。 比如说,当你打电话和女朋友要告白未婚,准备说的话是:
亲爱的,我想让你当我孩子的妈妈。
结果你把顺序搞错了,说成了:
亲爱的妈妈,我想让你当我的孩子。
这样一来不仅女朋友不知道你说的什么,连妈妈和孩子也乱套了。估计你连自己是谁都不知道了。
放在编程的处理上面就是发送数据方,对数据编排规则与接收数据放的解读规则是相同的即可。这一点说实话对于不理解计算机运行原理的人,可能会有点不好理解。因为人是人,有智慧,有的时候顺序乱那么一点,并不影响人get到信息的核心。例如下面这句话(请细仔看):
研表究明,汉字序顺并不一定影阅响读。
但是计算机就不一样了,要敢这样颠倒,计算机(cheng xu yuan)会疯掉的,他会认为这句话完全无法理解。
语义
语义:即需要发出何种控制信息,完成何种动作以及做出何种响应;
这个相对可能还好理解一些,就是“我叫你吃米”,你别理解成“我叫你吃屎”就行了。(汉字太牛B了,米死掉就成了屎,膜拜膜拜。。。)
同样放在编程的处理上,就是发送方希望接收方执行一条指令,发送方的指令与接收方对指令的理解和执行是准确无误的。
比如,发送方求计算:1+1。而接收方如果把计算公式搞成了1*1,那就是错误的。
时序
时序(同步),即事件实现顺序的详细说明。
一件事一件事,一句话一句话的先后顺序别乱了就行了。继续表白吧,比如你想说:亲爱的,我想让你当我孩子的妈妈,等孩子长大了,我们老了,我们一起去见上帝。
来看看乱序是什么样的: 亲爱的,我们一起去见上帝,等孩子长大了,然后我们老了,我想让你当我孩子的妈妈。
是不是有点乱。再举个简单的例子你就能明白了,比如说我们打电话的过程,电话拨通后,我们会等待对方接通电话,电话彩铃结束,我们会说一句:喂,你好。然后对方也会说一句:喂,你好。
一般情况下我们会等到对方说完“喂,你好”之后才会说正事,为什么要说这两句呢?很简单,确认对方拿起电话,已经做好了说正事的准备。这个过程就像经典的TCPIP三次握手一样。
第一次
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
这是客户端在告诉服务端:喂,你好。
第二次
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(seq=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
服务器端回复:喂,你好。
第三次
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
客户端再确认:好,我听到了,咱们说正事吧。
那么三次握手如果乱掉或者不完整会出现什么情况呢?我们来设想一下:
第一次:客户端->服务器:喂,你好。
第二次:服务器->客户端:喂,你好。
第三次:客户端不理服务器了。 这时服务器会怎么样?是不是会说:喂,喂,喂,能听见吗?
看见没?任务无法完成。
利用这个过程,有些人就会干一些坏事,比如说:基于三次握手的SYN洪水攻击,这也是网络攻击的基本原理,利用协议修改请求的语法、语义和时序,让服务器脱离原有的运行规则,达到攻击的目的。
在所有的网络协议中应用最为广泛的就是tcp/ip协议了,而http协议是在tcp/ip协议基础上的。
他们之间的关系就像,汉语和中国人打电话的问候习惯一样。汉语是一套协议,中国人打电话的问题习惯也是一套协议。
汉语是中国人沟通的基础,就像TCP/IP协议,汉语解决的所有中国人之间沟通的语言问题,而TCP/IP协议,解决的是网络中所有的设备之间数据传输的基本规则。汉语和英语的关系就像TCP/IP和UDP的关系,是两个世界,这两个世界相互无法沟通。
HTTP协议则像中国人打电话的问候习惯一样,是在一类场景之下的有效沟通方式。打电话的问候习惯和当面的沟通习惯是有差别,如果你用乱了就会造成不适应。在计算机的世界就更为严重,你用HTTP协议去连接FTP的服务,根本无法达成目的。
最后,总结一下,理解计算机世界完全可以用人类世界的思维方式,只是你需要把人类之间一点点的不适应放大到无限,比如人和人之间交流的时候,比较正式一点的方式是:早上好。非正式的方式可能是:吃了吗?其实没什么差别只是问候而已,正式场合之下,敏感一点的人会觉得这人有点土包子,而街坊邻居中敏感一点的人会觉得这人有点格格不处,仅此而已。仅仅是敏感一点的人还可以正常和你交流,只是会感觉有点怪怪的,而有些”精神质"一点的人可能压根不答理你。
而计算机世界中,这一点点不同会被无限放大,这两种问候方式是有着本质的差别,你可以理解为一个LOW的应用服务只接受“吃了吗”的问候,一个高级的应用服务只接受“早上好”这样的问候。是不是有点像“精神质”的人,没错,把计算机当成一个很轴的人去理解,一切都能讲的通了。
习惯了这一点,你的任督二脉差不多就打通了。