1. 程式人生 > >http協議詳解-1

http協議詳解-1

HTTP簡介

      HTTP協議(HyperText Transfer Protocol,超文字傳輸協議)是用於從WWW伺服器傳輸超文字到本地瀏覽器的傳送協議。它可以使瀏覽器更加高效,使網路傳輸減少。它不僅保證計算機正確快速地傳輸超文字文件,還確定傳輸文件中的哪一部分,以及哪部分內容首先顯示(如文字先於圖形)等。

     網際網路的關鍵技術就是TCP/IP協議。兩臺計算機之間的通訊是通過TCP/IP協議在因特網上進行的。http協議是建立在TCP/IP協議之上的,下面先對這兩種協議進行介紹:TCP : Transmission Control Protocol 傳輸控制協議和IP: Internet Protocol 網際協議。

IP:計算機之間的通訊

     IP協議是計算機用來相互識別的通訊的一種機制,每臺計算機都有一個IP.用來在internet上標識這臺計算機。 IP 負責在因特網上傳送和接收資料包。通過 IP,訊息(或者其他資料)被分割為小的獨立的包(資料報),並通過因特網在計算機之間傳送。IP 負責將每個包路由至它的目的地。
     IP協議僅僅是允許計算機相互發訊息,但它並不檢查訊息是否以傳送的次序到達而且沒有損壞(只檢查關鍵的頭資料)。為了提供訊息檢驗功能,直接在IP協議上設計了傳輸控制協議TCP.

TCP : 應用程式之間的通訊

     TCP確保資料包以正確的次序到達,並且嘗試確認資料包的內容沒有改變。TCP在IP地址之上引埠(port),它允許計算機通過網路提供各種服務。一些埠號為不同的服務保留,而且這些埠號是眾所周知。

     服務或者守護程序:在提供服務的機器上,有程式監聽特定埠上的通訊流。例如大多數電子郵件通訊流出現在埠25上,用於wwww的HTTP通訊流出現在80埠上。

     當應用程式希望通過 TCP 與另一個應用程式通訊時,它會發送一個通訊請求。這個請求必須被送到一個確切的地址。在雙方“握手”之後,TCP 將在兩個應用程式之間建立一個全雙工 (full-duplex) 的通訊,佔用兩個計算機之間整個的通訊線路。TCP 用於從應用程式到網路的資料傳輸控制。TCP 負責在資料傳送之前將它們分割為 IP 包,然後在它們到達的時候將它們重組。TCP/IP 就是TCP 和 IP 兩個協議在一起協同工作,有上下層次的關係。

     TCP 負責應用軟體(比如你的瀏覽器)和網路軟體之間的通訊。IP 負責計算機之間的通訊。TCP 負責將資料分割並裝入 IP 包,IP 負責將包傳送至接受者,傳輸過程要經IP路由器負責根據通訊量、網路中的錯誤或者其他引數來進行正確地定址,然後在它們到達的時候重新組合它們。

HTTP所在協議層

     計算機中協議層次對應圖如下所示:

這裡寫圖片描述
http協議在應用層。

hTTP協議請求響應模型

     HTTP由請求和響應構成,是一個標準的客戶端伺服器模型(B/S)。HTTP協議永遠都是客戶端發起請求,伺服器回送響應。見下圖:

這裡寫圖片描述

     HTTP是一個無狀態的協議。無狀態是指客戶機(Web瀏覽器)和伺服器之間不需要建立持久的連線,這意味著當一個客戶端向伺服器端發出請求,然後伺服器返回響應(response),連線就被關閉了,在伺服器端不保留連線的有關資訊。HTTP遵循請求(Request)/應答(Response)模型。客戶機(瀏覽器)向伺服器傳送請求,伺服器處理請求並返回適當的應答。所有HTTP連線都被構造成一套請求和應答。(為了解決這個問題,web程式引入了cookie來解決這個問題)

HTTP工作過程

一次HTTP操作稱為一個事務,其工作整個過程如下:

1 、 地址解析

     如用客戶端瀏覽器請求這個頁面:http://localhost.com:8080/index.htm ,從中分解出協議名、主機名、埠、物件路徑等部分,對於我們的這個地址,解析得到的結果如下:
     協議名:http
     主機名:localhost.com
     埠:8080
     物件路徑:/index.htm

     在這一步,需要域名系統DNS解析域名localhost.com,得主機的IP地址,但是對於網際網路中的網路地址,域名的解析還是一個相對複雜的過程,具體過程如下。

域名解析

     假設我們請求的地址為www.linux178.com,Chrome瀏覽器會解析 www.linux178.com 這個域名對應的IP地址。怎麼解析到對應的IP地址?
     Chrome瀏覽器會首先搜尋瀏覽器自身的DNS快取(快取時間比較短,大概只有1分鐘,且只能容納1000條快取)。如果瀏覽器自身快取找不到則會檢視系統的DNS快取,如果找到且沒有過期則停止搜尋解析到此結束;而如果本機沒有找到DNS快取,則瀏覽器會發起一個DNS的系統呼叫,就會向本地配置的首選DNS伺服器發起域名解析請求(通過的是UDP協議向DNS的53埠發起請求,這個請求是遞迴的請求,也就是運營商的DNS伺服器必須得提供給我們該域名的IP地址),運營商的DNS伺服器首先查詢自身的快取,找到對應的條目,且沒有過期,則解析成功。如果沒有找到對應的條目,則有運營商的DNS代我們的瀏覽器發起迭代DNS解析請求,它首先是會找根域的DNS的IP地址(這個DNS伺服器都內建13臺根域的DNS的IP地址),找根域的DNS地址,就會向其發起請求(請問www.linux178.com這個域名的IP地址是多少啊?),根域發現這是一個頂級域com域的一個域名,於是就告訴運營商的DNS我不知道這個域名的IP地址,但是我知道com域的IP地址,你去找它去,於是運營商的DNS就得到了com域的IP地址,又向com域的IP地址發起了請求(請問www.linux178.com這個域名的IP地址是多少?),com域這臺伺服器告訴運營商的DNS我不知道www.linux178.com這個域名的IP地址,但是我知道linux178.com這個域的DNS地址,你去找它去,於是運營商的DNS又向linux178.com這個域名的DNS地址(這個一般就是由域名註冊商提供的,像萬網,新網等)發起請求(請問www.linux178.com這個域名的IP地址是多少?),這個時候linux178.com域的DNS伺服器一查,誒,果真在我這裡,於是就把找到的結果傳送給運營商的DNS伺服器,這個時候運營商的DNS伺服器就拿到了www.linux178.com這個域名對應的IP地址,並返回給Windows系統核心,核心又把結果返回給瀏覽器,終於瀏覽器拿到了www.linux178.com對應的IP地址,該進行一步的動作了。

2)封裝HTTP請求資料包

     把以上部分結合本機自己的資訊,封裝成一個HTTP請求資料包

3)封裝成TCP包,建立TCP連線(TCP的三次握手)

     在HTTP工作開始之前,客戶機(Web瀏覽器)首先要通過網路與伺服器建立連線,該連線是通過TCP來完成的,該協議與IP協議共同構建Internet,即著名的TCP/IP協議族,因此Internet又被稱作是TCP/IP網路。HTTP是比TCP更高層次的應用層協議,根據規則,只有低層協議建立之後才能,才能進行更高層協議的連線,因此,首先要建立TCP連線,一般TCP連線的埠號是80。這裡是8080埠

4)客戶機發送請求命令

     建立連線後,客戶機發送一個請求給伺服器,請求方式的格式為:統一資源識別符號(URL)、協議版本號,後邊是MIME資訊包括請求修飾符、客戶機資訊和可內容。

5)伺服器響應

     伺服器接到請求後,給予相應的響應資訊,其格式為一個狀態行,包括資訊的協議版本號、一個成功或錯誤的程式碼,後邊是MIME資訊包括伺服器資訊、實體資訊和可能的內容。實體訊息是伺服器向瀏覽器傳送頭資訊後,它會發送一個空白行來表示頭資訊的傳送到此為結束,接著,它就以Content-Type應答頭資訊所描述的格式傳送使用者所請求的實際資料

6)伺服器關閉TCP連線

     一般情況下,一旦Web伺服器向瀏覽器傳送了請求資料,它就要關閉TCP連線,然後如果瀏覽器或者伺服器在其頭資訊加入了這行程式碼

Connection:keep-alive

TCP連線在傳送後將仍然保持開啟狀態,於是,瀏覽器可以繼續通過相同的連線傳送請求。保持連線節省了為每個請求建立新連線所需的時間,還節約了網路頻寬。

HTTP協議棧中各層資料流

     首先我們看看客戶端請求的時候,資料在各層協議的資料組織如下圖:
這裡寫圖片描述

     而伺服器解析客戶機請求就是反向操作的過程,如下圖:
這裡寫圖片描述

     客戶機發起一次請求的時候:

     客戶機會將請求封裝成http資料包–>封裝成Tcp資料包–>封裝成Ip資料包—>封裝成資料幀—>硬體將幀資料轉換成bit流(二進位制資料)–>最後通過物理硬體(網絡卡晶片)傳送到指定地點。

     伺服器硬體首先收到bit流……. 然後轉換成ip資料包。於是通過ip協議解析Ip資料包,然後又發現裡面是tcp資料包,就通過tcp協議解析Tcp資料包,接著發現是http資料包通過http協議再解析http資料包得到資料。