HTTP協議(HyperText Transfer Protocol,超文本傳輸協議)是用于從WWW服務器傳輸超文本到本地閱讀器的傳送協議。它可使閱讀器更加高效,使網絡傳輸減少。它不但保證計算機正確快速地傳輸超文本文檔,還肯定傳輸文檔中的哪1部份,和哪部份內容首先顯示(如文本先于圖形)等。
在了解HTTP如何工作之前,我們先了解計算機之間的通訊。
互聯網的關鍵技術就是TCP/IP協議。兩臺計算機之間的通訊是通過TCP/IP協議在因特網上進行的。實際上這個是兩個協議:
TCP : Transmission Control Protocol 傳輸控制協議和IP: Internet Protocol 網際協議。
IP:計算機之間的通訊
IP協議是計算機用來相互辨認的通訊的1種機制,每臺計算機都有1個IP.用來在internet上標識這臺計算機。 IP 負責在因特網上發送和接收數據包。通過 IP,消息(或其他數據)被分割為小的獨立的包,并通過因特網在計算機之間傳送。IP 負責將每一個包路由至它的目的地。
IP協議僅僅是允許計算機相互發消息,但它其實不檢查消息是不是以發送的次序到達而且沒有破壞(只檢查關鍵的頭數據)。為了提供消息檢驗功能,直接在IP協議上設計了傳輸控制協議TCP.
TCP : 利用程序之間的通訊
TCP確保數據包以正確的次序到達,并且嘗試確認數據包的內容沒有改變。TCP在IP地址之上引端口(port),它允許計算機通過網絡提供各種服務。1些端口號為不同的服務保存,而且這些端口號是盡人皆知。
服務或守護進程:在提供服務的機器上,有程序監聽特定端口上的通訊流。例如大多數電子郵件通訊流出現在端口25上,用于wwww的HTTP通訊流出現在80端口上。
當利用程序希望通過 TCP 與另外一個利用程序通訊時,它會發送1個通訊要求。這個要求必須被送到1個確切的地址。在雙方“握手”以后,TCP 將在兩個利用程序之間建立1個全雙工 (full-duplex) 的通訊,占用兩個計算機之間全部的通訊線路。TCP 用于從利用程序到網絡的數據傳輸控制。TCP 負責在數據傳送之前將它們分割為 IP 包,然后在它們到達的時候將它們重組。
TCP/IP 就是TCP 和 IP 兩個協議在1起協同工作,有上下層次的關系。
TCP 負責利用軟件(比如你的閱讀器)和網絡軟件之間的通訊。IP 負責計算機之間的通訊。TCP 負責將數據分割并裝入 IP 包,IP 負責將包發送至接受者,傳輸進程要經IP路由器負責根據通訊量、網絡中的毛病或其他參數來進行正確地尋址,然后在它們到達的時候重新組合它們。
HTTP是基于TCP協議之上的。在TCP/IP協議參考模型的各層對應的協議以下圖,其中HTTP是利用層的協議。
HTTP由要求和響應構成,是1個標準的客戶端服務器模型(B/S)。HTTP協議永久都是客戶端發起要求,服務器回送響應。見下圖:
HTTP是1個無狀態的協議。無狀態是指客戶機(Web閱讀器)和服務器之間不需要建立持久的連接,這意味著當1個客戶端向服務器端發出要求,然后服務器返回響應(response),連接就被關閉了,在服務器端不保存連接的有關信息.HTTP遵守要求(Request)/應對(Response)模型??蛻魴C(閱讀器)向服務器發送要求,服務器處理要求并返回適當的應對。所有HTTP連接都被構造成1套要求和應對。
1次HTTP操作稱為1個事務,其工作全部進程以下:
1 ) 、地址解析,
如用客戶端閱讀器要求這個頁面:http://localhost.com:8080/index.htm
從中分解出協議名、主機名、端口、對象路徑等部份,對我們的這個地址,解析得到的結果以下:
協議名:http
主機名:localhost.com
端口:8080
對象路徑:/index.htm
在這1步,需要域名系統DNS解析域名localhost.com,得主機的IP地址。
2)、封裝HTTP要求數據包
把以上部份結合本機自己的信息,封裝成1個HTTP要求數據包
3)封裝成TCP包,建立TCP連接(TCP的3次握手)
在HTTP工作開始之前,客戶機(Web閱讀器)首先要通過網絡與服務器建立連接,該連接是通過TCP來完成的,該協議與IP協議共同構建Internet,即著名的TCP/IP協議族,因此Internet又被稱作是TCP/IP網絡。HTTP是比TCP更高層次的利用層協議,根據規則,只有低層協議建立以后才能,才能進行更層協議的連接,因此,首先要建立TCP連接,1般TCP連接的端口號是80。這里是8080端口
4)客戶機發送要求命令
建立連接后,客戶機發送1個要求給服務器,要求方式的格式為:統1資源標識符(URL)、協議版本號,后邊是MIME信息包括要求修飾符、客戶機信息和可內容。
5)服務器響應
服務器接到要求后,給予相應的響應信息,其格式為1個狀態行,包括信息的協議版本號、1個成功或毛病的代碼,后邊是MIME信息包括服務器信息、實體信息和可能的內容。
實體消息是服務器向閱讀器發送頭信息后,它會發送1個空白行來表示頭信息的發送到此為結束,接著,它就以Content-Type應對頭信息所描寫的格式發送用戶所要求的實際數據
6)服務器關閉TCP連接
1般情況下,1旦Web服務器向閱讀器發送了要求數據,它就要關閉TCP連接,然后如果閱讀器或服務器在其頭信息加入了這行代碼
Connection:keep-alive
TCP連接在發送后將依然保持打開狀態,因而,閱讀器可以繼續通過相同的連接發送要求。保持連接節省了為每一個要求建立新連接所需的時間,還節儉了網絡帶寬。
首先我們看看客戶端要求的時候,數據在各層協議的數據組織以下圖:
而服務器解析客戶機要求就是反向操作的進程,以下圖:
客戶機發起1次要求的時候:
客戶機會將要求封裝成http數據包-->封裝成Tcp數據包-->封裝成Ip數據包--->封裝成數據幀--->硬件將幀數據轉換成bit流(2進制數據)-->最后通過物理硬件(網卡芯片)發送到指定地點。
服務器硬件首先收到bit流....... 然后轉換成ip數據包。因而通過ip協議解析Ip數據包,然后又發現里面是tcp數據包,就通過tcp協議解析Tcp數據包,接著發現是http數據包通過http協議再解析http數據包得到數據。
HTTPS(全稱:Hypertext Transfer Protocol over Secure Socket Layer),是以安全為目標的HTTP通道,簡單講是HTTP的安全版。即HTTP下加入SSL層,HTTPS的安全基礎是SSL。其所用的端口號是443。
有兩種基本的加解密算法類型:
1)對稱加密(symmetrcic encryption):密鑰只有1個,加密解密為同1個密碼,且加解密速度快,典型的對稱加密算法有DES、AES,RC5,3DES等;
對稱加密主要問題是同享秘鑰,除你的計算機(客戶端)知道另外1臺計算機(服務器)的私鑰秘鑰,否則沒法對通訊流進行加密解密。解決這個問題的方案非對稱秘鑰。
2)非對稱加密:使用兩個秘鑰:公共秘鑰和私有秘鑰。私有秘鑰由1方密碼保存(1般是服務器保存),另外一方任何人都可以取得公共秘鑰。
這類密鑰成對出現(且根據公鑰沒法推知私鑰,根據私鑰也沒法推知公鑰),加密解密使用不同密鑰(公鑰加密需要私鑰解密,私鑰加密需要公鑰解密),相對對稱加密速度較慢,典型的非對稱加密算法有RSA、DSA等。
下面看1下https的通訊進程:
https通訊的優點:
1)客戶端產生的密鑰只有客戶端和服務器端能得到;
2)加密的數據只有客戶端和服務器端才能得到明文;
3)客戶端到服務真個通訊是安全的。
但是這次IE比較大方,允許的最大長度是10MB
HTTP/1.0
HTTP/1.1
HTTP-NG
HTTP/1.0
建立連接->要求->響應->斷開連接
每次連接只處理1次要求和相應,對資源的每次訪問都要建立1個單獨的連接。
閱讀器到服務器的每次通訊都是完全分開的。
沒有Host域,所以不可以創建基于主機頭的虛擬主機。
HTTP/1.1
在1個TCP連接中可以傳送多個HTTP要求和響應
不需要等待上次HTTP響應終了,可以多個HTTP要求同時進行。服務器會根據閱讀器發送的要求順序來按順序進行響應,這被稱作管線。
有Host域,可以建立虛擬主機。
結構:
要求行
若干消息頭(可選)
(CRLF)
實體內容(可選)
GET無實體內容
結構:
狀態行
若干消息頭(可選)
(CRLF)
實體內容(可選)
對HTTP/1.1,如果消息中包括實體內容,且沒有采取Transfer-Encoding: chunked傳輸編碼方式,則必須要有Content-Length消息頭。否則閱讀器和服務器都不知道什么時候消息結束。
沒有消息頭。
其中,簡單要求消息只可用于GET方式,且要求行中不指定HTTP版本號,
對簡單要求消息,服務器將會返回簡單響應消息,只返回實體內容。
如:
ROOT /index.html
閱讀器通過消息頭,比如可以告知服務器閱讀器的國家語言版本信息,可以告知服務器訪問者是從哪一個頁面訪問到當前頁面的。
服務器通過消息頭,比如可以告知閱讀器隔多長時間刷新1下,用哪一種字符集顯示內容,創建Cookie。
結構:
頭字段名稱(不辨別大小寫):_值,值,值(CRLF)
頭字段名稱(不辨別大小寫):_值,值,值(CRLF)
頭字段名稱(不辨別大小寫):_值,值,值(CRLF)
(可以任意順序排列)
分為:通用信息頭、要求頭、響應頭、實體頭4類。
結構:
要求方式_資源路徑_HTTP版本號(CRLF)
如:
GET /index.htm HTTP/1.1
要求方式:
Method |
|
GET |
要求獲得Request-URI所標識的資源 |
POST |
在Request-URI所標識的的資源后附加新的數據 |
HEAD |
要求獲得Request-URI所標識的資源的響應消息報頭 |
PUT |
要求服務器存儲1個資源,并用Request-URI作為資源標識 |
DELETE |
要求服務器刪除Request-URI所標識的資源 |
TRACE |
要求服務器回送收到的要求信息,主要用于測試和診斷 |
CONNECT |
保存將來使用 |
OPTIONS |
要求查詢服務器的性能,或查詢與資源相干的選項和需求 |
結構:
HTTP版本號_狀態碼_狀態描寫(CRLF)
如:
HTTP/1.1 200 OK
GET使用URL傳遞參數
如:
GET /List.aspx?Catagoryid=5&Cityid=23 HTTP/1.1
POST使用實體內容傳遞參數
如:
POST /List.aspx HTTP/1.1
Content-Type:application/x-www-form-urlencoded
Content-Length:22
Catagoryid=5&Cityid=23
在POST消息頭中要設置Content-Type的值為application/x-www-form-urlencoded,和使用Content-Length 以標識實體內容的長度。
當Content-Length長度比實體內容長度短時,則會疏忽多出部份的實體內容。當Content-Length少于實體長度時,則會繼續等待。
狀態代碼由3位數字組成,第1位定義了響應的種別:
1xx:唆使信息——表示要求已接收,繼續處理。
2xx:成功——表示要求已被成功接收、理解、接受。
3xx:重定向——要完成要求必須進行更進1步的操作。
4xx:客戶端毛病——要求有語法毛病或要求沒法實現。
常見狀態碼:
Status-Code |
Reason-Phrase |
|
200 |
OK |
客戶端要求成功 |
206 |
|
客戶端發送了帶有Range頭的GET
生活不易,碼農辛苦 |