文章將包含以下幾方面內(nèi)容:
HTTP協(xié)議解讀與HTTP相關(guān)組件與HTTP相關(guān)協(xié)議HTTP組成HTTP協(xié)議優(yōu)缺點(diǎn)HTTP協(xié)議解讀HTTP是一種超文本傳輸協(xié)議(HypertextTransferProtocol),超文本傳輸協(xié)議可以進(jìn)行文字分割:超文本(Hypertext)、傳輸(Transfer)、協(xié)議(Protocol),它們之間的關(guān)系如下:
分別對(duì)這三個(gè)名次做一個(gè)解釋:
超文本兩臺(tái)電腦之間只能傳輸簡(jiǎn)單文字,后面還想要傳輸圖片、音頻、視頻,甚至點(diǎn)擊文字或圖片能夠進(jìn)行超鏈接的跳轉(zhuǎn),那么文本的語(yǔ)義就被擴(kuò)大了,這種語(yǔ)義擴(kuò)大后的文本就被稱為超文本(Hypertext)。
傳輸兩臺(tái)計(jì)算機(jī)之間會(huì)形成互聯(lián)關(guān)系進(jìn)行通信,我們存儲(chǔ)的超文本會(huì)被解析成為二進(jìn)制數(shù)據(jù)包,由傳輸載體(例如同軸電纜,***線,光纜)負(fù)責(zé)把二進(jìn)制數(shù)據(jù)包由計(jì)算機(jī)終端傳輸?shù)搅硪粋€(gè)終端的過(guò)程
協(xié)議網(wǎng)絡(luò)協(xié)議就是網(wǎng)絡(luò)中(包括互聯(lián)網(wǎng))傳遞、管理信息的一些規(guī)范
與HTTP相關(guān)組件網(wǎng)絡(luò)設(shè)計(jì)者以分層(layer)的方式組織協(xié)議,每個(gè)協(xié)議屬于層次模型之一。每一層都是向它的上一層提供服務(wù)(service),即所謂的服務(wù)模型(servicemodel)。每個(gè)分層中所有的協(xié)議稱為協(xié)議棧(protocolstack)。因特網(wǎng)的協(xié)議棧由五個(gè)部分組成:物理層、鏈路層、網(wǎng)絡(luò)層、傳輸層和應(yīng)用層。我們采用自上而下的***研究其原理,也就是應(yīng)用層->物理層的方式(了解)。
應(yīng)用層應(yīng)用層是網(wǎng)絡(luò)應(yīng)用程序和網(wǎng)絡(luò)協(xié)議存放的分層,因特網(wǎng)的應(yīng)用層包括許多協(xié)議。比如HTTP,電子郵件傳送協(xié)議SMTP、端系統(tǒng)文件上傳協(xié)議FTP、還有為我們進(jìn)行域名解析的DNS協(xié)議
傳輸層輸層在應(yīng)用程序斷點(diǎn)之間傳送應(yīng)用程序報(bào)文,在這一層主要有兩種傳輸協(xié)議TCP和UDP。
TCP是面向連接的,它能夠控制并確認(rèn)報(bào)文是否到達(dá),并提供了擁塞機(jī)制來(lái)控制網(wǎng)絡(luò)傳輸,因此當(dāng)網(wǎng)絡(luò)擁塞時(shí),會(huì)抑制其傳輸速率。
UDP協(xié)議向它的應(yīng)用程序提供了無(wú)連接服務(wù)。它是不具備可靠性的,沒(méi)有流量控制,也沒(méi)有擁塞控制。我們把運(yùn)輸層的分組稱為報(bào)文段(segment)
網(wǎng)絡(luò)層網(wǎng)絡(luò)層負(fù)責(zé)將稱為數(shù)據(jù)報(bào)(datagram)的網(wǎng)絡(luò)分層從一臺(tái)主機(jī)移動(dòng)到另一臺(tái)主機(jī)。網(wǎng)絡(luò)層一個(gè)非常重要的協(xié)議是IP協(xié)議,所有具有網(wǎng)絡(luò)層的因特網(wǎng)組件都必須運(yùn)行IP協(xié)議。
鏈路層為了將分組從一個(gè)節(jié)點(diǎn)(主機(jī)或路由器)運(yùn)輸?shù)搅硪粋€(gè)節(jié)點(diǎn),網(wǎng)絡(luò)層必須依靠鏈路層提供服務(wù)。鏈路層的例子包括以太網(wǎng)、WiFi和電纜接入的DOCSIS協(xié)議,因?yàn)閿?shù)據(jù)從源目的地傳送通常需要經(jīng)過(guò)幾條鏈路,一個(gè)數(shù)據(jù)包可能被沿途不同的鏈路層協(xié)議處理,我們把鏈路層的分組稱為幀(frame)。
物理層雖然鏈路層的作用是將幀從一個(gè)端系統(tǒng)運(yùn)輸?shù)搅硪粋€(gè)端系統(tǒng),而物理層的作用是將幀中的一個(gè)個(gè)比特從一個(gè)節(jié)點(diǎn)運(yùn)輸?shù)搅硪粋€(gè)節(jié)點(diǎn),,物理層的協(xié)議仍然使用鏈路層協(xié)議,這些協(xié)議與實(shí)際的物理傳輸介質(zhì)有關(guān),例如,以太網(wǎng)有很多物理層協(xié)議:關(guān)于雙絞銅線、關(guān)于同軸電纜、關(guān)于光纖等等。
五層網(wǎng)絡(luò)協(xié)議的示意圖如下:
與HTTP相關(guān)協(xié)議HTTP屬于應(yīng)用層的協(xié)議,需要其他層次協(xié)議的配合完成信息的交換,在完成一次HTTP請(qǐng)求和響應(yīng)的過(guò)程中,需要以下協(xié)議的配合:
TCP/IPTCP/IP我們一般稱之為協(xié)議簇,什么意思呢?就是TCP/IP協(xié)議簇中不僅僅只有TCP協(xié)議和IP協(xié)議,它是一系列網(wǎng)絡(luò)通信協(xié)議的統(tǒng)稱。而其中最核心的兩個(gè)協(xié)議就是TCP/IP協(xié)議,其他的還有UDP、ICMP、ARP等等,共同構(gòu)成了一個(gè)復(fù)雜但有層次的協(xié)議棧。
TCP協(xié)議的全稱是Tran***issionControlProtocol的縮寫,意思是傳輸控制協(xié)議,HTTP使用TCP作為通信協(xié)議,這是因?yàn)門CP是一種可靠的協(xié)議,而可靠能保證數(shù)據(jù)不丟失。
IP協(xié)議的全稱是InternetProtocol的縮寫,它主要解決的是通信雙方尋址的問(wèn)題。IP協(xié)議使用IP地址來(lái)標(biāo)識(shí)互聯(lián)網(wǎng)上的每一臺(tái)計(jì)算機(jī)。
DNSDNS的全稱是域名系統(tǒng)(DomainNameSystem,縮寫:DNS),它作為將域名和IP地址相互映射的一個(gè)分布式數(shù)據(jù)庫(kù),能夠使人更方便地訪問(wèn)互聯(lián)網(wǎng)。比如:www.google.com->193.XXX.XXX.XXX
URI/URL可以通過(guò)輸入www.google.com地址來(lái)訪問(wèn)谷歌的官網(wǎng),輸入的地址格式必須要滿足URI的規(guī)范。
URI的全稱是(UniformResourceIdentifier),中文名稱是統(tǒng)一資源標(biāo)識(shí)符,使用它就能夠唯一地標(biāo)記互聯(lián)網(wǎng)上資源。
URL的全稱是(UniformResourceLocator),中文名稱是統(tǒng)一資源定位符,也就是我們俗稱的網(wǎng)址,它實(shí)際上是URI的一個(gè)子集。
HTTP報(bào)文起始行(startline):描述請(qǐng)求或響應(yīng)的基本信息;頭部字段(header):使用key-value形式更詳細(xì)地說(shuō)明報(bào)文;消息正文(entity):實(shí)際傳輸?shù)臄?shù)據(jù),它不一定是純文本,可以是圖片、視頻等二進(jìn)制數(shù)據(jù)。起始行和頭部字段并成為請(qǐng)求頭或者響應(yīng)頭,統(tǒng)稱為Header;消息正文也叫做實(shí)體,稱為body。HTTP協(xié)議規(guī)定每次發(fā)送的報(bào)文必須要有Header,但是可以沒(méi)有body,在header和body之間必須要有一個(gè)空行(CRLF)。
舉個(gè)例子:http://www.someSchool.edu/someDepartment/home.index請(qǐng)求的請(qǐng)求頭:
報(bào)文的起始行都是由三個(gè)字段組成:***、URL字段和HTTP版本字段。
HTTP請(qǐng)求***GET獲取資源,GET***用來(lái)請(qǐng)求訪問(wèn)已被URI識(shí)別的資源。指定的資源經(jīng)服務(wù)器端解析后返回響應(yīng)內(nèi)容。POST傳輸實(shí)體,使用POST傳輸實(shí)體信息,提交表格內(nèi)容。PUT傳輸文件,PUT***用來(lái)傳輸文件。就像FTP協(xié)議的文件上傳一樣,要求在請(qǐng)求報(bào)文的主體中包含文件內(nèi)容,然后保存到請(qǐng)求URI指定的位置。但是,鑒于HTTP的PUT***自身不帶驗(yàn)證機(jī)制,任何人都可以上傳文件,存在安全性問(wèn)題,因此一般的Web網(wǎng)站不使用該***。若配合Web應(yīng)用程序的驗(yàn)證機(jī)制,或架構(gòu)設(shè)計(jì)采用REST(REpresentationalStateTransfer,表征狀態(tài)轉(zhuǎn)移)標(biāo)準(zhǔn)的同類Web網(wǎng)站,就可能會(huì)***使用PUT***。HEAD獲得響應(yīng)首部,HEAD***和GET***一樣,只是不返回報(bào)文主體部分。用于確認(rèn)URI的有效性及資源更新的日期時(shí)間等。DELETE刪除文件,DELETE***用來(lái)刪除文件,是與PUT相反的***。DELETE***按請(qǐng)求URI刪除指定的資源。OPTIONS詢問(wèn)支持的***,OPTIONS***用來(lái)查詢針對(duì)請(qǐng)求URI指定的資源支持的***。TRACE追蹤路徑,TRACE***是讓W(xué)eb服務(wù)器端將之前的請(qǐng)求通信環(huán)回給客戶端的***。CONNECT要求用隧道協(xié)議連接代理,CONNECT***要求在與代理服務(wù)器通信時(shí)建立隧道,實(shí)現(xiàn)用隧道協(xié)議進(jìn)行TCP通信。主要使用SSL(SecureSocketsLayer,安全套接層)和TLS(TransportLayerSecurity,傳輸層安全)協(xié)議把通信內(nèi)容加密后經(jīng)網(wǎng)絡(luò)隧道傳輸。一般最常用的***也就是GET***和POST***,其他***暫時(shí)了解即可。
HTTP請(qǐng)求URL完整的域名解析一下URL:http://www.example.com:80/path/to/myfile.html?key1=value1&key2=value2#SomewhereInTheDocument
http://告訴瀏覽器使用何種協(xié)議。www.example.com是域名、主機(jī),指示了需要向網(wǎng)絡(luò)上的哪一臺(tái)主機(jī)發(fā)起請(qǐng)求。也可以直接向主機(jī)的ip發(fā)起請(qǐng)求。端口兩個(gè)主機(jī)之間要發(fā)起TCP連接需要兩個(gè)條件,主機(jī)+端口,表示用于訪問(wèn)Web服務(wù)器上資源的入口,如果訪問(wèn)的該Web服務(wù)器使用HTTP協(xié)議的標(biāo)準(zhǔn)端口(HTTP為80,HTTPS為443)授予對(duì)其資源的訪問(wèn)權(quán)限,則通常省略此部分。否則端口就是URI必須的部分。路徑/path/to/myfile.html是Web服務(wù)器上資源的路徑。以端口后面的第一個(gè)/開(kāi)始,到?號(hào)之前結(jié)束,中間的每一個(gè)/都代表了層級(jí)(上下級(jí))關(guān)系。查詢參數(shù)?key1=value1&key2=value2是提供給Web服務(wù)器的額外參數(shù)。如果是GET請(qǐng)求,一般帶有請(qǐng)求URL參數(shù),如果是POST請(qǐng)求,則不會(huì)在路徑后面直接加參數(shù)。
錨點(diǎn)#SomewhereInTheDocument是資源本身的某一部分的一個(gè)錨點(diǎn)。錨點(diǎn)代表資源內(nèi)的一種“書簽”。請(qǐng)求頭部比如http://www.someSchool.edu/someDepartment/home.index,來(lái)看一下它的請(qǐng)求頭部
Host:www.someschool.eduConnection:closeUser-agent:Mozilla/5.0Accept-language:fr復(fù)制代碼Host:表示的是對(duì)象所在的主機(jī)Connection:close表示的是瀏覽器需要告訴服務(wù)器使用的是非持久連接。它要求服務(wù)器在發(fā)送完響應(yīng)的對(duì)象后就關(guān)閉連接。User-agent:這是請(qǐng)求頭用來(lái)告訴Web服務(wù)器,瀏覽器使用的類型是Mozilla/5.0,即Firefox瀏覽器。Accept-language告訴Web服務(wù)器,瀏覽器想要得到對(duì)象的法語(yǔ)版本。HTTP的請(qǐng)求標(biāo)頭分為四種:通用標(biāo)頭、請(qǐng)求標(biāo)頭、響應(yīng)標(biāo)頭和實(shí)體標(biāo)頭
通用標(biāo)頭通用標(biāo)頭主要有三個(gè),分別是Date、Cache-Control和ConnectionDate
Date出現(xiàn)在請(qǐng)求標(biāo)頭和響應(yīng)標(biāo)頭中,它的基本表示如下
Date:Wed,21Oct201507:28:00GMT復(fù)制代碼Cache-Control
Cache-Control可以出現(xiàn)在請(qǐng)求標(biāo)頭和響應(yīng)標(biāo)頭中,Cache-Control的種類比較多,雖然說(shuō)這是一個(gè)通用標(biāo)頭,但是又一些特性是請(qǐng)求標(biāo)頭具有的,有一些是響應(yīng)標(biāo)頭才有的。主要大類有可緩存性、閾值性、重新驗(yàn)證并重新加載和其他特性
Connection
Connection決定當(dāng)前事務(wù)(一次三次握手和四次揮手)完成后,是否會(huì)關(guān)閉網(wǎng)絡(luò)連接。Connection有兩種,一種是持久性連接,即一次事務(wù)完成后不關(guān)閉網(wǎng)絡(luò)連接
Connection:keep-alive復(fù)制代碼復(fù)制代碼另一種是非持久性連接,即一次事務(wù)完成后關(guān)閉網(wǎng)絡(luò)連接
Connection:close復(fù)制代碼實(shí)體標(biāo)頭實(shí)體標(biāo)頭是描述消息正文內(nèi)容的HTTP標(biāo)頭。實(shí)體標(biāo)頭用于HTTP請(qǐng)求和響應(yīng)中。頭部Content-Length、Content-Language、Content-Encoding是實(shí)體頭。
Content-Length實(shí)體報(bào)頭指示實(shí)體主體的大小,以字節(jié)為單位,發(fā)送到接收方。Content-Language實(shí)體報(bào)頭描述了客戶端或者服務(wù)端能夠接受的語(yǔ)言,例如Content-Language:de-DEContent-Language:en-USContent-Language:de-DE,en-CA復(fù)制代碼復(fù)制代碼Content-Encoding這又是一個(gè)比較麻煩的屬性,這個(gè)實(shí)體報(bào)頭用來(lái)壓縮媒體類型。Content-Encoding指示對(duì)實(shí)體應(yīng)用了何種編碼。常見(jiàn)的內(nèi)容編碼有這幾種:gzip、compress、deflate、identity,這個(gè)屬性可以應(yīng)用在請(qǐng)求報(bào)文和響應(yīng)報(bào)文中Accept-Encoding:gzip,deflate//請(qǐng)求頭Content-Encoding:gzip//響應(yīng)頭復(fù)制代碼請(qǐng)求標(biāo)頭GET/home.htmlHTTP/1.1Host:developer.mozilla.orgUser-Agent:Mozilla/5.0(Macintosh;IntelMacOSX10.9;rv:50.0)Gecko/20100101Firefox/50.0Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Language:en-US,en;q=0.5Accept-Encoding:gzip,deflate,brReferer:https://developer.mozilla.org/testpage.htmlConnection:keep-aliveUpgrade-Insecure-Requests:1If-Modified-Since:Mon,18Jul201602:36:04GMTIf-None-Match:"c561c68d0ba92bbeb8b0fff2a9199f722e3a621a"Cache-Control:max-age=0復(fù)制代碼Host
Host請(qǐng)求頭指明了服務(wù)器的域名,以及(可選的)服務(wù)器監(jiān)聽(tīng)的TCP端口號(hào)
Referer
HTTPReferer屬性是請(qǐng)求標(biāo)頭的一部分,告訴服務(wù)器該網(wǎng)頁(yè)是從哪個(gè)頁(yè)面鏈接過(guò)來(lái)的
If-Modified-Since
HTTP的If-Modified-Since使其成為條件請(qǐng)求:
返回200,只有在給定日期的最后一次修改資源后,服務(wù)器才會(huì)以200狀態(tài)發(fā)送回請(qǐng)求的資源。如果請(qǐng)求從開(kāi)始以來(lái)沒(méi)有被修改過(guò),響應(yīng)會(huì)返回304并且沒(méi)有任何響應(yīng)體If-Modified-Since通常會(huì)與If-None-Match搭配使用,If-Modified-Since用于確認(rèn)代理或客戶端擁有的本地資源的有效性。獲取資源的更新日期時(shí)間,可通過(guò)確認(rèn)首部字段Last-Modified來(lái)確定。
大白話說(shuō)就是如果在Last-Modified之后更新了服務(wù)器資源,那么服務(wù)器會(huì)響應(yīng)200,如果在Last-Modified之后沒(méi)有更新過(guò)資源,則返回304。
If-Modified-Since:Mon,18Jul201602:36:04GMT復(fù)制代碼復(fù)制代碼If-None-Match
If-None-MatchHTTP請(qǐng)求標(biāo)頭使請(qǐng)求成為條件請(qǐng)求。對(duì)于GET和HEAD***,僅當(dāng)服務(wù)器沒(méi)有與給定資源匹配的ETag時(shí),服務(wù)器才會(huì)以200狀態(tài)發(fā)送回請(qǐng)求的資源。對(duì)于其他***,僅當(dāng)最終現(xiàn)有資源的ETag與列出的任何值都不匹配時(shí),才會(huì)處理請(qǐng)求。
If-None-Match:"c561c68d0ba92bbeb8b0fff2a9199f722e3a621a"復(fù)制代碼復(fù)制代碼內(nèi)容協(xié)商內(nèi)容協(xié)商機(jī)制是指客戶端和服務(wù)器端就響應(yīng)的資源內(nèi)容進(jìn)行交涉,然后提供給客戶端最為適合的資源。內(nèi)容協(xié)商會(huì)以響應(yīng)資源的語(yǔ)言、字符集、編碼方式等作為判斷的標(biāo)準(zhǔn)。
內(nèi)容協(xié)商主要有以下3種類型:
服務(wù)器驅(qū)動(dòng)協(xié)商(Server-drivenNegotiation)這種協(xié)商方式是由服務(wù)器端進(jìn)行內(nèi)容協(xié)商。服務(wù)器端會(huì)根據(jù)請(qǐng)求首部字段進(jìn)行自動(dòng)處理
客戶端驅(qū)動(dòng)協(xié)商(Agent-drivenNegotiation)這種協(xié)商方式是由客戶端來(lái)進(jìn)行內(nèi)容協(xié)商。
透明協(xié)商(TransparentNegotiation)是服務(wù)器驅(qū)動(dòng)和客戶端驅(qū)動(dòng)的結(jié)合體,是由服務(wù)器端和客戶端各自進(jìn)行內(nèi)容協(xié)商的一種***。
內(nèi)容協(xié)商的分類有很多種,主要的幾種類型是Accept、Accept-Charset、Accept-Encoding、Accept-Language、Content-Language。
Accept
接受請(qǐng)求HTTP標(biāo)頭會(huì)通告客戶端其能夠理解的MIME類型
MIME:MIME(MultipurposeInternetMailExtensions)是描述消息內(nèi)容類型的因特網(wǎng)標(biāo)準(zhǔn)。MIME消息能包含文本、圖像、音頻、視頻以及其他應(yīng)用程序?qū)S玫臄?shù)據(jù)。復(fù)制代碼文本文件:text/html、text/plain、text/css、application/xhtml+xml、application/xml
圖片文件:image/jpeg、image/gif、image/png
視頻文件:video/mpeg、video/quicktime
應(yīng)用程序二進(jìn)制文件:application/octet-stream、application/zip
比如,如果瀏覽器不支持PNG圖片的顯示,那Accept就不指定image/png,而指定可處理的image/gif和image/jpeg等圖片類型。
一般MIME類型也會(huì)和q這個(gè)屬性一起使用,q是什么?q表示的是權(quán)重,來(lái)看一個(gè)例子
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8復(fù)制代碼若想要給顯示的媒體類型增加優(yōu)先級(jí),則使用q=來(lái)額外表示權(quán)重值,沒(méi)有顯示權(quán)重的時(shí)候默認(rèn)值是1.0。
q
MIME
1.0
text/html
1.0
application/xhtml+xml
0.9
application/xml
0.8
*/*
Accept-Charset
accept-charset屬性規(guī)定服務(wù)器處理表單數(shù)據(jù)所接受的字符集。
accept-charset屬性允許您指定一系列字符集,服務(wù)器必須支持這些字符集,從而得以正確解釋表單中的數(shù)據(jù)。
Accept-Language
首部字段Accept-Language用來(lái)告知服務(wù)器用戶代理能夠處理的自然語(yǔ)言集(指中文或英文等),以及自然語(yǔ)言集的相對(duì)優(yōu)先級(jí)。
Accept-Language:en-US,en;q=0.5復(fù)制代碼響應(yīng)標(biāo)頭響應(yīng)標(biāo)頭是可以在HTTP響應(yīng)中使用的HTTP標(biāo)頭。并不是所有出現(xiàn)在響應(yīng)中的標(biāo)頭都是響應(yīng)標(biāo)頭。還有一些特殊的我們上面說(shuō)過(guò),有通用標(biāo)頭和實(shí)體標(biāo)頭也會(huì)出現(xiàn)在響應(yīng)標(biāo)頭中,比如Content-Length就是一個(gè)實(shí)體標(biāo)頭,但是,在這種情況下,這些實(shí)體請(qǐng)求通常稱為響應(yīng)頭。下面以一個(gè)例子為例和你探討一下響應(yīng)頭
200OKAccess-Control-Allow-Origin:*Connection:Keep-AliveContent-Encoding:gzipContent-Type:text/html;charset=utf-8Date:Mon,18Jul201616:06:00GMTEtag:"c561c68d0ba92bbeb8b0f612a9199f722e3a621a"Keep-Alive:timeout=5,max=997Last-Modified:Mon,18Jul201602:36:04GMTServer:ApacheSet-Cookie:mykey=myvalue;expires=Mon,17-Jul-201716:06:00GMT;Max-Age=31449600;Path=/;secureTransfer-Encoding:chunkedVary:Cookie,Accept-Encodingx-frame-options:DENY復(fù)制代碼響應(yīng)狀態(tài)碼
以2xx為開(kāi)頭的都表示請(qǐng)求成功響應(yīng)。
狀態(tài)碼
含義
200
成功響應(yīng)
204
請(qǐng)求處理成功,但是沒(méi)有資源可以返回
206
對(duì)資源某一部分進(jìn)行響應(yīng),由Content-Range指定范圍的實(shí)體內(nèi)容。
以3xx為開(kāi)頭的都表示需要進(jìn)行附加操作以完成請(qǐng)求
狀態(tài)碼
含義
301
永久性重定向,該狀態(tài)碼表示請(qǐng)求的資源已經(jīng)重新分配URI,以后應(yīng)該使用資源現(xiàn)有的URI
302
臨時(shí)性重定向。該狀態(tài)碼表示請(qǐng)求的資源已被分配了新的URI,希望用戶(本次)能使用新的URI訪問(wèn)。
303
該狀態(tài)碼表示由于請(qǐng)求對(duì)應(yīng)的資源存在著另一個(gè)URI,應(yīng)使用GET***定向獲取請(qǐng)求的資源。
304
該狀態(tài)碼表示客戶端發(fā)送附帶條件的請(qǐng)求時(shí),服務(wù)器端允許請(qǐng)求訪問(wèn)資源,但未滿足條件的情況。
307
臨時(shí)重定向。該狀態(tài)碼與302Found有著相同的含義。
以4xx的響應(yīng)結(jié)果表明客戶端是發(fā)生錯(cuò)誤的原因所在。
狀態(tài)碼
含義
400
該狀態(tài)碼表示請(qǐng)求報(bào)文中存在語(yǔ)法錯(cuò)誤。當(dāng)錯(cuò)誤發(fā)生時(shí),需修改請(qǐng)求的內(nèi)容后再次發(fā)送請(qǐng)求。
401
該狀態(tài)碼表示發(fā)送的請(qǐng)求需要有通過(guò)HTTP認(rèn)證(BASIC認(rèn)證、DIGEST認(rèn)證)的認(rèn)證信息。
403
該狀態(tài)碼表明對(duì)請(qǐng)求資源的訪問(wèn)被服務(wù)器拒絕了。
404
該狀態(tài)碼表明服務(wù)器上無(wú)法找到請(qǐng)求的資源。
以5xx為開(kāi)頭的響應(yīng)標(biāo)頭都表示服務(wù)器本身發(fā)生錯(cuò)誤
狀態(tài)碼
含義
500
該狀態(tài)碼表明服務(wù)器端在執(zhí)行請(qǐng)求時(shí)發(fā)生了錯(cuò)誤。
503
該狀態(tài)碼表明服務(wù)器暫時(shí)處于超負(fù)載或正在進(jìn)行停機(jī)維護(hù),現(xiàn)在無(wú)法處理請(qǐng)求。
HTTP協(xié)議優(yōu)缺點(diǎn)HTTP的優(yōu)點(diǎn)簡(jiǎn)單靈活易擴(kuò)展HTTP的協(xié)議比較簡(jiǎn)單,它的主要組成就是header+body,頭部信息也是簡(jiǎn)單的文本格式
HTTP協(xié)議又多了靈活和易擴(kuò)展的優(yōu)點(diǎn)。
HTTP協(xié)議里的請(qǐng)求***、URI、狀態(tài)碼、原因短語(yǔ)、頭字段等每一個(gè)核心組成要素都沒(méi)有被制定死,允許開(kāi)發(fā)者任意定制、擴(kuò)充或解釋,給予了瀏覽器和服務(wù)器最大程度的信任和自由。
應(yīng)用廣泛、環(huán)境成熟天然具有跨語(yǔ)言、跨平臺(tái)的優(yōu)越性,而且,因?yàn)楸旧淼暮?jiǎn)單特性很容易實(shí)現(xiàn),所以幾乎所有的編程語(yǔ)言都有HTTP調(diào)用庫(kù)和外圍的開(kāi)發(fā)測(cè)試工具
無(wú)狀態(tài)既是優(yōu)點(diǎn)又是缺點(diǎn)。因?yàn)榉?wù)器沒(méi)有記憶能力,所以就不需要額外的資源來(lái)記錄狀態(tài)信息,不僅實(shí)現(xiàn)上會(huì)簡(jiǎn)單一些,而且還能減輕服務(wù)器的負(fù)擔(dān),能夠把更多的CPU和內(nèi)存用來(lái)對(duì)外提供服務(wù)。
HTTP的缺點(diǎn)無(wú)狀態(tài)服務(wù)器沒(méi)有記憶能力,它就無(wú)法支持需要連續(xù)多個(gè)步驟的事務(wù)操作。每次都得問(wèn)一遍身份信息,需要增加了不必要的數(shù)據(jù)傳輸量。由此出現(xiàn)了Cookie技術(shù)。
安全性明文傳輸,協(xié)議里的報(bào)文(準(zhǔn)確地說(shuō)是header部分)不使用二進(jìn)制數(shù)據(jù),而是用簡(jiǎn)單可閱讀的文本形式。
對(duì)比TCP、UDP這樣的二進(jìn)制協(xié)議,它的優(yōu)點(diǎn)顯而易見(jiàn),不需要借助任何外部工具,用瀏覽器、Wireshark或者tcpdump抓包后,直接用肉眼就可以很容易地查看或者修改,為我們的開(kāi)發(fā)調(diào)試工作帶來(lái)極大的便利。
當(dāng)然缺點(diǎn)也是顯而易見(jiàn)的,就是不安全,可以被監(jiān)聽(tīng)和被窺探。因?yàn)闊o(wú)法判斷通信雙方的身份,不能判斷報(bào)文是否被更改過(guò)。
總結(jié)起來(lái)即:
明文,請(qǐng)求報(bào)文未加密;未hash,即使報(bào)文被修改過(guò)也不知道;未驗(yàn)證身份,容易導(dǎo)致中間人攻擊;作者:captain_p鏈接:https://juejin.cn/post/7041744237905346568
如果本文對(duì)你有幫助,麻煩轉(zhuǎn)發(fā)關(guān)注支持一下