轉(zhuǎn)自http://mp.weixin.qq.com/s/27zpNIGhVbx-on9FDs_6dw
本書是介紹怎么編寫一個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é)議浑槽。
我們通過一個簡單的圖來闡述這個過程:
** 瀏覽器與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所示:
** **分層的好處是把各個相對獨立的功能解耦嫌褪,層與層之間通過規(guī)定好的接口來通信呀枢。如果以后需要修改或者重寫某一個層的實現(xiàn),只要接口保持不變也不會影響到其他層的功能笼痛。接下來裙秋,我們將會介紹各個層的主要作用琅拌。
-
應(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é)議)等未玻。 -
傳輸層
傳輸層通過系統(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é)議)。 -
網(wǎng)絡(luò)層
網(wǎng)絡(luò)層用來處理在網(wǎng)絡(luò)上流動的數(shù)據(jù)包昼激,數(shù)據(jù)包是網(wǎng)絡(luò)傳輸?shù)淖钚?shù)據(jù)單位舞终。該層規(guī)定了通過怎樣的路徑(傳輸路線)到達(dá)對方計算機(jī),并把數(shù)據(jù)包傳輸給對方癣猾。 -
鏈路層
鏈路層用來處理連接網(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所示:
由于下層協(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:
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地址的過程:
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可以知道慎陵,當(dāng)客戶端訪問Web站點時,首先會通過DNS服務(wù)查詢到域名的IP地址喻奥。然后瀏覽器生成HTTP請求席纽,并通過TCP/IP協(xié)議發(fā)送給Web服務(wù)器。Web服務(wù)器接收到請求后會根據(jù)請求生成響應(yīng)內(nèi)容撞蚕,并通過TCP/IP協(xié)議返回給客戶端润梯。