HTTP是一種能夠獲取如HTML這樣網(wǎng)絡(luò)資源的協(xié)議。它是Web上數(shù)據(jù)交換的基礎(chǔ),是一種client-server協(xié)議,也就是說請(qǐng)求通常是由瀏覽器這樣的接受方發(fā)起的。一個(gè)完整的web文檔是由不同的子文檔重新組建而成的,像文本、樣式、圖片、視頻、腳本等等。

HTTP基本性質(zhì)
HTTP是簡單的
即便在HTTP/2中把HTTP消息封裝到了frames中,HTTP大體上還是被設(shè)計(jì)成可讀的而且簡單的。HTTP的消息能夠讓人讀懂且明白它的意思,還允許簡單的測試,放低了門檻,更有利于新來者了解。
HTTP是可擴(kuò)展的
在HTTP/1中就出現(xiàn)了,HTTP headers讓協(xié)議擴(kuò)展變得非常容易。只要服務(wù)端和客戶端在新的headers上語義達(dá)成一致,新的功能就可以輕松地被加進(jìn)來。
HTTP是無狀態(tài)的,有會(huì)話的
HTTP是無狀態(tài)的:在同一個(gè)連接中,兩個(gè)成功執(zhí)行的請(qǐng)求之間是沒有關(guān)系的。這就帶來一個(gè)問題,用戶沒辦法在一個(gè)網(wǎng)站進(jìn)行連續(xù)的交互。通過cookie的使用可以解決這個(gè)問題,讓用戶的每次請(qǐng)求都能共享相同的上下文信息,相同的狀態(tài),從而創(chuàng)建有狀態(tài)的會(huì)話。
HTTP和連接
一個(gè)連接是由傳輸層來控制的,基本不屬于HTTP的范圍內(nèi)。然而HTTP并不需要下面的傳輸層的協(xié)議是面向連接的,它只需要它是可靠的,就是說不能丟失消息(至少?zèng)]有錯(cuò)誤)。在因特網(wǎng)兩個(gè)最常用的傳輸層協(xié)議中,TCP是可靠的,而UDP不是。因此,HTTP依賴于TCP進(jìn)行消息傳遞,雖然TCP是面向連接的,但這并不是必須的。
HTTP/1.0曾經(jīng)為每一個(gè)請(qǐng)求/回應(yīng)交換都打開一個(gè)TCP連接,但是TCP主要有兩種流:打開一個(gè)連接需要多次的消息往返因此很慢。但是當(dāng)多個(gè)消息周期性的發(fā)送時(shí),這就變得更加高效:暖連接比冷連接更高效。
為了減少這些負(fù)擔(dān),HTTP/1.1引入流水線的概念(已被證明很難實(shí)現(xiàn))和持久連接的概念:下層的TCP連接可以通過Connection頭部來被部分地控制。HTTP/2則發(fā)展的更多,通過一個(gè)連接多個(gè)消息的方式來讓這個(gè)連接始終保持為暖連接。
為了更好的適合HTTP,設(shè)計(jì)一種更好的傳輸層協(xié)議就一直在進(jìn)行中。Google就研發(fā)了一種以UDP為基礎(chǔ),能提供更可靠更有效的傳輸層協(xié)議。
HTTP的擴(kuò)展性舉例
- 緩存。文檔怎么緩存能夠通過HTTP來控制。服務(wù)端能告訴代理和客戶端什么需要被緩存,緩存多久,而客戶端能夠命令中間緩存代理來忽略存儲(chǔ)的文檔。
- 開放同源限制。HTTP可以通過修改頭部來實(shí)現(xiàn)CORS(跨域資源共享)。
- 認(rèn)證。一些頁面能夠被保護(hù)起來,僅讓特定的用戶進(jìn)行訪問。基本的認(rèn)證功能可以直接通過HTTP提供,使用Authenticate相似的頭部就可以,或者用HTTP cookie來設(shè)定指定的會(huì)話。
- 代理。服務(wù)端和客戶端通常都處在內(nèi)部網(wǎng)上,彼此的真實(shí)地址都是不可見的。HTTP請(qǐng)求就要通過代理穿過網(wǎng)絡(luò)障礙。不是所有的代理都是HTTP代理的,像一些用SOCKS協(xié)議的代理就運(yùn)作在更底層。
- 會(huì)話。Cookies用一個(gè)服務(wù)端的狀態(tài)連接起了每一個(gè)請(qǐng)求。這就創(chuàng)建了會(huì)話,這很有用,不僅是因?yàn)槟苡玫劫徫镘囘@樣的電商業(yè)務(wù)上,更是因?yàn)?,它使得任何網(wǎng)站都能夠配置頁面展現(xiàn)的東西了。
一次HTTP請(qǐng)求過程
- 打開一個(gè)TCP連接(或者重用之前的一個(gè))。
- 建立TCP連接之后,發(fā)送一個(gè)HTTP請(qǐng)求報(bào)文(request)。
- 讀取服務(wù)端返回的報(bào)文(response)。
- 關(guān)閉連接或者為以后的請(qǐng)求重用連接。
HTTP請(qǐng)求報(bào)文
下面是一個(gè)HTTP請(qǐng)求報(bào)文的例子。

請(qǐng)求報(bào)文的元素由下面組成:
- method:GET或POST。
- path:獲取資源的路徑。
- version:HTTP協(xié)議的版本號(hào)。
- 對(duì)于一些像POST這樣的方法,報(bào)文的body就包含了發(fā)送的資源,這個(gè)body和響應(yīng)報(bào)文的body類似。
- 為服務(wù)端表達(dá)其它信息的可選擇性的headers。
HTTP響應(yīng)報(bào)文
下面是一個(gè)HTTP響應(yīng)報(bào)文的例子。

響應(yīng)報(bào)文的元素由下面組成:
- version:HTTP版本號(hào)。
- status code:表明對(duì)應(yīng)的請(qǐng)求成功還是失敗。
- status text:狀態(tài)碼對(duì)應(yīng)的狀態(tài)信息,可以由服務(wù)端自行設(shè)定。
- 其它的HTTP headers。
- 響應(yīng)body。