超文字傳輸協議(英文: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/1.1協議中共定義了八種方法(也叫「動作」)來以不同方式操作指定的資源:
與get方法一樣,都是向伺服器發出指定資源的請求。只不過伺服器將不傳回資源的本文部分。它的好處在於,使用這個方法可以在不必傳輸全部內容的情況下,就可以獲取其中「關於該資源的資訊」(元資訊或稱元資料)。
向指定資源提交資料,請求伺服器進行處理(例如提交表單或者上傳檔案)。資料被包含在請求本文中。這個請求可能會建立新的資源或修改現有資源,或二者皆有。
請求伺服器刪除request-uri所標識的資源。
回顯伺服器收到的請求,主要用於測試或診斷。
這個方法可使伺服器傳回該資源所支援的所有http請求方法。用'*'來代替資源名稱,向web伺服器傳送options請求,可以測試伺服器功能是否正常運作。
http/1.1協議中預留給能夠將連線改為管道方式的**伺服器。通常用於ssl加密伺服器的鏈結(經由非加密的http**伺服器)。
注意事項:
方法名稱是區分大小寫的。當某個請求所針對的資源不支援對應的請求方法的時候,伺服器應當返回狀態碼405(method not allowed),當伺服器不認識或者不支援對應的請求方法的時候,應當返回狀態碼501(not implemented)。
http伺服器至少應該實現get和head方法,其他方法都是可選的。當然,所有的方法支援的實現都應當匹配下述的方法各自的語義定義。此外,除了上述方法,特定的http伺服器還能夠擴充套件自定義的方法。例如patch(由 rfc 5789 指定的方法)用於將區域性修改應用到資源。
所有http響應的第一行都是狀態行,依次是當前http版本號,3位數字組成的狀態**,以及描述狀態的短語,彼此由空格分隔。
狀態**的第乙個數字代表當前響應的型別:
1xx訊息——請求已被伺服器接收,繼續處理
2xx成功——請求已成功被伺服器接收、理解、並接受
3xx重定向——需要後續操作才能完成這一請求
4xx請求錯誤——請求含有詞法錯誤或者無法被執行
5xx伺服器錯誤——伺服器在處理某個正確請求時發生錯誤
雖然 rfc 2616 中已經推薦了描述狀態的短語,例如"200 ok","404 not found",但是web開發者仍然能夠自行決定採用何種短語,用以顯示本地化的狀態描述或者自定義資訊。
傳送協議。
層級url標記符號(為[//],固定不變)
訪問資源需要的憑證資訊(可省略)
伺服器。(通常為網域名稱,有時為ip位址)
埠號。(以數字方式表示,若為http的預設值「:80」可省略)
路徑。(以「/」字元區別路徑中的每乙個目錄名稱)
查詢。(get模式的窗體引數,以「?」字元為起點,每個引數以「&」隔開,再以「=」分開引數名稱與資料,通常以utf8的url編碼,避開字元衝突的問題)
片段。以「#」字元為起點
以 為例, 其中:
http,是協議;
www.luffycity.com,是伺服器;
80,是伺服器上的網路埠號;
/news/index.html,是路徑;
?id=250&page=1,是查詢。
大多數網頁瀏覽器不要求使用者輸入網頁中「http://」的部分,因為絕大多數網頁內容是超文字傳輸協議檔案。同樣,「80」是超文字傳輸協議檔案的常用埠號,因此一般也不必寫明。一般來說使用者只要鍵入統一資源定位符的一部分(www.luffycity.com:80/news/index.html?id=250&page=1)就可以了。
由於超文字傳輸協議允許伺服器將瀏覽器重定向到另乙個網頁位址,因此許多伺服器允許使用者省略網頁位址中的部分,比如 www。從技術上來說這樣省略後的網頁位址實際上是乙個不同的網頁位址,瀏覽器本身無法決定這個新位址是否通,伺服器必須完成重定向的任務。
HTTP協議那些事兒
超文字傳輸協議 英文 hypertext transfer protocol,縮寫 http 是一種用於分布式 協作式和超 資訊系統的應用層協議。http是全球資訊網的資料通訊的基礎。http的發展是由蒂姆 伯納斯 李於1989年在歐洲核子研究組織 cern 所發起。http的標準制定由全球資訊網協...
web開發 Http協議基礎
一 http0.9版 http 是基於 tcp ip 協議的應用層協議 它不涉及資料報 packet 傳輸,主要規定了客戶端和伺服器之間的通訊格式,預設使用80埠。最早版本是1991年發布的0.9版。該版本極其簡單,只有乙個命令get。get index.html 上面命令表示,tcp 連線 con...
Web開發 Http協議剖析
http,即超文字傳輸協議,是建立在tcp ip協議的基礎上。在web開發的過程中,http協議是十分重要的,瀏覽器與伺服器之間的互動就是基於http協議的。http協議如果展開全面講解會有很多內容,這裡主要分析http協議的請求與回覆中的內容格式 相應的訊息頭以及幾種狀態碼。一 http請求 完整...