簡單說說HTTP協(xié)議(轉)

原文作者:Tison

原文鏈接:https://tisonkong.github.io/github.io/2018/10/12/java web基礎篇——Http協(xié)議/

版權聲明:?如有侵權,請聯(lián)系刪除!

一、Http協(xié)議

HTTP協(xié)議(HyperText Transfer Protocol,超文本傳輸協(xié)議)是用于從3W服務器傳輸超文本到本地瀏覽器的傳送協(xié)議。它可以使瀏覽器更加高效,使網(wǎng)絡傳輸減少。它不僅保證計算機正確快速地傳輸超文本文檔,還確定傳輸文檔中的哪一部分,以及哪部分內(nèi)容首先顯示(如文本先于圖形)等。

HTTP是一個應用層協(xié)議,基于請求與響應模式的、無狀態(tài)的、應用層的協(xié)議,常基于TCP的連接方式。HTTP使用統(tǒng)一資源標識符(Uniform Resource Identifiers, URI)來傳輸數(shù)據(jù)和建立連接。URL是一種特殊類型的URI,包含了用于查找某個資源的足夠的信息URL,全稱是UniformResourceLocator, 中文叫統(tǒng)一資源定位符,是互聯(lián)網(wǎng)上用來標識某一處資源的地址。

HTTP協(xié)議定義Web客戶端如何從Web服務器請求Web頁面,以及服務器如何把Web頁面?zhèn)魉徒o客戶端。HTTP協(xié)議采用了請求/響應模型。客戶端向服務器發(fā)送一個請求報文,請求報文包含請求的方法、URL、協(xié)議版本、請求頭部和請求數(shù)據(jù)。服務器以一個狀態(tài)行作為響應,響應的內(nèi)容包括協(xié)議的版本、成功或者錯誤代碼、服務器信息、響應頭部和響應數(shù)據(jù)。以下是 HTTP 請求/響應的步驟:

1、客戶端連接到Web服務器

一個HTTP客戶端,通常是瀏覽器,與Web服務器的HTTP端口(默認為80)建立一個TCP套接字連接。例如,http://www.lxweimin.com/yitaicloud

2、發(fā)送HTTP請求

通過TCP套接字,客戶端向Web服務器發(fā)送一個文本的請求報文,一個請求報文由請求行、請求頭部、空行和請求數(shù)據(jù)4部分組成。

3、服務器接受請求并返回HTTP響應

Web服務器解析請求,定位請求資源。服務器將資源復本寫到TCP套接字,由客戶端讀取。一個響應由狀態(tài)行、響應頭部、空行和響應數(shù)據(jù)4部分組成。

4、釋放連接TCP連接

若connection 模式為close,則服務器主動關閉TCP連接,客戶端被動關閉連接,釋放TCP連接;若connection 模式為keepalive,則該連接會保持一段時間,在該時間內(nèi)可以繼續(xù)接收請求;

5、客戶端瀏覽器解析HTML內(nèi)容

客戶端瀏覽器首先解析狀態(tài)行,查看表明請求是否成功的狀態(tài)代碼。然后解析每一個響應頭,響應頭告知以下為若干字節(jié)的HTML文檔和文檔的字符集。客戶端瀏覽器讀取響應數(shù)據(jù)HTML,根據(jù)HTML的語法對其進行格式化,并在瀏覽器窗口中顯示。

例如:在瀏覽器地址欄鍵入URL,按下回車之后會經(jīng)歷以下流程:

1、瀏覽器向 DNS 服務器請求解析該 URL 中的域名所對應的 IP 地址;

2、解析出 IP 地址后,根據(jù)該 IP 地址和默認端口 80,和服務器建立TCP連接;

3、瀏覽器發(fā)出讀取文件(URL 中域名后面部分對應的文件)的HTTP 請求,該請求報文作為?TCP 三次握手的第三個報文的數(shù)據(jù)發(fā)送給服務器;

4、服務器對瀏覽器請求作出響應,并把對應的 html 文本發(fā)送給瀏覽器;

5、釋放?TCP連接;

6、瀏覽器將該 html 文本并顯示內(nèi)容;

《關于HTTP協(xié)議,一篇就夠了》

如果TCP有點生疏了,請戳下這里

1.常用的HTTP方法有哪些?

GET: 用于請求訪問已經(jīng)被URI(統(tǒng)一資源標識符)識別的資源,可以通過URL傳參給服務器。

POST:用于傳輸信息給服務器,主要功能與GET方法類似,但一般推薦使用POST方式。

PUT: 傳輸文件,報文主體中包含文件內(nèi)容,保存到對應URI位置。

DELETE:刪除文件,與PUT方法相反,刪除對應URI位置的文件。

HEAD: 獲得報文首部,與GET方法類似,只是不返回報文主體,一般用于驗證URI是否有效。

OPTIONS:查詢相應URI支持的HTTP方法。

2.GET方法與POST方法的區(qū)別

區(qū)別一:

get重點在從服務器上獲取資源,post重點在向服務器發(fā)送數(shù)據(jù);

區(qū)別二:

get傳輸數(shù)據(jù)是通過URL請求,以field(字段)= value的形式,置于URL后,并用”?”連接,多個請求數(shù)據(jù)間用”&”連接,如http://127.0.0.1/Test/login.action?name=admin&password=admin,這個過程用戶是可見的;

post傳輸數(shù)據(jù)通過Http的post機制,將字段與對應值封存在請求實體中發(fā)送給服務器,這個過程對用戶是不可見的;

區(qū)別三:

Get傳輸?shù)臄?shù)據(jù)量小,因為受URL長度限制,但效率較高;

Post可以傳輸大量數(shù)據(jù),所以上傳文件時只能用Post方式;

區(qū)別四:

get是不安全的,因為URL是可見的,可能會泄露私密信息,如密碼等(頁面可以被緩存,或者獲得歷史訪問記錄);

post較get安全性較高;

區(qū)別五:

get方式只能支持ASCII字符,向服務器傳的中文字符可能會亂碼。

post支持標準字符集,可以正確傳遞中文字符。

3.HTTP請求報文與響應報文格式

請求報文包含三部分:

a、請求行:包含請求方法、URI、HTTP版本信息

b、請求首部字段

c、請求內(nèi)容實體

響應報文包含三部分:

a、狀態(tài)行:包含HTTP版本、狀態(tài)碼、狀態(tài)碼的原因短語

b、響應首部字段

c、響應內(nèi)容實體

返回的狀態(tài)

1xx:指示信息–表示請求已接收,繼續(xù)處理

2xx:成功–表示請求已被成功接收、理解、接受

3xx:重定向–要完成請求必須進行更進一步的操作

4xx:客戶端錯誤–請求有語法錯誤或請求無法實現(xiàn)

5xx:服務器端錯誤–服務器未能實現(xiàn)合法的請求

200:請求被正常處理

204:請求被受理但沒有資源可以返回

206:客戶端只是請求資源的一部分,服務器只對請求的部分資源執(zhí)行GET方法,相應報文中通過Content-Range指定范圍的資源。

301:永久性重定向

302:臨時重定向

303:與302狀態(tài)碼有相似功能,只是它希望客戶端在請求一個URI的時候,能通過GET方法重定向到另一個URI上

304:發(fā)送附帶條件的請求時,條件不滿足時返回,與重定向無關

307:臨時重定向,與302類似,只是強制要求使用POST方法

400:請求報文語法有誤,服務器無法識別

401:請求需要認證

403:請求的對應資源禁止被訪問

404:服務器無法找到對應資源

500:服務器內(nèi)部錯誤

503:服務器正忙

4.常見HTTP首部字段

a、通用首部字段(請求報文與響應報文都會使用的首部字段)

Date:創(chuàng)建報文時間

Connection:連接的管理

Cache-Control:緩存的控制

Transfer-Encoding:報文主體的傳輸編碼方式

b、請求首部字段(請求報文會使用的首部字段)

Host:請求資源所在服務器

Accept:可處理的媒體類型

Accept-Charset:可接收的字符集

Accept-Encoding:可接受的內(nèi)容編碼

Accept-Language:可接受的自然語言

c、響應首部字段(響應報文會使用的首部字段)

Accept-Ranges:可接受的字節(jié)范圍

Location:令客戶端重新定向到的URI

Server:HTTP服務器的安裝信息

d、實體首部字段(請求報文與響應報文的的實體部分使用的首部字段)

Allow:資源可支持的HTTP方法

Content-Type:實體主類的類型

Content-Encoding:實體主體適用的編碼方式

Content-Language:實體主體的自然語言

Content-Length:實體主體的的字節(jié)數(shù)

Content-Range:實體主體的位置范圍,一般用于發(fā)出部分請求時使用

5.HTTP1.1版本新特性

先上答案,然后再后面詳細解釋:

a、默認持久連接,節(jié)省通信量,只要客戶端服務端任意一端沒有明確提出斷開TCP連接,就一直保持連接,可以發(fā)送多次HTTP請求

b、管線化,客戶端可以同時發(fā)出多個HTTP請求,而不用一個個等待響應

c、斷點續(xù)傳原理

HTTP 1.1支持持久連接,在一個TCP連接上可以傳送多個HTTP請求和響應,減少了建立和關閉連接的消耗和延遲。一個包含有許多圖像的網(wǎng)頁文件的多個請求和應答可以在一個連接中傳輸,但每個單獨的網(wǎng)頁文件的請求和應答仍然需要使用各自的連接。HTTP 1.1還允許客戶端不用等待上一次請求結果返回,就可以發(fā)出下一次請求,但服務器端必須按照接收到客戶端請求的先后順序依次回送響應結果,以保證客戶端能夠區(qū)分出每次請求的響應內(nèi)容,這樣也顯著地減少了整個下載過程所需要的時間。基于HTTP 1.1協(xié)議的客戶機與服務器的信息交換過程。

【HTTP 1.1與HTTP 1.0的比較HTTP 1.1與HTTP 1.0的比較】

6.HTTP的缺點與HTTPS

a、通信使用明文不加密,內(nèi)容可能被竊聽

b、不驗證通信方身份,可能遭到偽裝

c、無法驗證報文完整性,可能被篡改

HTTPS就是HTTP加上加密處理(一般是SSL安全通信線路)+認證+完整性保護

7.HTTP優(yōu)化

利用負載均衡優(yōu)化和加速HTTP應用

利用HTTP Cache來優(yōu)化網(wǎng)站

補充一點Cache的細節(jié):

緩存是一個到處都存在的用空間換時間的例子。通過使用多余的空間,我們能夠獲取更快的速度。用戶在瀏覽網(wǎng)站的時候,瀏覽器能夠在本地保存網(wǎng)站中的圖片或者其他文件的副本,這樣用戶再次訪問該網(wǎng)站的時候,瀏覽器就不用再下載全部的文件,減少了下載量意味著提高了頁面加載的速度。

緩存非常有用,但是也帶來了一定的缺陷。當我們的網(wǎng)站發(fā)生了更新的時候,比如說Logo換了,瀏覽器本地仍保存著舊版本的Logo,那么瀏覽器如何來確定使用本地文件還是使用服務器上的新文件?下面來介紹幾種判斷的方法。

Caching Method 1:Last-Modified

服務器為了通知瀏覽器當前文件的版本,會發(fā)送一個上次修改時間的標簽,例如:

Last-modified: Fri, 16 Mar 2007 04:00:25 GMT

Caching Method 2: ETag

通常情況下,通過修改時間來比較文件是可行的。但是在一些特殊情況,例如服務器的時鐘發(fā)生了錯誤,服務器時鐘進行修改,夏時制DST到來后服務器時間沒有及時更新,這些都會引起通過修改時間比較文件版本的問題。

ETag可以用來解決這種問題。ETag是一個文件的唯一標志符。就像一個哈希或者指紋,每個文件都有一個單獨的標志,只要這個文件發(fā)生了改變,這個標志就會發(fā)生變化。如同 Last-modified 一樣,ETag 解決了文件版本比較的問題。只不過 ETag 的級別比 Last-Modified 高一些。

Caching Method 3:Expires

緩存一個文件,并且與服務器確認版本的方式非常好,但是仍有一個缺點,我們必須連接服務器。每次使用前都進行一次比較,這種方法很安全,但還不是最好的。我們可以使用 Expiration Date 來減少這種請求。

Caching Method 4:Max-age

Expires的方法很好,但是我們每次都得算一個精確的時間。max-age 標簽可以讓我們更加容易的處理過期時間。我們只需要說,這份資料你只能用一個星期就可以了。

【利用HTTP Cache來優(yōu)化網(wǎng)站】

8.跨域問題

瀏覽器的同源策略會導致跨域,這里同源策略又分為以下兩種

DOM同源策略:禁止對不同源頁面DOM進行操作。這里主要場景是iframe跨域的情況,不同域名的iframe是限制互相訪問的。

XmlHttpRequest同源策略:禁止使用XHR對象向不同源的服務器地址發(fā)起HTTP請求。

只要協(xié)議、域名、端口有任何一個不同,都被當作是不同的域,之間的請求就是跨域操作。

要解決跨域問題可以參考以下文章:

《跨域的那些事兒》

《跨域資源共享 CORS 詳解》?阮一峰大神的精品

另外玉剛寫了一篇不錯的,角度是站在前端來看的

《HTTP 必知必會的那些》

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,578評論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,701評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,691評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,974評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,694評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,026評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,015評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,193評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,719評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,442評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,668評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,151評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,846評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,255評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,592評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,394評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,635評論 2 380

推薦閱讀更多精彩內(nèi)容