一次完整的HTTP請求過程

2021-07-25 12:22:24 字數 2649 閱讀 1953

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

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

請求行:請求行是請求訊息的第一行,由三部分組成:分別是請求方法(get/post/delete/put/head)、請求資源的uri路徑、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 jun 2016 06:23:31 gmt

server:nginx/1.9.12

transfer-encoding:chunked

web server都是基於socket程式設計,又稱之為網路程式設計,網路協議通過乙個叫做socket的物件抽象出來,socket可以建立網路連線,讀資料,寫資料。socket模組定義了一些常量引數,用來指定socket的的位址族、socket的型別、以及支援的tcp/ip協議。

socket.socket([family[, type[, proto]]]):根據指定的位址族和套接字型別、協議編號(預設為0)來建立套接字物件。af_inet對應的ipv4, af_inet6對應的ipv6。

引數名稱值說明

family

af_inet

2ipv4

af_inet6

23ipv6

af_unspec

0協議無關

type

sock_stream

1流 for tcp

sock_dgram

2資料報 for udp

protocal

ipproto_ip0ip

ipproto_udp

17udp

ipproto_tcp

6tcp

ipproto_raw

255ipproto_icmp

1icmp

socket.listen(backlog) :在指定的埠開始監聽,backlog表示connection佇列的最大長度

socket.setblocking(flag) : 設定為非阻塞還是阻塞的socket,如果是非阻塞的,那麼呼叫recv的時候如果沒有資料可讀,那麼久直接返回乙個錯誤,相反如果設定為阻塞模式,如果沒有資料可讀,那麼就一直處於阻塞等待資料的狀態。

socket.accept():當有連線請求過來時,接收該連線,返回乙個socket物件,該物件可以在基於該連線傳送和接收資料。

socket.sendall(string[, flags]):傳送資料

socket.recv(bufsize[, flags]):接收資料

socket.close():關閉socket連線。

搞清楚了http規範和socket之後,我們就可以使用socket實現乙個對簡單的http伺服器了。**:

# http響應訊息

參考:

一次完整的 HTTP 請求過程

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

一次完整的 HTTP 請求過程

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

一次完整的http請求過程

http目前協議版本是1.1,http是一種無狀態的協議,無狀態是指web瀏覽器與web伺服器之間,不需要建立持久的鏈結,這意味著當乙個客戶端向伺服器端發出請求,然後web伺服器返回響應 response 鏈結就被關閉了,在伺服器端不保留鏈結的有關資訊。1.建立tcp鏈結 在http工作前,首先瀏覽...