【HTTP协议其实很简单】01.天王盖地虎,你怎么回应?----什么是“协议”?

HTTP协议作为互联网的基础协议之一,其重要性不用多言。很多初学者对HTTP协议都是一直蒙、一直蒙、一直蒙…

直到某一天,似乎是天灵盖被雷劈了一下,任督二脉瞬间打通,对于HTTP协议突然全明白了。

学习技术本来没有那么复杂,只是作为书本中的文字首先要做到的是准确无误,这并不容易,最好的办法就是采用专业的术语,所以要学习专业的文章得先把这篇文章的专业术语搞清楚,这就给初学者造成很多的困扰,也是我曾经的困扰。

所以一直想写一个系列文章,帮助初学者,不需要去学习那么多的专业基础知识就能快速的理解HTTP协议,文章中举的例子,用的术语可能不专业,甚至有解释放在更深层去讲会有些错误,这些只是为了帮助初学者能更容易的理解场景所涉及的概念。如果您发现对初学者会造成误导请告诉我,我一定会纠正。

接下来言归正传,进入正文。

天王盖地虎

多年前的某天,老妖误入“糗百”,得知“天王盖地虎”这一暗号,心血来潮想知道身边还有哪些人是组织的人,于是跑去跟老妖婆说:天王盖地虎。

老妖婆答曰:宝塔镇河妖。

老妖白眼一翻,不是组织的人,闪之。

到厕所拿出手机,朋友圈发个消息:天王盖地虎。不到半小时,10多人回复:小鸡炖蘑菇。另有七大姑八大姨、大舅、二舅、三舅等等回复:宝塔镇河妖。


看出来了么?一句暗号,两种不同回复,自然分出了两类人群。 回复“宝塔镇河妖” 的是看过《林海雪源》的人群,回复“小鸡炖蘑菇”的是新一代网民。

这暗号就是人们之间的默契,而这个默契只有你们知道,其它人并不知道。人与之间共同的规则、习惯我们可以称之为默契、暗号等。而放在软件开发领域,这就是协议。

互联网上每时每刻都在发生着这样的事情:手机、电脑打开一个网页、发送一个请求、提交一个数据包…

试想一下如果大家没有统一的规则来处理这些数据包,那就像各种不同语言的人坐在一起聊天一样,谁也不知道谁在说什么。

所以,简单来说,协议就是不同的人(计算机)采用同样的一套规则来处理他们之间传输的数据、信息。


下面来看看专业的解释:

image

协议,网络协议的简称,网络协议是通信计算机双方必须共同遵从的一组约定。如怎么样建立连接、怎么样互相识别等。只有遵守这个约定,计算机之间才能相互通信交流。它的三要素是:语法、语义、时序。

这其中“语法、语义、时序”三要素是非常重要的,但对很多人来说这三要素并不好理解。

这里我想吐槽一下:语文学不好、知识面不够,干什么都吃亏,你都不知道人家在说什么。没有高人给你指点,被人骂你还觉得很开心,所以遇到蒙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的应用服务只接受“吃了吗”的问候,一个高级的应用服务只接受“早上好”这样的问候。是不是有点像“精神质”的人,没错,把计算机当成一个很轴的人去理解,一切都能讲的通了。

习惯了这一点,你的任督二脉差不多就打通了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章