HTTP概述

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


Fetching_a_page.png

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)文的例子。


http請(qǐng)求頭.png

請(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)文的例子。


http響應(yīng)頭.png

響應(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。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • HTTP是一種能夠獲取如HTML這樣網(wǎng)絡(luò)資源的協(xié)議。它是Web上數(shù)據(jù)交換的基礎(chǔ),是一種client-server協(xié)...
    星星愛童童閱讀 277評(píng)論 0 1
  • (本文參考課本是《HTTP權(quán)威指南》,文中的書寫結(jié)構(gòu)是根據(jù)自己的閱讀理解的個(gè)人思路,如有不懂可以自行參考原書) 第...
    Andrew_bao閱讀 668評(píng)論 1 3
  • 1.OkHttp源碼解析(一):OKHttp初階2 OkHttp源碼解析(二):OkHttp連接的"前戲"——HT...
    隔壁老李頭閱讀 21,545評(píng)論 24 176
  • 前言 HTTP = Hypertext Transfer Protocol = 超文本傳輸協(xié)議是在萬維網(wǎng)上進(jìn)行通信...
    littledust閱讀 430評(píng)論 0 2
  • 在墨香四溢的百花園 有你一路相伴 我的心晴日多于雨天 相遇美好如蓮 我守著緣分的天空 等著和你心靈重逢 切磋、交談...
    蕙蘭漱雪閱讀 235評(píng)論 5 8

友情鏈接更多精彩內(nèi)容