python 13 http協議詳解

2022-09-20 06:00:14 字數 3595 閱讀 5718

回到頂部

超文字傳輸協議(英文:hyper text transfer protocol,http)是一種用於分布式、協作式和超**資訊系統的應用層協議。http是全球資訊網的資料通訊的基礎。http有很多應用,但最著名的是用於web瀏覽器和web伺服器之間的雙工通訊。

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權威指南

回到頂部

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 請求/響應的步驟:

\1. 客戶端連線到web伺服器

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

\2. 傳送http請求

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

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

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

\4. 釋放連線tcp連線

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

\5. 客戶端瀏覽器解析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位數字組成的狀態**,以及描述狀態的短語,彼此由空格分隔。

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

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

回到頂部

以 為例, 其中:

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)就可以了。

回到頂部

回到頂部

HTTP協議中 請求(GET POST)和響應詳解

目錄 請求 定義 結構請求方式 get和post區別 響應 定義 結構 響應狀態碼 瀏覽器根據使用者請求方式,將請求相關資料按照http規定的格式進行封裝,然後將封裝好的資料傳送給指定伺服器。客戶端根據使用者位址資訊將資料傳送給伺服器的過程 空行 位於請求航和請求資料之間,是必須要有的。請求實體 非...

python 關於http協議

簡單的客服端與服務端連線 客服端 1 建立socket例項物件 2 connect 連線伺服器 3 與伺服器端進行讀寫互動 4 關閉連線 import socket sk socket.socket ip 127.0.0.1 6666 sk.connect ip sk.sendall bytes 我...

python爬蟲基礎 http協議

http協議 1.1headers是請求頭 request headers是傳送過去的請求,裡面包含了完整的http請求資料,在之後我們爬取 頁面時會用到。get是獲取方式 host是遠端主機位址 connection客戶端希望的聯機方式 accept是客戶端能接受的 型別 user agent標示...