HTTP協(xié)議詳解

HTTP協(xié)議詳解

原文鏈接:mp.weixin.qq.com

本書是介紹怎么編寫一個Web服務(wù)器姆涩,而Web服務(wù)器是基于HTTP(HyperText Transfer Protocol)協(xié)議實現(xiàn)的,所以要實現(xiàn)一個Web服務(wù)器就必須了解HTTP協(xié)議亏栈,本章主要介紹HTTP協(xié)議的相關(guān)知識,讓我們對HTTP協(xié)議有個理性的認(rèn)識黎侈。

1.1 HTTP協(xié)議簡介

我們?nèi)粘I钪薪?jīng)常會使用瀏覽器訪問Web站點峻汉,但是大家有思考過在這個過程中到底發(fā)生了什么嗎脐往?為什么我們在瀏覽器地址欄上面輸入要訪問的URL后就可以訪問到Web頁面呢?

1.1.1?瀏覽器背后的故事

當(dāng)我們在瀏覽器地址欄上輸入要訪問的URL后瘤礁,瀏覽器會分析出URL上面的域名梅尤,然后通過DNS服務(wù)器查詢出域名映射的IP地址克饶,瀏覽器根據(jù)查詢到的IP地址與Web服務(wù)器進(jìn)行通信,而通信的協(xié)議就是HTTP協(xié)議亡脑。

我們可以把這個過程類比成一個電話對話的過程邀跃。當(dāng)我們要打電話給某個人,首先要知道對方的電話號碼途戒,然后進(jìn)行撥號僵驰。打通電話后我們會進(jìn)行對話蒜茴,當(dāng)然要對話肯定需要共同的語言,如果一個人說國語顽腾,而另一個人說英語诺核,那肯定不能進(jìn)行溝通的久信。在本例中裙士,電話號碼相當(dāng)于上面的IP地址幌甘,而共同語言相當(dāng)于HTTP協(xié)議痊项。

我們通過一個簡單的圖來闡述這個過程:

圖1-1?瀏覽器訪問URL過程

?瀏覽器與Web服務(wù)器使用HTTP協(xié)議進(jìn)行通信鞍泉,那么什么是HTTP協(xié)議呢?接下來我們會詳細(xì)介紹HTTP協(xié)議的相關(guān)知識边器。

1.1.2?TCP/IP協(xié)議

HTTP協(xié)議是構(gòu)建在TCP/IP協(xié)議之上的忘巧,是TCP/IP協(xié)議的一個子集睦刃,所以要理解HTTP協(xié)議,有必要先了解下TCP/IP協(xié)議相關(guān)的知識际长。

由于TCP/IP協(xié)議族包含眾多的協(xié)議工育,在這里我們無法一一討論搓彻。接下來,我們僅介紹理解HTTP協(xié)議需要掌握的TCP/IP協(xié)議族的一些相關(guān)知識點竭沫。如果想深入理解TCP/IP協(xié)議骑篙,可以參考經(jīng)典書籍《TCP/IP詳解》靶端。

TCP/IP協(xié)議族分層

TCP/IP協(xié)議族是由一個四層協(xié)議組成的系統(tǒng)凛膏,這四層分別為:應(yīng)用層猖毫、傳輸層须喂、網(wǎng)絡(luò)層和數(shù)據(jù)鏈路層。如圖1-2所示:

圖1-2 TCP/IP協(xié)議族分層

?分層的好處是把各個相對獨立的功能解耦仔役,層與層之間通過規(guī)定好的接口來通信又兵。如果以后需要修改或者重寫某一個層的實現(xiàn)卒废,只要接口保持不變也不會影響到其他層的功能摔认。接下來,我們將會介紹各個層的主要作用电谣。

1)?應(yīng)用層

應(yīng)用層一般是我們編寫的應(yīng)用程序蓖柔,其決定了向用戶提供的應(yīng)用服務(wù)。應(yīng)用層可以通過系統(tǒng)調(diào)用與傳輸層進(jìn)行通信牢贸。

處于應(yīng)用層的協(xié)議非常多潜索,比如:FTP(File Transfer Protocol懂酱,文件傳輸協(xié)議)、DNS(Domain Name System整陌,域名系統(tǒng))和我們本章討論的HTTP(HyperText Transfer Protocol,超文本傳輸協(xié)議)等随夸。

2)?傳輸層

傳輸層通過系統(tǒng)調(diào)用向應(yīng)用層提供處于網(wǎng)絡(luò)連接中的兩臺計算機(jī)之間的數(shù)據(jù)傳輸功能宾毒。

在傳輸層有兩個性質(zhì)不同的協(xié)議:TCP(Transmission Control Protocol殿遂,傳輸控制協(xié)議)和UDP(User Data Protocol墨礁,用戶數(shù)據(jù)報協(xié)議)。

3)?網(wǎng)絡(luò)層

網(wǎng)絡(luò)層用來處理在網(wǎng)絡(luò)上流動的數(shù)據(jù)包妨退,數(shù)據(jù)包是網(wǎng)絡(luò)傳輸?shù)淖钚?shù)據(jù)單位蜕企。該層規(guī)定了通過怎樣的路徑(傳輸路線)到達(dá)對方計算機(jī)轻掩,并把數(shù)據(jù)包傳輸給對方懦底。

4)?鏈路層

鏈路層用來處理連接網(wǎng)絡(luò)的硬件部分,包括控制操作系統(tǒng)丐重、硬件設(shè)備驅(qū)動扮惦、NIC(Network Interface Card亲桦,網(wǎng)絡(luò)適配器)以及光纖等物理可見部分。硬件上的范疇均在鏈路層的作用范圍之內(nèi)豫领。

數(shù)據(jù)包封裝

上層協(xié)議數(shù)據(jù)是如何轉(zhuǎn)變?yōu)橄聦訁f(xié)議數(shù)據(jù)的呢等恐?這是通過封裝(encapsulate)來實現(xiàn)的。應(yīng)用程序數(shù)據(jù)在發(fā)送到物理網(wǎng)絡(luò)之前闪檬,會沿著協(xié)議棧從上往下傳遞购笆。每層協(xié)議都將在上層協(xié)議數(shù)據(jù)的基礎(chǔ)上加上自己的頭部信息(鏈路層還會加上尾部信息),以為實現(xiàn)該層功能提供必要的信息同欠。如圖1-3所示:

圖1-3?數(shù)據(jù)包封裝

發(fā)送端發(fā)送數(shù)據(jù)時样傍,數(shù)據(jù)會從上層傳輸?shù)较聦樱颐拷?jīng)過一層都會被打上該層的頭部信息铺遂。而接收端接收數(shù)據(jù)時衫哥,數(shù)據(jù)會從下層傳輸?shù)缴蠈樱瑐鬏斍皶严聦拥念^部信息刪除襟锐。過程如圖1-4所示:

圖1-4?數(shù)據(jù)傳輸過程

由于下層協(xié)議的頭部信息對上層協(xié)議是沒有實際的用途撤逢,所以在下層協(xié)議傳輸數(shù)據(jù)給上層協(xié)議的時候會把該層的頭部信息去掉,這個封裝過程對于上層協(xié)議來說是完全透明的粮坞。這樣做的好處是,應(yīng)用層只需要關(guān)心應(yīng)用服務(wù)的實現(xiàn)莫杈,而不用管底層的實現(xiàn)互例。

TCP三次握手

從上面的介紹可知,傳輸層協(xié)議主要有兩個:TCP協(xié)議和UDP協(xié)議筝闹。TCP協(xié)議相對于UDP協(xié)議的特點是:TCP協(xié)議提供面向連接媳叨、字節(jié)流和可靠的傳輸。

使用TCP協(xié)議進(jìn)行通信的雙方必須先建立連接关顷,然后才能開始傳輸數(shù)據(jù)糊秆。TCP連接是全雙工的,也就是說雙方的數(shù)據(jù)讀寫可以通過一個連接進(jìn)行议双。為了確保連接雙方可靠性痘番,在雙方建立連接時,TCP協(xié)議采用了三次握手(Three-way handshaking)策略聋伦。過程如圖1-5:

圖1-5 TCP三次握手

TCP協(xié)議三次握手的描述如下:

第一次握手:客戶端發(fā)送帶有SYN標(biāo)志的連接請求報文段夫偶,然后進(jìn)入SYN_SEND狀態(tài),等待服務(wù)端的確認(rèn)觉增。

第二次握手:服務(wù)端接收到客戶端的SYN報文段后兵拢,需要發(fā)送ACK信息對這個SYN報文段進(jìn)行確認(rèn)。同時逾礁,還要發(fā)送自己的SYN請求信息说铃。服務(wù)端會將上述的信息放到一個報文段(SYN+ACK報文段)中访惜,一并發(fā)送給客戶端,此時服務(wù)端將會進(jìn)入SYN_RECV狀態(tài)腻扇。

第三次握手:客戶端接收到服務(wù)端的SYN+ACK報文段后债热,會想服務(wù)端發(fā)送ACK確認(rèn)報文段,這個報文段發(fā)送完畢后幼苛,客戶端和服務(wù)端都進(jìn)入ESTABLISHED狀態(tài)窒篱,完成TCP三次握手。

當(dāng)三次握手完成后舶沿,TCP協(xié)議會為連接雙方維持連接狀態(tài)墙杯。為了保證數(shù)據(jù)傳輸成功,接收端在接收到數(shù)據(jù)包后必須發(fā)送ACK報文作為確認(rèn)括荡。如果在指定的時間內(nèi)(這個時間稱為重新發(fā)送超時時間)高镐,發(fā)送端沒有接收到接收端的ACK報文,那么就會重發(fā)超時的數(shù)據(jù)畸冲。

1.1.3?DNS服務(wù)

前面介紹了與HTTP協(xié)議有著密切關(guān)系的TCP/IP協(xié)議嫉髓,接下來介紹的DNS服務(wù)也是與HTTP協(xié)議有著密不可分的關(guān)系。

通常我們訪問一個網(wǎng)站邑闲,使用的是主機(jī)名或者域名來進(jìn)行訪問的算行。因為相對于IP地址(一組純數(shù)字),域名更容易讓人記住监憎。但TCP/IP協(xié)議使用的是IP地址進(jìn)行訪問的纱意,所以必須有個機(jī)制或服務(wù)把域名轉(zhuǎn)換成IP地址婶溯。DNS服務(wù)就是用來解決這個問題的鲸阔,它提供域名到IP地址之間的解析服務(wù)。

圖1-6展示了DNS服務(wù)把域名解析成IP地址的過程:


圖1-6 DNS服務(wù)原理

DNS服務(wù)是通過DNS協(xié)議進(jìn)行通信的迄委,而DNS協(xié)議跟HTTP協(xié)議一樣也是應(yīng)用層協(xié)議褐筛。由于我們的重點是HTTP協(xié)議,所以這里不打算對DNS協(xié)議進(jìn)行詳細(xì)的分析叙身,我們只需要知道可以通過DNS服務(wù)把域名解析成IP地址即可渔扎。

1.1.4?HTTP與TCP/IP、DNS的關(guān)系

到現(xiàn)在信轿,我們介紹了與HTTP協(xié)議有密切關(guān)系的TCP/IP協(xié)議和DNS服務(wù)晃痴,接下來我們通過圖1-7來整理一下HTTP協(xié)議與它們之間的關(guān)系:

圖1-7 HTTP與TCP/IP、DNS的關(guān)系

從圖1-7可以知道财忽,當(dāng)客戶端訪問Web站點時倘核,首先會通過DNS服務(wù)查詢到域名的IP地址。然后瀏覽器生成HTTP請求即彪,并通過TCP/IP協(xié)議發(fā)送給Web服務(wù)器紧唱。Web服務(wù)器接收到請求后會根據(jù)請求生成響應(yīng)內(nèi)容,并通過TCP/IP協(xié)議返回給客戶端。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末漏益,一起剝皮案震驚了整個濱河市蛹锰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌绰疤,老刑警劉巖铜犬,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異轻庆,居然都是意外死亡翎苫,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門榨了,熙熙樓的掌柜王于貴愁眉苦臉地迎上來煎谍,“玉大人,你說我怎么就攤上這事龙屉∧耪常” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵转捕,是天一觀的道長作岖。 經(jīng)常有香客問我,道長五芝,這世上最難降的妖魔是什么痘儡? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮枢步,結(jié)果婚禮上沉删,老公的妹妹穿的比我還像新娘。我一直安慰自己醉途,他們只是感情好矾瑰,可當(dāng)我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著隘擎,像睡著了一般殴穴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上货葬,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天采幌,我揣著相機(jī)與錄音,去河邊找鬼震桶。 笑死休傍,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的尼夺。 我是一名探鬼主播尊残,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼炒瘸,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了寝衫?” 一聲冷哼從身側(cè)響起顷扩,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎慰毅,沒想到半個月后隘截,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡汹胃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年婶芭,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片着饥。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡犀农,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出宰掉,到底是詐尸還是另有隱情呵哨,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布轨奄,位于F島的核電站孟害,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏挪拟。R本人自食惡果不足惜挨务,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望玉组。 院中可真熱鬧谎柄,春花似錦、人聲如沸球切。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吨凑。三九已至,卻和暖如春户辱,著一層夾襖步出監(jiān)牢的瞬間鸵钝,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工庐镐, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留恩商,地道東北人。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓必逆,卻偏偏與公主長得像怠堪,于是被迫代替她去往敵國和親揽乱。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容