一、HTTP 簡介
- HTTP協議是Hyper Text Transfer Protocol(超文本傳輸協議)的縮寫,是用於從萬維網(WWW)服務器傳輸超文本到本地瀏覽器的傳送協議。。
- HTTP是一個基於TCP/IP通信協議來傳遞數據(HTML 文件, 圖片文件, 查詢結果等)。
- HTTP 工作原理
- HTTP協議工作於客戶端-服務端架構上。瀏覽器作爲HTTP客戶端通過URL向HTTP服務端即WEB服務器發送所有請求。
- Web服務器有:Apache服務器,IIS服務器(Internet Information Services)等。
- Web服務器根據接收到的請求後,向客戶端發送響應信息。
- HTTP默認端口號爲80,但是你也可以改爲8080或者其他端口。
- HTTP三點注意事項:
HTTP是無連接:無連接的含義是限制每次連接只處理一個請求。服務器處理完客戶的請求,並收到客戶的應答後,即斷開連接。採用這種方式可以節省傳輸時間。
HTTP是媒體獨立的:這意味着,只要客戶端和服務器知道如何處理的數據內容,任何類型的數據都可以通過HTTP發送。客戶端以及服務器指定使用適合的MIME-type內容類型。
HTTP是無狀態:HTTP協議是無狀態協議。無狀態是指協議對於事務處理沒有記憶能力。缺少狀態意味着如果後續處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數據量增大。另一方面,在服務器不需要先前信息時它的應答就較快。
1、HTTP是基於客戶端/服務端(C/S)的架構模型,通過一個可靠的鏈接來交換信息,是一個無狀態的請求/響應協議。
2、HTTP使用統一資源標識符(Uniform Resource Identifiers, URI)來傳輸數據和建立連接。
- 客戶端請求消息
客戶端發送一個HTTP請求到服務器的請求消息包括以下格式:請求行(request line)、請求頭部(header)、空行和請求數據四個部分組成,下圖給出了請求報文的一般格式。
- 服務端響應消息
HTTP響應也由四個部分組成,分別是:狀態行、消息報頭、空行和響應正文。
三、HTTP 請求方法
HTTP1.0定義了三種請求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五種請求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
1 |
GET |
請求指定的頁面信息,並返回實體主體。 |
2 |
HEAD |
類似於get請求,只不過返回的響應中沒有具體的內容,用於獲取報頭 |
3 |
POST |
向指定資源提交數據進行處理請求(例如提交表單或者上傳文件)。數據被包含在請求體中。POST請求可能會導致新的資源的建立和/或已有資源的修改。 |
4 |
PUT |
從客戶端向服務器傳送的數據取代指定的文檔的內容。 |
5 |
DELETE |
請求服務器刪除指定的頁面。 |
6 |
CONNECT |
HTTP/1.1協議中預留給能夠將連接改爲管道方式的代理服務器。 |
7 |
OPTIONS |
允許客戶端查看服務器的性能。 |
8 |
TRACE |
回顯服務器收到的請求,主要用於測試或診斷。 |
- PUT方法和POST方法的區別:
POST方法用來創建資源,而PUT方法則用來更新資源
最根本的區別就是:POST方法不是冪等的,而PUT方法則有冪等性。
冪等(idempotent、idempotence)是一個抽象代數的概念。在計算機中,可以這麼理解,一個冪等操作的特點就是其任意多次執行所產生的影響均與依次一次執行的影響相同。
POST在請求的時候,服務器會每次都創建一個文件,但是在PUT方法的時候只是簡單地更新,而不是去重新創建。因此PUT是冪等的。
如果該更新對應的URI多次調用的結果一致,則PUT。如果每次提交相同的內容,最終結果不一致的時候,用POST。也即看服務器是不是idempotent的。
- GET方法和POST方法的區別:
(1)GET - 從指定的資源請求數據。查詢字符串(名稱/值對)是在 GET 請求的 URL 中發送的。
- GET 請求可被緩存
- GET 請求保留在瀏覽器歷史記錄中
- GET 請求可被收藏爲書籤
- GET 請求不應在處理敏感數據時使用
- GET 請求有長度限制
- GET 請求只應當用於取回數據
(2)POST - 向指定的資源提交要被處理的數據。查詢字符串(名稱/值對)是在 POST 請求的 HTTP 消息主體中發送的。
- POST 請求不會被緩存
- POST 請求不會保留在瀏覽器歷史記錄中
- POST 不能被收藏爲書籤
- POST 請求對數據長度沒有要求
http://www.w3school.com.cn/tags/html_ref_httpmethods.asp
四、HTTP 請求頭和響應頭
1. HTTP請求頭
(1)accept:瀏覽器通過這個頭告訴服務器,它所支持的數據類型。如:text/html, image/jpeg
(2)accept-Charset:瀏覽器通過這個頭告訴服務器,它支持哪種字符集。
(3)accept-encoding:瀏覽器通過這個頭告訴服務器,它支持哪種壓縮格式。
(4)accept-language:瀏覽器通過這個頭告訴服務器,它的語言環境。
(5)host:瀏覽器通過這個頭告訴服務器,它想訪問哪臺主機。
(6)if-modified-since:瀏覽器通過這個頭告訴服務器,緩存數據的時間
(7)referer:瀏覽器通過這個頭告訴服務器,客戶機是哪個頁面來的(防盜鏈)。
(8)Connection:瀏覽器通過這個頭告訴服務器,請求完後是斷開鏈接還是維持鏈接。
2. HTTP響應頭
(1)location:服務器通過這個頭告訴瀏覽器跳到哪裏。
(2)server:服務器通過這個頭告訴瀏覽器服務器的型號。
(3)content-encoding:服務器通過這個頭告訴瀏覽器數據的壓縮格式。
(4)content-length:服務器通過這個頭告訴瀏覽器回送數據的長度。
(5)content-language:服務器通過這個頭告訴瀏覽器語言環境。
(6)content-type:服務器通過這個頭告訴瀏覽器回送數據的類型。
Content-Type,內容類型,一般是指網頁中存在的Content-Type,用於定義網絡文件的類型和網頁的編碼,決定瀏覽器將以什麼形式、什麼編碼讀取這個文件,這就是經常看到一些Asp網頁點擊的結果卻是下載到的一個文件或一張圖片的原因。
(7)refresh:服務器通過這個頭告訴瀏覽器定時刷新。
(8)content-disposition:服務器通過這個頭告訴瀏覽器以下載方式打開數據。
(9)transfer-encoding:服務器通過這個頭告訴瀏覽器數據是以分塊方式回送的
以下三個表示服務器通過這個頭告訴瀏覽器不要緩存
(10)expires:-1
(11)cache-control:no-cache
(12)pragma:no-cache
五、HTTP 狀態碼
下面是常見的HTTP狀態碼:
- 200 - 請求成功
- 301 - 資源(網頁等)被永久轉移到其它URL
- 404 - 請求的資源(網頁等)不存在
- 500 - 內部服務器錯誤
HTTP狀態碼分類 |
|
分類 |
分類描述 |
1** |
信息,服務器收到請求,需要請求者繼續執行操作 |
2** |
成功,操作被成功接收並處理 |
3** |
重定向,需要進一步的操作以完成請求 |
4** |
客戶端錯誤,請求包含語法錯誤或無法完成請求 |
5** |
服務器錯誤,服務器在處理請求的過程中發生了錯誤 |
六、HTTP1.0、HTTP1.1和HTTP2.0
(一)HTTP的基本優化
影響一個 HTTP 網絡請求的因素主要有兩個:帶寬和延遲。
- 帶寬:如果說我們還停留在撥號上網的階段,帶寬可能會成爲一個比較嚴重影響請求的問題,但是現在網絡基礎建設已經使得帶寬得到極大的提升,我們不再會擔心由帶寬而影響網速,那麼就只剩下延遲了。
- 延遲:
- 瀏覽器阻塞(HOL blocking):瀏覽器會因爲一些原因阻塞請求。瀏覽器對於同一個域名,同時只能有 4 個連接(這個根據瀏覽器內核不同可能會有所差異),超過瀏覽器最大連接數限制,後續請求就會被阻塞。
- DNS 查詢(DNS Lookup):瀏覽器需要知道目標服務器的 IP 才能建立連接。將域名解析爲 IP 的這個系統就是 DNS。這個通常可以利用DNS緩存結果來達到減少這個時間的目的。
- 建立連接(Initial connection):HTTP 是基於 TCP 協議的,瀏覽器最快也要在第三次握手時才能捎帶 HTTP 請求報文,達到真正的建立連接,但是這些連接無法複用會導致每次請求都經歷三次握手和慢啓動。三次握手在高延遲的場景下影響較明顯,慢啓動則對文件類大請求影響較大。
(二)Http1.0 和Http 1.1主要區別
- 長連接——HTTP 1.0需要使用keep-alive參數來告知服務器端要建立一個長連接,而HTTP1.1默認支持長連接。
HTTP是基於TCP/IP協議的,創建一個TCP連接是需要經過三次握手的,有一定的開銷,如果每次通訊都要重新建立連接的話,對性能有影響。因此最好能維持一個長連接,可以用個長連接來發多個請求。
- 節約帶寬——HTTP 1.1支持只發送header信息(不帶任何body信息),如果服務器認爲客戶端有權限請求服務器,則返回100,否則返回401。客戶端如果接受到100,纔開始把請求body發送到服務器。這樣當服務器返回401的時候,客戶端就可以不用發送請求body了,節約了帶寬。
另外HTTP還支持傳送內容的一部分。這樣當客戶端已經有一部分的資源後,只需要跟服務器請求另外的部分資源即可。這是支持文件斷點續傳的基礎。
- HOST域——現在可以web server例如tomat,設置虛擬站點是非常常見的,也即是說,web server上的多個虛擬站點可以共享同一個ip和端口。
- 緩存處理——在HTTP1.0中主要使用header裏的If-Modified-Since,Expires來做爲緩存判斷的標準,HTTP1.1則引入了更多的緩存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供選擇的緩存頭來控制緩存策略。
- Http1.1 和Http 2.0主要區別
- 多路複用
HTTP2.0使用了多路複用的技術,做到同一個連接併發處理多個請求,而且併發請求的數量比HTTP1.1大了好幾個數量級。
當然HTTP1.1也可以多建立幾個TCP連接,來支持處理更多併發的請求,但是創建TCP連接本身也是有開銷的。
TCP連接有一個預熱和保護的過程,先檢查數據是否傳送成功,一旦成功過,則慢慢加大傳輸速度。因此對應瞬時併發的連接,服務器的響應就會變慢。所以最好能使用一個建立好的連接,並且這個連接可以支持瞬時併發的請求。
關於多路複用,可以參看:
https://blog.csdn.net/linsongbin1/article/details/54865371
- 數據壓縮
HTTP1.1不支持header數據的壓縮,HTTP2.0使用HPACK算法對header的數據進行壓縮,這樣數據體積小了,在網絡上傳輸就會更快。
- 服務器推送
意思是說,當我們對支持HTTP2.0的web server請求數據的時候,服務器會順便把一些客戶端需要的資源一起推送到客戶端,免得客戶端再次創建連接發送請求到服務器端獲取。這種方式非常合適加載靜態資源。
服務器端推送的這些資源其實存在客戶端的某處地方,客戶端直接從本地加載這些資源就可以了,不用走網絡,速度自然是快很多的。
七、Http和Https
- HTTPS協議需要到CA申請證書,一般免費證書很少,需要交費。
- HTTP協議運行在TCP之上,所有傳輸的內容都是明文,HTTPS運行在SSL/TLS之上,SSL/TLS運行在TCP之上,所有傳輸的內容都經過加密的。
- HTTP和HTTPS使用的是完全不同的連接方式,用的端口也不一樣,前者是80,後者是443。
- HTTPS可以有效的防止運營商劫持,解決了防劫持的一個大問題。