【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的應用服務只接受“吃了嗎”的問候,一個高級的應用服務只接受“早上好”這樣的問候。是不是有點像“精神質”的人,沒錯,把計算機當成一個很軸的人去理解,一切都能講的通了。

習慣了這一點,你的任督二脈差不多就打通了。

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