web開發 Http協議基礎

2021-08-15 20:29:09 字數 4412 閱讀 3760

一、http0.9版

http 是基於 tcp/ip 協議的應用層協議

。它不涉及資料報(packet)傳輸,主要規定了客戶端和伺服器之間的通訊格式,預設使用80埠。

最早版本是2023年發布的0.9版。該版本極其簡單,只有乙個命令get

get /index.html

上面命令表示,tcp 連線(connection)建立後,客戶端向伺服器請求(request)網頁index.html

協議規定,伺服器只能回應html格式的字串,不能回應別的格式。

hello world

伺服器傳送完畢,就關閉tcp連線。

二、http1.0版

2.1簡介

2.2請求格式

下面是乙個1.0版的http請求的例子。

accept: */*可以看到,這個格式與0.9版有很大變化。

第一行是請求命令,必須在尾部新增協議版本(http/1.0)。後面就是多行頭資訊,描述客戶端的情況。

2.3回應格式

伺服器的回應如下。

回應的格式是"頭資訊 + 乙個空行(\r\n) + 資料"。其中,第一行是"協議版本 + 狀態碼(status code) + 狀態描述"。

2.4回應格式

關於字元的編碼,1.0版規定,頭資訊必須是 ascii 碼,後面的資料可以是任何格式。因此,伺服器回應的時候,必須告訴客戶端,資料是什麼格式,這就是content-type欄位的作用。

下面是一些常見的content-type欄位的值。

這些資料型別總稱為mime type,每個值包括一級型別和二級型別,之間用斜槓分隔。

2.5http/1.0的缺點

1、每個tcp鏈結只能傳送乙個請求,傳送資料完畢,鏈結就關閉,如果還要請求其他資源,就必須再新建乙個連線。

2、tcp連線的新建成本很高,因為需要客戶端和服務端三次握手,並且開始時傳送速率較慢(slow start )。隨著網頁載入的外部資源越來越多,問題越明顯。

為了解決這個問題,有些瀏覽器在請求時,用了乙個非標準的connection字段。

connection: keep-alive
這個字段要求伺服器不要關閉tcp連線,以便其他請求復用。伺服器同樣回應這個字段。

connection: keep-alive
乙個可以復用的tcp連線就建立了,直到客戶端或伺服器主動關閉連線。但是,這不是標準字段,不同實現的行為可能不一致,因此不是根本的解決辦法。

三、http1.1版

3.1簡介

2023年1月,http/1.1版本發布,進一步完善了1.0,一直用到20年後的今天,直到現在還是最流行的版本。

3.2持久連線

1.1版的最大變化,就是引入了持久連線(persistent connection ),即tcp連線預設不關閉,可以被多個請求復用,不用申明

connection:keep-alive。客戶端和服務端發現對方一段時間沒有活動,就可以主動關閉連線。不過,規範的做法是,客戶端在最後乙個請求時,傳送connection:close,明確要求伺服器關閉連線。

3.3管道機制

1.1版還引入了管道機制(pipelining),即在同乙個tcp連線裡面,客戶端可以同時傳送多個請求。這樣就進一步改進了http協議的效率。舉例說,客戶端需要請求兩個資源,以前是在同乙個tcp連線裡面,先傳送a請求,然後等待伺服器做回應,收到後再發出b請求。管道機制是允許瀏覽器同時發出a請求和b請求,但是伺服器還是按照順序,先回應a請求完成後再回應b請求。

雖然1.1版允許復用tcp連線,但是同乙個tcp連線裡面,所有的資料通訊是按次序進行的。伺服器只有處理完乙個回應,才會進行下乙個回應。要是前面的回應特別慢,後面就會有許多請求排隊等著。這稱為"隊頭堵塞"(head-of-line blocking)。

為了避免這個問題,只有兩種方法:一是減少請求數,二是同時多開持久連線。這導致了很多的網頁優化技巧,比如合併指令碼和樣式表、將嵌入css**、網域名稱分片(domain sharding)等等。如果http協議設計得更好一些,這些額外的工作是可以避免的。

2023年,谷歌公開了自行研發的 spdy 協議,主要解決 http/1.1 效率不高的問題。

這個協議在chrome瀏覽器上證明可行以後,就被當作 http/2 的基礎,主要特性都在 http/2 之中得到繼承。

2023年,http/2 發布。它不叫 http/2.0,是因為標準委員會不打算再發布子版本了,下乙個新版本將是 http/3。

http/1.1 版的頭資訊肯定是文字(ascii編碼),資料體可以是文字,也可以是二進位制。http/2 則是乙個徹底的二進位制協議,頭資訊和資料體都是二進位制,並且統稱為"幀"(frame):頭資訊幀和資料幀。

二進位制協議的乙個好處是,可以定義額外的幀。http/2 定義了近十種幀,為將來的高階應用打好了基礎。如果使用文字實現這種功能,解析資料將會變得非常麻煩,二進位制解析則方便得多。

http/2 復用tcp連線,在乙個連線裡,客戶端和瀏覽器都可以同時傳送多個請求或回應,而且不用按照順序一一對應,這樣就避免了"隊頭堵塞"。

舉例來說,在乙個tcp連線裡面,伺服器同時收到了a請求和b請求,於是先回應a請求,結果發現處理過程非常耗時,於是就傳送a請求已經處理好的部分, 接著回應b請求,完成後,再傳送a請求剩下的部分。

這樣雙向的、實時的通訊,就叫做多工(multiplexing)。

因為 http/2 的資料報是不按順序傳送的,同乙個連線裡面連續的資料報,可能屬於不同的回應。因此,必須要對資料報做標記,指出它屬於哪個回應。

http/2 將每個請求或回應的所有資料報,稱為乙個資料流(stream)。每個資料流都有乙個獨一無二的編號。資料報傳送的時候,都必須標記資料流id,用來區分它屬於哪個資料流。另外還規定,客戶端發出的資料流,id一律為奇數,伺服器發出的,id為偶數。

資料流傳送到一半的時候,客戶端和伺服器都可以傳送訊號(rst_stream幀),取消這個資料流。1.1版取消資料流的唯一方法,就是關閉tcp連線。這就是說,http/2 可以取消某一次請求,同時保證tcp連線還開啟著,可以被其他請求使用。

客戶端還可以指定資料流的優先順序。優先順序越高,伺服器就會越早回應。

http 協議不帶有狀態,每次請求都必須附上所有資訊。所以,請求的很多欄位都是重複的,比如cookieuser agent,一模一樣的內容,每次請求都必須附帶,這會浪費很多頻寬,也影響速度。

http/2 對這一點做了優化,引入了頭資訊壓縮機制(header compression)。一方面,頭資訊使用gzipcompress壓縮後再傳送;另一方面,客戶端和伺服器同時維護一張頭資訊表,所有欄位都會存入這個表,生成乙個索引號,以後就不傳送同樣欄位了,只傳送索引號,這樣就提高速度了。

http/2 允許伺服器未經請求,主動向客戶端傳送資源,這叫做伺服器推送(server push)。

常見場景是客戶端請求乙個網頁,這個網頁裡面包含很多靜態資源。正常情況下,客戶端必須收到網頁後,解析html原始碼,發現有靜態資源,再發出靜態資源請求。其實,伺服器可以預期到客戶端請求網頁後,很可能會再請求靜態資源,所以就主動把這些靜態資源隨著網頁一起發給客戶端了。

Web開發 Http協議剖析

http,即超文字傳輸協議,是建立在tcp ip協議的基礎上。在web開發的過程中,http協議是十分重要的,瀏覽器與伺服器之間的互動就是基於http協議的。http協議如果展開全面講解會有很多內容,這裡主要分析http協議的請求與回覆中的內容格式 相應的訊息頭以及幾種狀態碼。一 http請求 完整...

Web開發之HTTP協議

乙個狀態行 若干訊息頭 以及響應正文,其中的一些訊息頭和正文都是可選的,訊息頭和正文內容之間要用空行隔開。http 1.1 200 ok 狀態行 server microsoft iis 5.0 訊息頭,以下都是 date thu,13 jul 2000 05 46 53 gmt content l...

Web基礎與HTTP協議

二 html的概念及應用 三 web概述 3.動態網頁 1.動態網頁的特點 四 http協議 4.http狀態碼 2.早起使用hosts檔案解析網域名稱 主機名稱重複 主機維護困難 3.dns domain name system網域名稱系統 特點 分布式 層次性 hosts檔案的主要功能是配置網域...