HTTP1.0/1.1的區別 & Get和Post的區別

HTTP1.0和HTTP1.1的主要區別

區別一:短連接和長連接

一、HTTP1.0使用短連接

http1.0使用的是短連接,就是每進行一次http請求都要重新建立一次tcp連接。

短連接影響性能的最主要的兩個原因

a. 每次都需要握手/揮手/慢啓動

tcp連接無法複用會導致每次請求都經歷三次握手和慢啓動。三次握手在高延遲的場景下影響較明顯,慢啓動則對文件類大請求影響較大

b. tcp連接數過多而被阻塞

一般PC端瀏覽器會針對單個域名的server同時建立6~8個連接,手機端的連接數則一般控制在4~6個,因此,在短連接的場景下,頻繁的建立TCP連接可能會因爲無法創建新的連接而被阻塞住。

二、HTTP1.1支持長連接( 並且默認是長連接 )

而http1.1支持長連接,並且默認是長連接, 即在tcp連接上可以傳送多個http請求和響應,減少了建立和關閉連接的消耗和延遲。但是在這裏需要注意的是,這裏的tcp複用必須是對同一個tcp連接的複用(廢話),即是對同一個socket的複用(例如請求同一個網頁上的文字,圖片等資源,是可以複用的,但如果是不同的連接上的資源(例如其他網站),那麼肯定就無法複用了)。 Connection請求頭的值爲Keep-Alive 表示爲長連接

PS: 在http2.0中,使用長連接+IO多路複用模型進一步優化【針對同一域名下的請求有一定數量限制。超過限制數目的請求會被阻塞】這一問題。

區別二:HTTP1.0更節約帶寬

HTTP/1.0中,存在一些浪費帶寬的現象,例如客戶端只是需要某個對象的一部分,而服務器卻將整個對象送過來了。

而HTTP1.1種在請求消息中增加了range頭域,它允許只請求資源的某個部分。

對於請求報文

在請求報文中添加 Range 首部字段指定請求的範圍。

GET /z4d4kWk.jpg HTTP/1.1
Host: i.imgur.com
Range: bytes=0-1023

對於響應報文

請求成功的話服務器返回的響應包含 206 Partial Content 狀態碼。

在響應報文中,由Content-Range和Content-Length 字段 來告知傳輸情況。

HTTP/1.1 206 Partial Content
Content-Range: bytes 0-1023/146515
Content-Length: 1024
...
(binary content)

區別三:HTTP1.1多了Host域

在HTTP1.0中認爲每臺服務器都綁定一個唯一的IP地址,因此,請求消息中的URL並沒有傳遞主機名(hostname)。但隨着虛擬主機技術的發展,在一臺物理服務器上可以存在多個虛擬主機(Multi-homed Web Servers),並且它們共享一個IP地址。

HTTP1.1的請求消息和響應消息都應支持Host頭域,且請求消息中如果沒有Host頭域會報告一個錯誤(400 Bad Request)。此外,服務器應該接受以絕對路徑標記的資源請求。

(PS:補充一下這個host的意思,若多個域名對應同一個ip,那麼當根據不同的域名訪問到同一個ip的時候,服務端不知道該響應哪一種服務,而如果有host,服務端就知道這個請求是從哪個域名訪問來的,就可以提供對應的服務啦)

區別四:HTTP1.1支持分塊傳輸

發送方將消息分割成若干個任意大小的數據塊,每個數據塊在發送時都會附上塊的長度,最後用一個零長度的塊作爲消息結束的標誌。這種方法允許發送方只緩衝消息的一個片段,避免緩衝整個消息帶來的過載,同時也能讓瀏覽器逐步顯示頁面,提高頁面的響應速度。

區別五:HTTP1.1引入了新的狀態碼100

100 Continue

該狀態碼說明服務器收到了請求的初始部分,並且請客戶端繼續發送。在服務器發送了 100 Continue 狀態碼之後,如果收到客戶端的請求,則必須進行響應。

這個狀態碼實際上是對如下場景的一種優化:客戶端有一個較大的文件需要上傳並保存,但是客戶端不知道服務器是否願意接受這個文件,所以希望在消耗網絡資源進行傳輸之前,先詢問一下服務器的意願。實際操作爲客戶端發送一條特殊的請求報文,報文的頭部應包含

Expect: 100-continue

此時,如果服務器願意接受,就會返回 100 Continue 狀態碼,反之則返回 417 Expectation Failed 狀態碼。對於客戶端而言,如果客戶端沒有發送實際請求的打算,則不應該發送包含 100 Continue Expect 的報文,因爲這樣會讓服務器誤以爲客戶端將要發送一個請求。

區別六:HTTP1.1支持流水線

默認情況下,HTTP 請求是按順序發出的,下一個請求只有在當前請求收到響應之後纔會被髮出。由於受到網絡延遲和帶寬的限制,在下一個請求被髮送到服務器之前,可能需要等待很長時間。

流水線是在同一條長連接上連續發出請求,而不用等待響應返回,這樣可以減少延遲。

區別七:引入max-age指令

max-age 指令出現在請求報文,並且緩存資源的緩存時間小於該指令指定的時間,那麼就能接受該緩存。

max-age 指令出現在響應報文,表示緩存資源在緩存服務器中保存的時間。

Cache-Control: max-age=31536000

http1.0裏 Expires 首部字段也可以用於告知緩存服務器該資源什麼時候會過期。

Expires: Wed, 04 Jul 2012 08:26:05 GMT
  • 在 HTTP/1.1 中,會優先處理 max-age 指令;
  • 在 HTTP/1.0 中,max-age 指令會被忽略掉。

Get 和 Post 的區別

  • GET是安全的,而POST是不安全的。

    安全的 HTTP 方法不會改變服務器狀態,也就是說它只是可讀的。

  • GET請求會被瀏覽器主動cache,而POST默認不會緩存(除非手動設置)。

  • GET請求在URL中傳送的參數是有長度限制的(實際上是沒限制的,但是因爲參數是放到url裏,瀏覽器對url的最大長度是有限制的,所以GET請求傳輸參數就有限制的了…),而POST沒有(實際是有的,儘管http協議沒限制,但是在服務器配置中會有限制,例如:在 Tomcat 環境中,server.xml 文件有個 maxPostSize 字段來限制 POST 上傳大小,默認貌似是 2M。) 因此,GET 和 POST 是沒有長度限制的,真正限制的是瀏覽器和服務器。 但就算這樣,POST能夠上傳的數據大小依然比GET要多…

    參考鏈接

  • 對參數的數據類型,GET只接受ASCII字符,而POST沒有限制。

  • GET比POST更不安全,因爲參數直接暴露在URL上,所以不能用來傳遞敏感信息。

  • GET參數通過URL傳遞,POST放在Request body中

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章