揭開(kāi)HTTP網(wǎng)絡(luò)協(xié)議神秘面紗系列(一)
1.了解Web及網(wǎng)絡(luò)基礎(chǔ)
TCP/IP協(xié)議族按層次可以分為下面四層:
應(yīng)用層:決定了向用戶提供應(yīng)用服務(wù)時(shí)通信的活動(dòng),TCP/IP協(xié)議族內(nèi)預(yù)存了各類(lèi)通用的應(yīng)用服務(wù),比如:FTP(文件傳輸協(xié)議)和DNS(域名系統(tǒng))服務(wù)就是其中兩類(lèi),HTTP協(xié)議也處于該層。
傳輸層:對(duì)上層應(yīng)用,提供處于網(wǎng)絡(luò)連接中的兩臺(tái)計(jì)算機(jī)之間的數(shù)據(jù)傳輸。在傳輸層有兩個(gè)性質(zhì)不同的協(xié)議:TCP(傳輸控制協(xié)議)和UDP(用戶數(shù)據(jù)報(bào)協(xié)議)
網(wǎng)絡(luò)層:用來(lái)處理在網(wǎng)絡(luò)上流動(dòng)的數(shù)據(jù)包,數(shù)據(jù)包是網(wǎng)絡(luò)的傳輸最小數(shù)據(jù)單位,該層規(guī)定了通過(guò)怎樣的路徑(所謂的傳輸路線)到達(dá)對(duì)方計(jì)算機(jī),并把數(shù)據(jù)包傳送給對(duì)方。與對(duì)方計(jì)算機(jī)之間通過(guò)多臺(tái)計(jì)算機(jī)或網(wǎng)絡(luò)設(shè)備進(jìn)行傳輸時(shí),網(wǎng)絡(luò)層所起的作用就是在眾多的選項(xiàng)內(nèi)選擇一條傳輸路線。
鏈路層:用來(lái)處理連接網(wǎng)絡(luò)的硬件部分,包括控制操作系統(tǒng),硬件的設(shè)備驅(qū)動(dòng),NIC,及光纖等物理可見(jiàn)部分(還包括連接器等一切傳輸媒介),硬件上的范疇均在鏈路層的作用范圍之內(nèi)。
利用TCP/IP協(xié)議族進(jìn)行網(wǎng)絡(luò)通信時(shí),會(huì)通過(guò)分層順序與對(duì)方進(jìn)行通信,發(fā)送端從應(yīng)用層往下走,接收端則往應(yīng)用層往上走,就拿發(fā)送端的客戶端在應(yīng)用層(HTTP協(xié)議)發(fā)出一個(gè)想看某個(gè)Web頁(yè)面的HTPP請(qǐng)求為例,如下圖示:
發(fā)送端在層與層之間傳輸數(shù)據(jù)時(shí),每經(jīng)過(guò)一層時(shí)必定會(huì)被打上一個(gè)該層所屬的首部信息,反之,接收端在層與層傳輸數(shù)據(jù)時(shí),每經(jīng)過(guò)一層時(shí)會(huì)把對(duì)應(yīng)的首部消去,這種把數(shù)據(jù)信息包裝起來(lái)的做法稱(chēng)為封裝。
負(fù)責(zé)傳輸?shù)腎P協(xié)議:作用是把各種數(shù)據(jù)包傳送給對(duì)方,其指明了節(jié)點(diǎn)被分配到的地址,而MAC地址是指網(wǎng)卡所屬的固定地址,IP間的通信依賴MAC地址,在網(wǎng)絡(luò)上,通信的雙方在同一局域網(wǎng)內(nèi)的情況較少,通常是經(jīng)過(guò)多臺(tái)計(jì)算機(jī)和網(wǎng)絡(luò)設(shè)備中轉(zhuǎn)才能連接到對(duì)方,在中轉(zhuǎn)時(shí),會(huì)利用下一站中轉(zhuǎn)設(shè)備的MAC地址來(lái)搜索下一個(gè)中轉(zhuǎn)目標(biāo),這時(shí),會(huì)采用ARP協(xié)議(ARP是一種用以解析地址的協(xié)議,根據(jù)通信方的IP地址就可以反查出對(duì)應(yīng)的MAC地址)。例子如圖:
#p#
TCP協(xié)議為了準(zhǔn)確無(wú)誤的將數(shù)據(jù)送達(dá)目標(biāo)處,TCP協(xié)議采用了三次握手策略,其握手過(guò)程中用了三個(gè)標(biāo)記:FLAG-SYN和ACK,該過(guò)程如圖:
注意:若在握手過(guò)程中某個(gè)階段莫名中斷,TCP協(xié)議會(huì)再次以相同的順序發(fā)送相同的數(shù)據(jù)包。*
DNS服務(wù)是和HTTP協(xié)議一樣位于應(yīng)用層的協(xié)議,它提供域名到IP地址之間的解析服務(wù)其兩者關(guān)系如圖:
各種協(xié)議與HTTP協(xié)議的關(guān)系就如圖所示:
URI用字符標(biāo)識(shí)某一互聯(lián)網(wǎng)資源,而URL表示資源的地點(diǎn)(互聯(lián)網(wǎng)上所處的位置),故URL是URI的子集。
URI格式通常包括以下幾個(gè):
登陸信息
服務(wù)器地址(IP或域名)
服務(wù)器端口號(hào)
帶層次的文件路徑
查詢字符串
片段標(biāo)識(shí)
URI格式例子如圖:
黑色:協(xié)議方案名
紅色:登陸信息(認(rèn)證)
淺綠色:服務(wù)器地址
淺藍(lán)色:服務(wù)器端口號(hào)
紫色:帶層次的文件路徑
深藍(lán)色:查詢字符串
深綠色:片段標(biāo)識(shí)符
#p#
2.簡(jiǎn)單的HTTP協(xié)議
請(qǐng)求報(bào)文:是由請(qǐng)求方法,請(qǐng)求URI,協(xié)議版本,可選的請(qǐng)求首部字段和內(nèi)容實(shí)體構(gòu)成的。
響應(yīng)報(bào)文:基本上由協(xié)議版本,狀態(tài)碼(表示請(qǐng)求成功或失敗的數(shù)字代碼),用以解釋狀態(tài)碼的原因短語(yǔ),可選的響應(yīng)首部字段以及實(shí)體主體構(gòu)成。
HTTP是一種不保存狀態(tài)的協(xié)議,即不保留之前一切的請(qǐng)求或響應(yīng)報(bào)文的信息,為了解決這問(wèn)題,許多網(wǎng)站引入了Cookie技術(shù),例如:許多登陸網(wǎng)站就是用Cookie技術(shù)來(lái)保持登陸狀態(tài)。
告知服務(wù)器意圖的HTTP方法有以下幾個(gè):
- GET:獲取資源,如果請(qǐng)求的資源是文本,那就保持原樣返回,如果是像CGI那樣的程序,則返回經(jīng)過(guò)執(zhí)行后的輸出結(jié)果。
- POST:主要用來(lái)傳輸實(shí)體的主體,而不是獲取響應(yīng)的主體內(nèi)容。
- PUT:傳輸文件,要求請(qǐng)求報(bào)文中包含文件內(nèi)容,但是HTTP/1.1PUT方法自身不帶驗(yàn)證機(jī)制,任何人都可以上傳文件,存在安全性問(wèn)題,故一般有開(kāi)發(fā)此功能的Web網(wǎng)站都會(huì)配合Web應(yīng)用程序的驗(yàn)證機(jī)制,如:REST機(jī)制。
HEAD:不獲取返回報(bào)文主體部分,而是獲取其URI的有效性及資源更新的日期時(shí)間等首部字段。
DELETE:用來(lái)刪除文件,但是HTTP/1.1Delete方法自身也不帶驗(yàn)證機(jī)制,任何人都可以刪除文件,存在安全性問(wèn)題,故一般有開(kāi)發(fā)此功能的Web網(wǎng)站都會(huì)配合Web應(yīng)用程序的驗(yàn)證機(jī)制,如:REST機(jī)制。
OPTIONS:用來(lái)查詢針對(duì)請(qǐng)求URI指定的資源。
TRACE:在用其發(fā)送請(qǐng)求時(shí),在Max-Forwards首部字段中填入數(shù)值,每經(jīng)過(guò)一個(gè)服務(wù)器端就將該數(shù)字減1,當(dāng)數(shù)值剛好減到0時(shí),就停止繼續(xù)傳輸,最后接收到請(qǐng)求的服務(wù)器端則返回狀態(tài)碼200OK的響應(yīng),因此可以查詢發(fā)送出去的請(qǐng)求是怎樣被加工修改的。
CONNECT:要求在與代理服務(wù)器通信時(shí)建立隧道,實(shí)現(xiàn)用隧道協(xié)議進(jìn)行TCP通信,主要使用SSL和TLS協(xié)議把通信內(nèi)容加密后經(jīng)網(wǎng)絡(luò)隧道傳輸。
HTTP持久連接:keep-alive(持久連接)的特點(diǎn)是,只要任意一端沒(méi)有明確提出斷開(kāi)連接,則保持TCP連接狀態(tài),好處在于減少了TCP連接的重復(fù)建立和斷開(kāi)所造成的額外開(kāi)銷(xiāo),減輕了服務(wù)器端的負(fù)載,也減少了開(kāi)銷(xiāo)的那部分時(shí)間,是HTTP請(qǐng)求和響應(yīng)能夠更早的結(jié)束。
管管線化技術(shù)可以讓客戶端同時(shí)并行發(fā)送多個(gè)請(qǐng)求,而不需要一個(gè)接一個(gè)地等待響應(yīng)。
HTTP是無(wú)狀態(tài)協(xié)議優(yōu)勢(shì)在于它減少服務(wù)器的CPU及內(nèi)存資源的消耗,但它不能保持之前的狀態(tài)進(jìn)行請(qǐng)求處理,這樣需要在登陸認(rèn)證的Web頁(yè)面中那個(gè),每次請(qǐng)求 跳轉(zhuǎn)頁(yè)面都需要再次認(rèn)證登陸或附上請(qǐng)求認(rèn)證參數(shù),因此為了解決這個(gè)問(wèn)題,可以引用Cookie技術(shù),該過(guò)程如圖: