HTTP協議那些事兒

2022-04-10 17:02:17 字數 4580 閱讀 5238

超文字傳輸協議(英文:hypertext transfer protocol,縮寫:http)是一種用於分布式、協作式和超**資訊系統的應用層協議。http是全球資訊網的資料通訊的基礎。

http的發展是由蒂姆·伯納斯-李於2023年在歐洲核子研究組織(cern)所發起。http的標準制定由全球資訊網協會(world wide web consortium,w3c)和網際網路工程任務組(internet engineering task force,ietf)進行協調,最終發布了一系列的rfc,其中最著名的是2023年6月公布的 rfc 2616,定義了http協議中現今廣泛使用的乙個版本——http 1.1。

2023年12月,網際網路工程任務組(ietf)的hypertext transfer protocol bis(httpbis)工作小組將http/2標準提議遞交至iesg進行討論,於2023年2月17日被批准。 http/2標準於2023年5月以rfc 7540正式發表,取代http 1.1成為http的實現標準。

http是乙個客戶端終端(使用者)和伺服器端(**)請求和應答的標準(tcp)。通過使用網頁瀏覽器、網路爬蟲或者其它的工具,客戶端發起乙個http請求到伺服器上指定埠(預設埠為80)。我們稱這個客戶端為使用者**程式(user agent)。應答的伺服器上儲存著一些資源,比如html檔案和影象。我們稱這個應答伺服器為源伺服器(origin server)。在使用者**和源伺服器中間可能存在多個「中間層」,比如**伺服器、閘道器或者隧道(tunnel)。

儘管tcp/ip協議是網際網路上最流行的應用,http協議中,並沒有規定必須使用它或它支援的層。事實上,http可以在任何網際網路協議上,或其他網路上實現。http假定其下層協議提供可靠的傳輸。因此,任何能夠提供這種保證的協議都可以被其使用。因此也就是其在tcp/ip協議族使用tcp作為其傳輸層。

通常,由http客戶端發起乙個請求,建立乙個到伺服器指定埠(預設是80埠)的tcp連線。http伺服器則在那個埠監聽客戶端的請求。一旦收到請求,伺服器會向客戶端返回乙個狀態,比如"http/1.1 200 ok",以及返回的內容,如請求的檔案、錯誤訊息、或者其它資訊。

http協議定義web客戶端如何從web伺服器請求web頁面,以及伺服器如何把web頁面傳送給客戶端。http協議採用了請求/響應模型。客戶端向伺服器傳送乙個請求報文,請求報文包含請求的方法、url、協議版本、請求頭部和請求資料。伺服器以乙個狀態行作為響應,響應的內容包括協議的版本、成功或者錯誤**、伺服器資訊、響應頭部和響應資料。

以下是 http 請求/響應的步驟:

客戶端連線到web伺服器

乙個http客戶端,通常是瀏覽器,與web伺服器的http埠(預設為80)建立乙個tcp套接字連線。例如,

傳送http請求

通過tcp套接字,客戶端向web伺服器傳送乙個文字的請求報文,乙個請求報文由請求行、請求頭部、空行和請求資料4部分組成。

伺服器接受請求並返回http響應

web伺服器解析請求,定位請求資源。伺服器將資源複本寫到tcp套接字,由客戶端讀取。乙個響應由狀態行、響應頭部、空行和響應資料4部分組成。

釋放連線tcp連線

若connection 模式為close,則伺服器主動關閉tcp連線,客戶端被動關閉連線,釋放tcp連線;若connection 模式為keepalive,則該連線會保持一段時間,在該時間內可以繼續接收請求;

客戶端瀏覽器解析html內容

客戶端瀏覽器首先解析狀態行,檢視表明請求是否成功的狀態**。然後解析每乙個響應頭,響應頭告知以下為若干位元組的html文件和文件的字符集。客戶端瀏覽器讀取響應資料html,根據html的語法對其進行格式化,並在瀏覽器視窗中顯示。

瀏覽器向 dns 伺服器請求解析該 url 中的網域名稱所對應的 ip 位址;

解析出 ip 位址後,根據該 ip 位址和預設埠 80,和伺服器建立tcp連線;

瀏覽器發出讀取檔案(url 中網域名稱後面部分對應的檔案)的http 請求,該請求報文作為 tcp 三次握手的第三個報文的資料傳送給伺服器;

伺服器對瀏覽器請求作出響應,並把對應的 html 文字傳送給瀏覽器;

釋放 tcp連線;

瀏覽器將該 html 文字並顯示內容;

http協議規定,請求從客戶端發出,最後伺服器端響應該請求並 返回。換句話說,肯定是先從客戶端開始建立通訊的,伺服器端在沒有 接收到請求之前不會傳送響應
http是一種不儲存狀態,即無狀態(stateless)協議。http協議 自身不對請求和響應之間的通訊狀態進行儲存。也就是說在http這個 級別,協議對於傳送過的請求或響應都不做持久化處理。

使用http協議,每當有新的請求傳送時,就會有對應的新響應產 生。協議本身並不保留之前一切的請求或響應報文的資訊。這是為了更快地處理大量事務,確保協議的可伸縮性,而特意把http協議設計成 如此簡單的。可是,隨著web的不斷發展,因無狀態而導致業務處理變得棘手 的情況增多了。比如,使用者登入到一家購物**,即使他跳轉到該站的 其他頁面後,也需要能繼續保持登入狀態。針對這個例項,**為了能 夠掌握是誰送出的請求,需要儲存使用者的狀態。http/1.1雖然是無狀態協議,但為了實現期望的保持狀態功能, 於是引入了cookie技術。有了cookie再用http協議通訊,就可以管 理狀態了。有關cookie的詳細內容稍後講解。

無連線的含義是限制每次連線只處理乙個請求。伺服器處理完客戶的請求,並收到客戶的應答後,即斷開連線。採用這種方式可以節省傳輸時間,並且可以提高併發效能,不能和每個使用者建立長久的連線,請求一次相應一次,服務端和客戶端就中斷了。但是無連線有兩種方式,早期的http協議是乙個請求乙個響應之後,直接就斷開了,但是現在的http協議1.1版本不是直接就斷開了,而是等幾秒鐘,這幾秒鐘是等什麼呢,等著使用者有後續的操作,如果使用者在這幾秒鐘之內有新的請求,那麼還是通過之前的連線通道來收發訊息,如果過了這幾秒鐘使用者沒有傳送新的請求,那麼就會斷開連線,這樣可以提高效率,減少短時間內建立連線的次數,因為建立連線也是耗時的,預設的好像是3秒中現在,但是這個時間是可以通過咱們後端的**來調整的,自己**根據自己**使用者的行為來分析統計出乙個最優的等待時間。

http/1.1協議中共定義了八種方法(也叫「動作」)來以不同方式操作指定的資源:

2. head:與get方法一樣,都是向伺服器發出指定資源的請求。只不過伺服器將不傳回資源的本文部分。它的好處在於,使用這個方法可以在不必傳輸全部內容的情況下,就可以獲取其中「關於該資源的資訊」(元資訊或稱元資料)。

3. post:向指定資源提交資料,請求伺服器進行處理(例如提交表單或者上傳檔案)。資料被包含在請求本文中。這個請求可能會建立新的資源或修改現有資源,或二者皆有。

5. delete:請求伺服器刪除request-uri所標識的資源。

6. trace:回顯伺服器收到的請求,主要用於測試或診斷。

7. options:這個方法可使伺服器傳回該資源所支援的所有http請求方法。用'*'來代替資源名稱,向web伺服器傳送options請求,可以測試伺服器功能是否正常運作。

8. connect

http/1.1協議中預留給能夠將連線改為管道方式的**伺服器。通常用於ssl加密伺服器的鏈結(經由非加密的http**伺服器)。

注意事項:

1. 方法名稱是區分大小寫的。當某個請求所針對的資源不支援對應的請求方法的時候,伺服器應當返回狀態碼405(method not allowed),當伺服器不認識或者不支援對應的請求方法的時候,應當返回狀態碼501(not implemented)。

2. http伺服器至少應該實現get和head方法,其他方法都是可選的。當然,所有的方法支援的實現都應當匹配下述的方法各自的語義定義。此外,除了上述方法,特定的http伺服器還能夠擴充套件自定義的方法。例如patch(由 rfc 5789 指定的方法)用於將區域性修改應用到資源。

所有http響應的第一行都是狀態行,依次是當前http版本號,3位數字組成的狀態**,以及描述狀態的短語,彼此由空格分隔。

狀態**的第乙個數字代表當前響應的型別:

1. 1xx訊息——請求已被伺服器接收,繼續處理

2. 2xx成功——請求已成功被伺服器接收、理解、並接受

3. 3xx重定向——需要後續操作才能完成這一請求

4. 4xx請求錯誤——請求含有詞法錯誤或者無法被執行

5. 5xx伺服器錯誤——伺服器在處理某個正確請求時發生錯誤

雖然 rfc 2616 中已經推薦了描述狀態的短語,例如"200 ok","404 not found",但是web開發者仍然能夠自行決定採用何種短語,用以顯示本地化的狀態描述或者自定義資訊。

超文字傳輸協議(http)的統一資源定位符將從網際網路獲取資訊的五個基本元素包括在乙個簡單的位址中:

1. 傳送協議。

2. 層級url標記符號(為[//],固定不變)

3. 訪問資源需要的憑證資訊(可省略)

4. 伺服器。(通常為網域名稱,有時為ip位址)

5. 埠號。(以數字方式表示,若為http的預設值「:80」可省略)

6. 路徑。(以「/」字元區別路徑中的每乙個目錄名稱)

7. 查詢。(get模式的窗體引數,以「?」字元為起點,每個參

8. 以「&」隔開,再以「=」分開引數名稱與資料,通常以utf8的url編碼,避開字元衝突的問題)

9. 片段。以「#」字元為起點

關於協議的那些事兒

網路協議由誰定義?什麼是rfc的中文 請求評議 在 可以查閱協議定義原文?rfc原文你可以從這裡獲取 在 可以查閱中文版協議定義原文?rfc中文版你可以從這裡獲取 測試人員應該掌握哪些協議?對於協議的掌握,一是掌握協議機制 二是協議報文格式 三是抓包分析工具。對測試人員而言,必須掌握的機制是 ip ...

HTTP協議那些事兒(Web開發補充知識點)

超文字傳輸協議 英文 hypertext transfer protocol,縮寫 http 是一種用於分布式 協作式和超 資訊系統的應用層協議。http是全球資訊網的資料通訊的基礎。http的發展是由蒂姆 伯納斯 李於1989年在歐洲核子研究組織 cern 所發起。http的標準制定由全球資訊網協...

HTTP協議那些事

1 http全程是hypertext transfer protocol 超文字傳輸協議 的簡寫,是tcp ip協議的乙個應用層協議,用於定義web遊覽器和web伺服器之間交換資料的過程,由請求和響應構成,是乙個標準的客戶端服務伺服器模型,乙個無狀態的協議 2 http版本 http 1.0和htt...