HTTP 請求和響應過程

2021-07-24 13:26:28 字數 3924 閱讀 5953

一次完整的http請求過程從tcp三次握手建立連線成功後開始,客戶端按照指定的格式開始向服務端傳送http請求,服務端接收請求後,解析http請求,處理完業務邏輯,最後返回乙個http的響應給客戶端,http的響應內容同樣有標準的格式。無論是什麼客戶端或者是什麼服務端,大家只要按照http的協議標準來實現的話,那麼它一定是通用的。

http 請求格式

http請求格式主要有四部分組成,分別是:請求行、請求頭、空行、訊息體,每部分內容佔一行

>  請求行

> 通用請求頭,比如date

> 特定的請求頭,比如客戶端資訊(user-agent)

> 實體請求頭,對訊息內容的描述資訊

> 請求頭和訊息體的分隔符

[>

]訊息體

http請求格式

請求行:請求行是http請求格式的第一行,由三部分組成:分別是請求方法(get/post/delete/put/head)、請求資源的uri路徑、http的版本號組成

訊息體:請求體是客戶端發給服務端的請求資料,這部分資料並不是每個請求必須的。

http 響應格式

伺服器接收處理完請求後返回乙個http相應訊息給客戶端。http響應訊息的格式包括:狀態行、響應頭、空行、訊息體。每部分內容佔一行。

http響應格式

狀態行:狀態行位於相應訊息的第一行,有http協議版本號,狀態碼和狀態說明三部分構成。如:

http/1.1 200 ok
響應頭:響應頭是伺服器傳遞給客戶端用於說明伺服器的一些資訊,以及將來繼續訪問該資源時的策略。

connection

:keep-alive

content-encoding

:gzip

content-type

:text/html; charset=utf-8

date

:fri, 24

jun201606:

23:31gmt

server

:nginx/

1.9.12

transfer-encoding

:chunked

以python的socket庫為例介紹serversocket的程式設計實踐:

python 編寫server的步驟:

第一步是建立socket物件。呼叫socket建構函式。如:

socket = socket.socket( family, type )

family引數代表位址家族,可為af_inet或af_unix。af_inet家族代表internet位址,af_unix家族用於同一臺機器上的程序間通訊。

type引數代表套接字型別,可為sock_stream(流套接字)和sock_dgram(資料報套接字)。

socket.bind( address )

由af_inet所建立的套接字,address位址必須是乙個雙元素元組,格式是(host,port)。host代表主機,port代表埠號。如果埠號正在使用、主機名不正確或埠已被保留,bind方法將引發socket.error異常。

第三步是使用socket套接字的listen方法接收連線請求。

socket.listen( backlog )

backlog指定最多允許多少個客戶連線到伺服器。它的值至少為1。收到連線請求後,這些請求需要排隊,如果佇列滿,就拒絕請求。

第四步是伺服器套接字通過socket的accept方法等待客戶請求乙個連線。

connection, address = socket.accept()

調 用accept方法時,socket會時入「waiting」狀態。客戶請求連線時,方法建立連線並返回伺服器。accept方法返回乙個含有兩個元素的 元組(connection,address)。第乙個元素connection是新的socket物件,伺服器必須通過它與客戶通訊;第二個元素 address是客戶的internet位址。

5、第五步是處理階段,伺服器和客戶端通過send和recv方法通訊(傳輸 資料)。伺服器呼叫send,並採用字串形式向客戶傳送資訊。send方法返回已傳送的字元個數。伺服器使用recv方法從客戶接收資訊。呼叫recv 時,伺服器必須指定乙個整數,它對應於可通過本次方法呼叫來接收的最大資料量。recv方法在接收資料時會進入「blocked」狀態,最後返回乙個字元 串,用它表示收到的資料。如果傳送的資料量超過了recv所允許的,資料會被截短。多餘的資料將緩衝於接收端。以後呼叫recv時,多餘的資料會從緩衝區 刪除(以及自上次呼叫recv以來,客戶可能傳送的其它任何資料)。

6、傳輸結束,伺服器呼叫socket的close方法關閉連線。

python編寫client的步驟:

1. 建立乙個socket以連線伺服器:socket = socket.socket( family, type )

2.使用socket的connect方法連線伺服器。對於af_inet家族,連線格式如下:

socket.connect( (host,port) )

host代表伺服器主機名或ip,port代表伺服器程序所繫結的埠號。如連線成功,客戶就可通過套接字與伺服器通訊,如果連線失敗,會引發socket.error異常。

3. 處理階段,客戶和伺服器將通過send方法和recv方法通訊。

4. 傳輸結束,客戶通過呼叫socket的close方法關閉連線。

# http響應訊息

在終端python server.py啟動伺服器

瀏覽器通過http://localhost:8000/訪問上面伺服器

在firefox的開發工具可以看到訊息頭。

python socket程式設計入門

HTTP請求和響應過程

請求和響應過程 協議 internate 的基本協議是 tcp ip 傳輸控制協議和網際協議 而目前使用的 都是建立在 tcp ip 上的應用層協議。不同的協議對應不同的應用。而 協議是web 應用所使用的主要協議。協議基於請求響應模式,客戶端向伺服器傳送乙個請求,請求頭包含請求的方法,uri,協議...

HTTP請求和響應過程

請求和響應過程 協議 internate 的基本協議是 tcp ip 傳輸控制協議和網際協議 而目前使用的 都是建立在 tcp ip 上的應用層協議。不同的協議對應不同的應用。而 協議是web 應用所使用的主要協議。協議基於請求響應模式,客戶端向伺服器傳送乙個請求,請求頭包含請求的方法,uri,協議...

HTTP請求和HTTP響應

客戶端連上伺服器後,向伺服器請求某個web資源,稱之為客戶端向伺服器傳送了乙個http請求,乙個完整 的http請求包括 描述客戶端的請求方式,請求資源名稱,使用的http協議版本號 請求方式get post 預設是get可以更改表單提交方式為post 區別主要在資料傳遞上 get可以在url位址後...