淺談HTTP協議

概念:

超文本傳輸協議(HTTP:Hyper Text Transfer Procotol)是互聯網上應用最為廣泛的一種網路協議。http是一個應用層協議(七層協議包括:應用層,表示層,會話層,傳輸層,網路層,數據鏈路層,物理層),由請求和響應構成,是一個標準的客戶端伺服器模型。http是一個無狀態的協議。

特點:

HTTP協議永遠都是從客戶端發起,由伺服器響應。無法實現沒有客戶端發起,而伺服器直接推送給客戶端的消息。

http協議的主要特點可概括如下:

1.支持客戶/伺服器模式,支持基本認證和安全認證。

2.簡單快速:客戶端向伺服器發送請求時,只需傳送請求方法和請求地址。常用的http請求方法有GET,POST,HEAD。每種方法規定了客戶端與伺服器連接方式不同。由於http協議比較簡單,使得伺服器的種序規模比較小,因而通信速度比較快。

Advertisements

3.靈活:HTTP協議允許傳輸任意類型的數據對象,數據傳輸的類型由Content-Type加以標記。

4.Http0.9和1.0使用非持續連接,即客戶端發送請求后,伺服器處理完客戶的請求,客戶端收到伺服器響應后,連接即斷開。http1.1是持續連接,不必為每個web對象創建一個新的連接,一次連接可以傳輸多個對象,採用這種方式可以節約傳輸時間。

5.無狀態:HTTP是無狀態協議。無狀態協議是指對事務處理沒有記憶功能,缺少狀態意味者後續處理無法獲得前期的信息,則它必須重傳,這樣會增大數據傳輸量。

無協議狀態:

協議的狀態是指下一次傳輸可以"記住"這次傳輸信息的能力。

http協議是不會為了下一次連接而維護這次連接的信息,為了保證伺服器的內存。

Advertisements

比如客戶獲得一張網頁之後關閉瀏覽器,然後再次打開瀏覽器訪問該網頁,但是伺服器不知道客戶關閉了一次瀏覽器。

由於Web伺服器要接收許多瀏覽器的併發訪問,為了提高Web伺服器的併發處理能力,在設計http協議時規定Web伺服器發送應答報文和文檔時,不保存發出請求的Web瀏覽器進程的任何信息。還有可能出現在短短几秒內兩次訪問同一對象時,伺服器不會因為已經

給它應答報文而不接受第二次訪問請求。由於Web伺服器不保存任何發送請求瀏覽器的進程信息,所以HTTP協議是無狀態的協議。

HTTP協議是無狀態的和Connection:keep-alive的區別:

無狀態是指協議對於事務處理沒有記憶能力,伺服器不知道客戶端是什麼狀態。從另一方面講,打開一個伺服器上的網頁和你之前打開這個網頁沒有什麼聯繫。

HTTP是一個無狀態的面向連接的協議,無狀態不代表不能保持TCP連接,更不能代表HTTP使用的UDP(無狀態)協議。

從HTTP1.1起,默認都開啟了Keep-Alive,保持連接特性,簡單的說,當打一個網頁打開完成後,客戶端與伺服器用於傳輸HTTP數據的TCP連接沒有斷開,如果客戶端繼續訪問這個伺服器的網頁,則可以繼續使用這條已經建立的連接。

Keep-Alive不會保持永久連接,它有一個保持時間,可以在不同的伺服器進行設置這個時間。

工作流程:

一次HTTP操作稱作一次事務,其工作過程可以分為以下四部:

  1. 首先客戶端與伺服器建立連接。只要單擊某個超鏈接,HTTP就開始了

  2. 建立連接后,客戶端向伺服器發送請求,請求方式的格式為:統一資源標識符(URL)、協議版本號,後邊是MIME信息包括請求修飾符,客戶機信息和可能的內容。

  3. 伺服器收到請求后,給予相應的響應信息,其格式包括一個狀態行,包括信息的版本號,一個成功或錯誤的代碼,後邊是MIME信息包括伺服器信息,實體信息和可能的內容

  4. 客戶端接收到伺服器返回的信息,然後通過瀏覽器顯示到屏幕上,然後連接斷開。

    如果以上某一步出現錯誤,那麼返回的錯誤信息出現在屏幕上。對於用戶來說,只需要點擊超鏈接,其它的則由HTTP自動完成。

    HTTP是基於傳輸層的TCP協議,而TCP是一個端到端的的面向連接的協議。所謂端到端可以理解進程到進程這間的通信。所以HTTP在開始傳輸之前,首先需要建立TCP連接,而TCP連接需要三次握手。下圖是3次握手:

四 使用Wireshark抓TCP、http包

打開Wireshark,選擇工具欄上的"Capture"->"Options"

頭域

每個頭域都有一個域名,冒號(:)和域值三部分組成。域名是大小無關的,域值前可以添加任何數量的空格符,頭域可以被擴展為多行,在每行開始處,使用至少一個空格或製表符。

5.1 請求方法:

HTTP1.1協議中共定義了8種方法,來表明Request-URI指定的資源的不同操作方式:

OPTIONS:-返回伺服器針對特定資源所支持的HTTP請求方法。也可以利用向WEB伺服器發送」*」的請求方法來測試伺服器的功能性。

HEAD-向伺服器索要與GET請求相一致的響應,只不過響應體不會被返回。此方法可以在不傳輸整個響應體的過程中,就可以獲取包含響應頭信息中的元信息。此方法可以用以測試超鏈接的有效性,是否可以訪問,以及最近是否有更新。

GET-向特定的資源發出請求。GET方法不應應用於產生」副作用」的操作中。在wep app請求中容易被網路爬蟲等隨意訪問。

POST-向指定資源提交數據進行請求處理(例如提交表單或者上傳文件)。數據包含在請求體中,POST請求可能會導致新的資源的建立或原有資源的修改。

點擊"Capture Filter",此處選擇的是"HTTP TCP port(80)",選擇後點擊上圖的"Start"開始抓包。

然後在瀏覽器中打開http://image.baidu.com/,抓包結果如下圖所示:

在上圖中,可清晰的看到客戶端瀏覽器(ip為192.168.1.6)與伺服器(115.239.210.36)的交互過程:

1)No1:瀏覽器(192.168.1.6)向伺服器(115.239.210.36)發出連接請求。此為TCP三次握手第一步,此時從圖中可以看出,為SYN,seq:X (x=0);

2)No2:伺服器(115.239.210.36)回應了瀏覽器(192.168.1.6)的請求,並要求確認,此時為:SYN,ACK,此時seq:y(y為0),ACK:x+1(為1)。此為三次握手的第二步;

3)No3:瀏覽器(192.168.1.6)回應了伺服器(115.239.210.36)的確認,連接成功。為:ACK,此時seq:x+1(為1),ACK:y+1(為1)。此為三次握手的第三步;

4)No4:瀏覽器(192.168.1.6)發出一個頁面HTTP請求;

5)No5:伺服器(115.239.210.36)確認;

6)No6:伺服器(115.239.210.36)發送數據;

7)No8:客戶端瀏覽器(192.168.1.6)確認;

8)No81:客戶端(192.168.1.6)發出一個圖片HTTP請求;

9)No202:伺服器(115.239.210.36)發送狀態響應碼200 OK。

Advertisements

你可能會喜歡