1. 程式人生 > >請求http頁面的相關過程

請求http頁面的相關過程

cep 網絡協議 關閉連接 邏輯 post http請求 send 緩存 logs

http請求從TCP建立三次握手後進行,客戶端按照規定的格式向服務器發送http請求,服務器在接收到這個請求之後,首先要對其進行解析,發掘出客戶端所需要的相關資源,然後經過相應的業務邏輯處理,找到這個相應的資源,並將它以特定的形式返回給客戶端。註意:不論是請求還是響應他都按照http協議的相關格式來進行,那都是比較通用的。

http的請求格式

http的請求格式主要包括這幾部分:請求行、請求頭、空行、消息體。具體結構如下圖所示:

技術分享

請求行:是指請求中的第一行,它主要有3部分構成:GET、POST等方法名,請求資源的URI,所用http的版本號。

請求頭中的信息:有和緩存相關的信息和客戶端身份(user-Agent)的信息。

技術分享

消息體:是指客戶端向服務器請求的數據資源,這部分數據不是每個請求所必有得。

http的響應格式

http的請求格式主要包括這幾部分:響應行、響應頭、空行、消息體。具體結構如下圖所示:

技術分享

響應行:它主要包含三部分內容:所使用的http版本號、狀態碼及狀態說明。

響應頭:響應頭是服務器傳遞給客戶端用於說明服務器的一些信息,以及將來繼續訪問該資源時的策略。

技術分享

消息體:是指服務器向客戶端回應的html文件,或者是其他形式的內容,如視頻文件、圖片等。

Socket

http頁面請求的這一部分內容與Socket編程緊密相關,又稱之為網絡編程,網絡協議通過一個叫做socket的對象抽象出來,socket可以建立網絡連接,讀數據,寫數據。socket模塊定義了一些常量參數,用來指定socket的的地址族、socket的類型、以及支持的TCP/IP協議。

socket.socket([family[, type[, proto]]]):根據指定的地址族和套接字類型、協議編號(默認為0)來創建套接字對象。AF_INET對應的IPV4, AF_INET6對應的IPV6。現在最常用的是IPV4協議。具體的參數分配如下圖:

技術分享

服務器端的編程(ser:

Socket :制定期望的通訊協議類型。AF_INET IPV4,現在使用最多的。SOCK_STREAM :流式套接字。

Bind() ip: port:給套接口分配一個本地協議地址,對於TCP,調用函數bind可以制定一個端口號,用於標識某個計算機上的某個進程,它還可以指定一個

IP地址

Listen:僅被TCP服務器調用,它是一個將調用connect發起連接的客戶套接口,它指示內核指向此套接口的連接請求。該函數在accpect之前被調用。對於監聽套接口,內核必須維護連個隊列:未完成連接隊列和已完成連接隊列的狀態。

Accept:從已完成連接隊列頭返回下一個已完成的連接,如果已完成的連接隊列為空,則進入睡眠狀態。如果accept執行成功,則代表與客戶連接成功

Recv/read:接收客戶端發來的信息。

Send/write:給客戶端返回一個ok;

Close:關閉連接。

客戶端cli:

Socket:制定期望的通訊協議類型。AF_INET IPV4,現在使用最多的。SOCK_STREAM :流式套接字。

Connect:建立一個與服務器的鏈接。客戶端在調用connect之前不必再調用bind,如果是tcp套接口的話,函數connect激發TCP的三次握手過程,且僅在連接建立成或錯誤時返回

Send:給客戶端發送信息。只能說明成功地將數據寫入發送緩沖區內,至於是否到達還不一定。

Recv:接收客戶端發過來的ok.

Close:執行si‘ci‘hui‘shou

Getsocknamegetpeername返回與套接口有關的本地協議地址。Getsockname可用來獲取某套接口的地址族。在不調用bind的客戶機上,connect成功返回後,Getsocknam返回內核分配給此連接的本地端口號和IP地址。

三次握手

最初始客戶機和服務器的Tcp進程他們都處於CLOSED狀態,首先是B的TCP服務器進程先創建了傳輸控制塊TCB,準備接受客戶端的連接請求,然後B服務器進程端就處於LISTEN狀態,等待客戶端的連接請求。然後A的TCP客戶進程也是首先創建了一個傳輸控制模塊,然後向B發出連接請求報文段,報文段的首部同步位SYN=1,同時給自己設定一個初始量S,此時客戶進程進入一個SEND狀態即就是同步已發送狀態。接著,B接收到A發出的連接請求以後, 同意連接建立,則需要向A發送一個確認。即把SYN和ACK都置為1,確認號為ack=S+1,同時還應發送一個自己的初始值假定為n,此時B進入同步收到狀態。最後客戶機A收到B的確認後,還應向B發出確認,將ACK置為1,另外將ack置為n+1,然後A將進入ESTABLISHED已建立連接狀態。在B收到A的確認後,也進入ESTABLISHED狀態。如下圖所示:

技術分享

四次揮手

A進程先向TCP發出一個連接釋放報文段,並停止再發送數據,主動關閉TCP連接,需要將終止控制位FIN置為1,並設置它的初始值U,這時A進入終止等待1狀態,等待B的確認。B收到鏈接釋放報文段後立即發出確認,確認號ack=U+1,例外設置一個自己的初始值v,然後B就進入CLOSE-WAIT狀態。當tcp通知高層應用程序後,然後AB之間的連接就釋放了,但是此時TCp處於半關閉狀態,即AB之間的連接釋放了,但是B還可以向A發送數據,A收到B的確認後就進入終止等待2狀態,等待B發出的連接釋放報文段。假設B發出連接釋放報文段,則要將終止控制位FIN置為1,同時發出確認號ack=u+1,還要再設置一個自己的初始值為W,然後B就進入了最後確認狀態LAST-ACK,等待A的確認;A收到B的鏈接釋放報文段後,向B發出確認,將ACK置為1,確認號置為W+1,然後A就進入TIME-WAIT時間等待狀態。,當A等待上2MSL最長報文段壽命後,即4S進入CLOSED狀態,才能開始下一個新連接的建立。

技術分享

請求http頁面的相關過程