1、概念web
協議是指計算機通訊網絡中兩臺計算機之間進行通訊所必須共同遵照的規定或規則,超文本傳輸協議(HTTP)是一種通訊協議,它容許將超文本標記語言(HTML)文檔從Web服務器傳送到客戶端的瀏覽器。瀏覽器
在Internet中全部的傳輸都是經過TCP/IP進行的。HTTP協議做爲TCP/IP模型中應用層的協議也不例外。HTTP協議一般承載於TCP協議之上,有時也承載於TLS或SSL協議層之上,這個時候,就成了咱們常說的HTTPS。以下圖所示:安全
HTTP默認的端口號爲80,HTTPS的端口號爲443。
服務器
2、特色網絡
HTTP協議永遠都是客戶端發起請求,服務器回送響應。這樣就限制了使用HTTP協議,沒法實如今客戶端沒有發起請求的時候,服務器將消息推送給客戶端。併發
HTTP協議的主要特色可歸納以下:
一、支持客戶/服務器模式。支持基本認證和安全認證。
二、簡單快速:客戶向服務器請求服務時,只需傳送請求方法和路徑。請求方法經常使用的有GET、HEAD、POST。每種方法規定了客戶與服務器聯繫的類型不一樣。因爲HTTP協議簡單,使得HTTP服務器的程序規模小,於是通訊速度很快。
三、靈活:HTTP容許傳輸任意類型的數據對象。正在傳輸的類型由Content-Type加以標記。
四、HTTP 0.9和1.0使用非持續鏈接:限制每次鏈接只處理一個請求,服務器處理完客戶的請求,並收到客戶的應答後,即斷開鏈接。採用這種方式能夠節省傳輸時間。HTTP 1.1使用持續鏈接:沒必要爲每一個web對象建立一個新的鏈接,一個鏈接能夠傳送多個對象。
五、無狀態:HTTP協議是無狀態協議。無狀態是指協議對於事務處理沒有記憶能力。缺乏狀態意味着若是後續處理須要前面的信息,則它必須重傳,這樣可能致使每次鏈接傳送的數據量增大。less
無狀態協議:
協議的狀態是指下一次傳輸能夠「記住」此次傳輸信息的能力。
http是不會爲了下一次鏈接而維護此次鏈接所傳輸的信息,爲了保證服務器內存。
好比客戶得到一張網頁以後關閉瀏覽器,而後再一次啓動瀏覽器,再登錄該網站,可是服務器並不知道客戶關閉了一次瀏覽器。
由 於Web服務器要面對不少瀏覽器的併發訪問,爲了提升Web服務器對併發訪問的處理能力,在設計HTTP協議時規定Web服務器發送HTTP應答報文和文 檔時,不保存發出請求的Web瀏覽器進程的任何狀態信息。這有可能出現一個瀏覽器在短短几秒以內兩次訪問同一對象時,服務器進程不會由於已經給它發過應答 報文而不接受第二期服務請求。因爲Web服務器不保存發送請求的Web瀏覽器進程的任何信息,所以HTTP協議屬於無狀態協議(Stateless Protocol)。
網站
HTTP協議是無狀態的和Connection: keep-alive的區別:
無狀態是指協議對於事務處理沒有記憶能力,服務器不知道客戶端是什麼狀態。從另外一方面講,打開一個服務器上的網頁和你以前打開這個服務器上的網頁之間沒有任何聯繫。
HTTP是一個無狀態的面向鏈接的協議,無狀態不表明HTTP不能保持TCP鏈接,更不能表明HTTP使用的是UDP協議(無鏈接)。
從HTTP/1.1起,默認都開啓了Keep-Alive,保持鏈接特性,簡單地說,當一個網頁打開完成後,客戶端和服務器之間用於傳輸HTTP數據的TCP鏈接不會關閉,若是客戶端再次訪問這個服務器上的網頁,會繼續使用這一條已經創建的鏈接。
Keep-Alive不會永久保持鏈接,它有一個保持時間,能夠在不一樣的服務器軟件(如Apache)中設定這個時間。
spa
3、工做流程設計
一次HTTP操做稱爲一個事務,其工做過程可分爲四步:
1)首先客戶機與服務器須要創建鏈接。只要單擊某個超級連接,HTTP的工做開始。
2)創建鏈接後,客戶機發送一個請求給服務器,請求方式的格式爲:統一資源標識符(URL)、協議版本號,後邊是MIME信息包括請求修飾符、客戶機信息和可能的內容。
3)服務器接到請求後,給予相應的響應信息,其格式爲一個狀態行,包括信息的協議版本號、一個成功或錯誤的代碼,後邊是MIME信息包括服務器信息、實體信息和可能的內容。
4)客戶端接收服務器所返回的信息經過瀏覽器顯示在用戶的顯示屏上,而後客戶機與服務器斷開鏈接。
若是在以上過程當中的某一步出現錯誤,那麼產生錯誤的信息將返回到客戶端,有顯示屏輸出。對於用戶來講,這些過程是由HTTP本身完成的,用戶只要用鼠標點擊,等待信息顯示就能夠了。
HTTP是基於傳輸層的TCP協議,而TCP是一個端到端的面向鏈接的協議。所謂的端到端能夠理解爲進程到進程之間的通訊。因此HTTP在開始傳輸以前,首先須要創建TCP鏈接,而TCP鏈接的過程須要所謂的「三次握手」。下圖所示TCP鏈接的三次握手。
在TCP三次握手以後,創建了TCP鏈接,此時HTTP就能夠進行傳輸了。一個重要的概念是面向鏈接,既HTTP在傳輸完成之間並不斷開TCP鏈接。在HTTP1.1中(經過Connection頭設置)這是默認行爲。