1. 程式人生 > >Servlet詳解(三)---http請求

Servlet詳解(三)---http請求

基礎上 不同 請求頭 所有 htm 建立 同時 發出 14.

一.建立TCP連接:

1.在http工作開始前,需要讓Web瀏覽器與Web服務器連接起來,而只要找到Web服務器的地址就可以完成連接,該功能又TCP來完成,而TCP協議與IP協議共同完成了Internet這個網絡系統。HTTP協議是位於運輸層(TCP)/網絡層(IP)之上的應用層的協議。由於網絡中所有上層協議都應該建立在下層協議的基礎上。所有要優先於完成TCP連接,當然TCP/IP同樣建立在更下層的數據鏈路層與物理層之上,但是由於不大相關所以就不提了。

2.三次握手

為什麽需要三次握手:前兩次確保瀏覽器與服務器之間連接的通暢,第三次防止請求由於一些原因被擱置很久。

三次握手詳解:

技術分享圖片

第一次握手:瀏覽器先向服務端發送報文,報文中SYN位置設置為1,Sequence Number(序列數字)設置為X。(個人理解SYN是為了防止同一個瀏覽器向同一個服務端多次請求)

第二次握手:服務端再接收到第一次的報文以後,向瀏覽器回發報文,SYN同樣為1,將Acknowlegment Number(確認數字)設為X+1,並將Sequence Number設置為Y。第一次握手的目的不需要多說,僅僅是個請求,第二次握手的目的在於確保瀏覽端發送至服務端這條線路是通的。

第三次握手:瀏覽器再接收到第二次的報文以後,向服務端回發報文,Acknowlegment Number設為Y+1,Sequence Number設置為Z(用於斷開TCP連接的四次揮手)。第三次握手的目的並非是確認瀏覽器到服務器的連接是否通順,因為這點在第一次握手已經確認了,不然也不會完成第二次握手。第三次握手的目的在於確保請求的即時性,如果第一次握手在由於一些原因請求被擱置,一段時間後才發送至server,而server是無法判斷你是否還需要連接的(比如瀏覽器卡住後,有些人會等待響應,而有些人會關掉瀏覽器),所以server還是會發送第二次握手,第三次握手的目的在於確認你是否還需要建立連接。如果不需要,則不會發送第三次握手,server也不會繼續連接。如果需要則發送第三次。

二、連接成功後,服務端與瀏覽端的交互

技術分享圖片

1.瀏覽器向服務端發送請求命令:包含URL,請求方法(get or post)等信息

2.瀏覽器向服務端發送請求頭部:即Request Headers內部內容

3.服務端應答:與瀏覽器發送的請求命令相似,應答會發送服務端的自身相關信息,以及被請求文檔的相關信息

4.服務端發送應答頭部:即Response Headersnei‘bu內部內容。

三、請求報文Request

1.請求報文的三個部分及其基本內容:

技術分享圖片

2.請求行:

請求行主要包括:URL地址,請求方法(主要是doGet與doPost,也有doput,dodelete等),協議的版本(即http版本),請求行後會有換行符標識請求行結束

3.請求頭部:

請求頭部采用鍵值對方法,Key與Value之間使用“:”隔開,主要為客戶端請求的一些類型,請求頭部結束使用回車加換行作為單獨一行標識

常見的請求頭有

技術分享圖片

3.請求數據

如果用戶是通過url發出訪問請求,則不會有請求數據,如果是通過網頁提交一些數據則會將這些數據作為鍵值對存放在請求數據中

四、Response響應

1.響應報文的三個部分及其基本作用

技術分享圖片

2.狀態行:協議版本不用多說,狀態碼是響應的結果,狀態碼描述是對狀態碼的一個簡單描述

常見的狀態碼:

技術分享圖片

2.響應頭部:基本格式與請求頭部相同,同樣鍵值對,同樣回車換行標識,只是常見的屬性不同而已

技術分享圖片

3.響應數據:

響應數據就是將你請求的網址以html格式發送給客戶端。

五、四次揮手

當我們傳送數據結束後,需要關閉掉TCP連接,而關閉同樣也需要如同握手一般,所以就有了四次揮手:

技術分享圖片

1.四次揮手可以看成兩個部分:第一次揮手和第二次揮手為第一部分,第三次揮手以及第四次揮手看做第二部分,沒有明確劃分,僅僅是便於理解的說話。

2.第一次揮手:Fin標記主機名,Acknowlegment Number源自三次握手中的Z,Sequence Number作為一個確認碼,主要用於告訴服務器,瀏覽器將停止輸出數據。

3.第二次揮手:Acknowlegment Number值為X+1,Sequence Number用來接收Z,主要用於響應第一次揮手,告訴瀏覽器,服務器收到你的斷開請求,請等待服務器的的斷開請求,很多人到這裏就不明白了,認為第二次揮手後就應該直接關閉。但是這次只能使得瀏覽器不能發送數據,而服務端依然可以,這違反了TCP的全雙工模式(交換機在發送數據的同時也可以接收數據),所以需要第三次第四次揮手再來斷開服務器發送數據的能力。

4.第三次揮手:與第一次類似,Fin代表主機名,Acknowlegment Number值為X,Sequence Number順序碼設置為Y,並發送給瀏覽器,請求瀏覽器斷開服務器發送數據能力。

5.第四次揮手:返回Acknowlegment Number為Y,Sequence Number為X,發送給服務器,並確認斷開連接。

Servlet詳解(三)---http請求