成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

HTTP協議入門

開發 前端
HTTP 協議是互聯網的基礎協議,也是網頁開發的必備知識,最新版本 HTTP/2 更是讓它成為技術熱點。本文介紹 HTTP 協議的歷史演變和設計思路。

HTTP 協議是互聯網的基礎協議,也是網頁開發的必備知識,***版本 HTTP/2 更是讓它成為技術熱點。

本文介紹 HTTP 協議的歷史演變和設計思路。

 

 

 

[[192298]]

 

一、HTTP/0.9

HTTP 是基于 TCP/IP 協議的應用層協議。它不涉及數據包(packet)傳輸,主要規定了客戶端和服務器之間的通信格式,默認使用80端口。

最早版本是1991年發布的0.9版。該版本極其簡單,只有一個命令GET。

  1. GET /index.html 

上面命令表示,TCP 連接(connection)建立后,客戶端向服務器請求(request)網頁index.html。

協議規定,服務器只能回應HTML格式的字符串,不能回應別的格式。

  1. <html> 
  2.  
  3. <body>Hello World</body> 
  4.  
  5. </html>  

服務器發送完畢,就關閉TCP連接。

二、HTTP/1.0

2.1 簡介

1996年5月,HTTP/1.0 版本發布,內容大大增加。

首先,任何格式的內容都可以發送。這使得互聯網不僅可以傳輸文字,還能傳輸圖像、視頻、二進制文件。這為互聯網的大發展奠定了基礎。

其次,除了GET命令,還引入了POST命令和HEAD命令,豐富了瀏覽器與服務器的互動手段。

再次,HTTP請求和回應的格式也變了。除了數據部分,每次通信都必須包括頭信息(HTTP header),用來描述一些元數據。

其他的新增功能還包括狀態碼(status code)、多字符集支持、多部分發送(multi-part type)、權限(authorization)、緩存(cache)、內容編碼(content encoding)等。

2.2 請求格式

下面是一個1.0版的HTTP請求的例子。

  1. GET / HTTP/1.0 
  2.  
  3. User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) 
  4.  
  5. Accept: */*  

可以看到,這個格式與0.9版有很大變化。

***行是請求命令,必須在尾部添加協議版本(HTTP/1.0)。后面就是多行頭信息,描述客戶端的情況。

2.3 回應格式

服務器的回應如下。

  1. HTTP/1.0 200 OK 
  2.  
  3. Content-Type: text/plain 
  4.  
  5. Content-Length: 137582 
  6.  
  7. Expires: Thu, 05 Dec 1997 16:00:00 GMT 
  8.  
  9. Last-Modified: Wed, 5 August 1996 15:55:28 GMT 
  10.  
  11. Server: Apache 0.84 
  12.  
  13.   
  14.  
  15. <html> 
  16.  
  17.   <body>Hello World</body> 
  18.  
  19. </html>  

回應的格式是”頭信息 + 一個空行(\r\n) + 數據”。其中,***行是”協議版本 + 狀態碼(status code) + 狀態描述”。

2.4 Content-Type 字段

關于字符的編碼,1.0版規定,頭信息必須是 ASCII 碼,后面的數據可以是任何格式。因此,服務器回應的時候,必須告訴客戶端,數據是什么格式,這就是Content-Type字段的作用。

下面是一些常見的Content-Type字段的值。

  • text/plain
  • text/html
  • text/css
  • image/jpeg
  • image/png
  • image/svg+xml
  • audio/mp4
  • video/mp4
  • application/javascript
  • application/pdf
  • application/zip
  • application/atom+xml

這些數據類型總稱為MIME type,每個值包括一級類型和二級類型,之間用斜杠分隔。

除了預定義的類型,廠商也可以自定義類型。

  1. application/vnd.debian.binary-package 

上面的類型表明,發送的是Debian系統的二進制數據包。

MIME type還可以在尾部使用分號,添加參數。

  1. Content-Type: text/html; charset=utf-8 

上面的類型表明,發送的是網頁,而且編碼是UTF-8。

客戶端請求的時候,可以使用Accept字段聲明自己可以接受哪些數據格式。

  1. Accept: */* 

上面代碼中,客戶端聲明自己可以接受任何格式的數據。

MIME type不僅用在HTTP協議,還可以用在其他地方,比如HTML網頁。

  1. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
  2.  
  3. <!-- 等同于 --> 
  4.  
  5. <meta charset="utf-8" />  

2.5 Content-Encoding 字段

由于發送的數據可以是任何格式,因此可以把數據壓縮后再發送。Content-Encoding字段說明數據的壓縮方法。

  1. Content-Encoding: gzip 
  2.  
  3. Content-Encoding: compress 
  4.  
  5. Content-Encoding: deflate  

客戶端在請求時,用Accept-Encoding字段說明自己可以接受哪些壓縮方法。

  1. Accept-Encoding: gzip, deflate 

2.6 缺點

HTTP/1.0 版的主要缺點是,每個TCP連接只能發送一個請求。發送數據完畢,連接就關閉,如果還要請求其他資源,就必須再新建一個連接。

TCP連接的新建成本很高,因為需要客戶端和服務器三次握手,并且開始時發送速率較慢(slow start)。所以,HTTP 1.0版本的性能比較差。隨著網頁加載的外部資源越來越多,這個問題就愈發突出了。

為了解決這個問題,有些瀏覽器在請求時,用了一個非標準的Connection字段。

  1. Connection: keep-alive 

這個字段要求服務器不要關閉TCP連接,以便其他請求復用。服務器同樣回應這個字段。

  1. Connection: keep-alive 

一個可以復用的TCP連接就建立了,直到客戶端或服務器主動關閉連接。但是,這不是標準字段,不同實現的行為可能不一致,因此不是根本的解決辦法。

三、HTTP/1.1

1997年1月,HTTP/1.1 版本發布,只比 1.0 版本晚了半年。它進一步完善了 HTTP 協議,一直用到了20年后的今天,直到現在還是***的版本。

3.1 持久連接

1.1 版的***變化,就是引入了持久連接(persistent connection),即TCP連接默認不關閉,可以被多個請求復用,不用聲明Connection: keep-alive。

客戶端和服務器發現對方一段時間沒有活動,就可以主動關閉連接。不過,規范的做法是,客戶端在***一個請求時,發送Connection: close,明確要求服務器關閉TCP連接。

  1. Connectionclose 

目前,對于同一個域名,大多數瀏覽器允許同時建立6個持久連接。

3.2 管道機制

1.1 版還引入了管道機制(pipelining),即在同一個TCP連接里面,客戶端可以同時發送多個請求。這樣就進一步改進了HTTP協議的效率。

舉例來說,客戶端需要請求兩個資源。以前的做法是,在同一個TCP連接里面,先發送A請求,然后等待服務器做出回應,收到后再發出B請求。管道機制則是允許瀏覽器同時發出A請求和B請求,但是服務器還是按照順序,先回應A請求,完成后再回應B請求。

3.3 Content-Length 字段

一個TCP連接現在可以傳送多個回應,勢必就要有一種機制,區分數據包是屬于哪一個回應的。這就是Content-length字段的作用,聲明本次回應的數據長度。

  1. Content-Length: 3495 

上面代碼告訴瀏覽器,本次回應的長度是3495個字節,后面的字節就屬于下一個回應了。

在1.0版中,Content-Length字段不是必需的,因為瀏覽器發現服務器關閉了TCP連接,就表明收到的數據包已經全了。

3.4 分塊傳輸編碼

使用Content-Length字段的前提條件是,服務器發送回應之前,必須知道回應的數據長度。

對于一些很耗時的動態操作來說,這意味著,服務器要等到所有操作完成,才能發送數據,顯然這樣的效率不高。更好的處理方法是,產生一塊數據,就發送一塊,采用”流模式”(stream)取代”緩存模式”(buffer)。

因此,1.1版規定可以不使用Content-Length字段,而使用“分塊傳輸編碼”(chunked transfer encoding)。只要請求或回應的頭信息有Transfer-Encoding字段,就表明回應將由數量未定的數據塊組成。

  1. Transfer-Encoding: chunked 

每個非空的數據塊之前,會有一個16進制的數值,表示這個塊的長度。***是一個大小為0的塊,就表示本次回應的數據發送完了。下面是一個例子。

  1. HTTP/1.1 200 OK 
  2.  
  3. Content-Type: text/plain 
  4.  
  5. Transfer-Encoding: chunked 
  6.  
  7.   
  8.  
  9. 25 
  10.  
  11. This is the data in the first chunk 
  12.  
  13.   
  14.  
  15. 1C 
  16.  
  17. and this is the second one 
  18.  
  19.   
  20.  
  21.  
  22. con 
  23.  
  24.   
  25.  
  26.  
  27. sequence 
  28.  
  29.   
  30.  
  31.  

3.5 其他功能

1.1版還新增了許多動詞方法:PUT、PATCH、HEAD、 OPTIONS、DELETE。

另外,客戶端請求的頭信息新增了Host字段,用來指定服務器的域名。

  1. Host: www.example.com 

有了Host字段,就可以將請求發往同一臺服務器上的不同網站,為虛擬主機的興起打下了基礎。

3.6 缺點

雖然1.1版允許復用TCP連接,但是同一個TCP連接里面,所有的數據通信是按次序進行的。服務器只有處理完一個回應,才會進行下一個回應。要是前面的回應特別慢,后面就會有許多請求排隊等著。這稱為“隊頭堵塞”(Head-of-line blocking)。

為了避免這個問題,只有兩種方法:一是減少請求數,二是同時多開持久連接。這導致了很多的網頁優化技巧,比如合并腳本和樣式表、將圖片嵌入CSS代碼、域名分片(domain sharding)等等。如果HTTP協議設計得更好一些,這些額外的工作是可以避免的。

四、SPDY 協議

2009年,谷歌公開了自行研發的 SPDY 協議,主要解決 HTTP/1.1 效率不高的問題。

這個協議在Chrome瀏覽器上證明可行以后,就被當作 HTTP/2 的基礎,主要特性都在 HTTP/2 之中得到繼承。

五、HTTP/2

2015年,HTTP/2 發布。它不叫 HTTP/2.0,是因為標準委員會不打算再發布子版本了,下一個新版本將是 HTTP/3。

5.1 二進制協議

HTTP/1.1 版的頭信息肯定是文本(ASCII編碼),數據體可以是文本,也可以是二進制。HTTP/2 則是一個徹底的二進制協議,頭信息和數據體都是二進制,并且統稱為”幀”(frame):頭信息幀和數據幀。

二進制協議的一個好處是,可以定義額外的幀。HTTP/2 定義了近十種幀,為將來的高級應用打好了基礎。如果使用文本實現這種功能,解析數據將會變得非常麻煩,二進制解析則方便得多。

5.2 多工

HTTP/2 復用TCP連接,在一個連接里,客戶端和瀏覽器都可以同時發送多個請求或回應,而且不用按照順序一一對應,這樣就避免了”隊頭堵塞”。

舉例來說,在一個TCP連接里面,服務器同時收到了A請求和B請求,于是先回應A請求,結果發現處理過程非常耗時,于是就發送A請求已經處理好的部分, 接著回應B請求,完成后,再發送A請求剩下的部分。

這樣雙向的、實時的通信,就叫做多工(Multiplexing)。

5.3 數據流

因為 HTTP/2 的數據包是不按順序發送的,同一個連接里面連續的數據包,可能屬于不同的回應。因此,必須要對數據包做標記,指出它屬于哪個回應。

HTTP/2 將每個請求或回應的所有數據包,稱為一個數據流(stream)。每個數據流都有一個***的編號。數據包發送的時候,都必須標記數據流ID,用來區分它屬于哪個數據流。另外還規定,客戶端發出的數據流,ID一律為奇數,服務器發出的,ID為偶數。

數據流發送到一半的時候,客戶端和服務器都可以發送信號(RST_STREAM幀),取消這個數據流。1.1版取消數據流的唯一方法,就是關閉TCP連接。這就是說,HTTP/2 可以取消某一次請求,同時保證TCP連接還打開著,可以被其他請求使用。

客戶端還可以指定數據流的優先級。優先級越高,服務器就會越早回應。

5.4 頭信息壓縮

HTTP 協議不帶有狀態,每次請求都必須附上所有信息。所以,請求的很多字段都是重復的,比如Cookie和User Agent,一模一樣的內容,每次請求都必須附帶,這會浪費很多帶寬,也影響速度。

HTTP/2 對這一點做了優化,引入了頭信息壓縮機制(header compression)。一方面,頭信息使用gzip或compress壓縮后再發送;另一方面,客戶端和服務器同時維護一張頭信息表,所有字段都會存入這個表,生成一個索引號,以后就不發送同樣字段了,只發送索引號,這樣就提高速度了。

5.5 服務器推送

HTTP/2 允許服務器未經請求,主動向客戶端發送資源,這叫做服務器推送(server push)。

常見場景是客戶端請求一個網頁,這個網頁里面包含很多靜態資源。正常情況下,客戶端必須收到網頁后,解析HTML源碼,發現有靜態資源,再發出靜態資源請求。其實,服務器可以預期到客戶端請求網頁后,很可能會再請求靜態資源,所以就主動把這些靜態資源隨著網頁一起發給客戶端了。

六、參考鏈接

  • Journey to HTTP/2, by Kamran Ahmed
  • HTTP, by Wikipedia
  • HTTP/1.0 Specification
  • HTTP/2 Specification 
責任編輯:龐桂玉 來源: 前端大全
相關推薦

2022-05-11 11:54:55

Http傳送協議

2014-10-22 09:36:41

TCPIP

2020-06-17 21:39:11

HTTP協議服務器

2022-03-09 18:54:30

HTTP緩存協議cache

2019-08-23 06:36:32

2018-04-17 16:29:24

Java面試HTTP

2015-10-09 15:07:02

HTTP網絡協議

2021-10-18 08:35:50

HTTPSHTTP協議

2014-06-05 10:21:29

HTTP

2010-06-08 10:56:56

HTTP協議功能

2024-11-15 11:11:48

2013-07-09 14:36:24

2014-11-13 10:57:03

http協議

2018-09-30 14:45:15

IPFSHTTP互聯網協議

2015-09-15 13:48:01

網絡協議HTTP Client

2010-06-24 13:35:53

GRE協議

2010-07-01 16:41:33

PPPOE協議

2010-06-18 13:37:02

AODV協議

2014-07-01 09:46:30

HTTP

2022-10-08 00:00:00

websocket協議HTTP
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: av中文字幕在线 | 中文字幕在线观看精品 | 日韩视频二区 | 中文字幕一区二区三区日韩精品 | 成人国产一区二区三区精品麻豆 | 欧美视频免费在线观看 | 久久免费精品 | 在线一区二区三区 | 在线免费看91 | 伊人成人免费视频 | 午夜性色a√在线视频观看9 | 日韩欧美在线视频一区 | 国产欧美性成人精品午夜 | 日韩视频在线一区二区 | 中文字幕在线观看一区二区 | 中国美女撒尿txxxxx视频 | av中文在线 | 精品国产亚洲一区二区三区大结局 | 精品欧美乱码久久久久久1区2区 | 国产精品久久久久久久免费大片 | 久操福利 | 性色av网站 | 国产日韩欧美另类 | 激情91| 天堂网avav | 欧美日韩在线播放 | 精品国产一区二区三区日日嗨 | 色视频在线免费观看 | 精品三级在线观看 | 久久国产精品精品 | 亚洲综合大片69999 | 亚洲一二视频 | 日本一区二区不卡 | 久久99国产精一区二区三区 | 午夜天堂精品久久久久 | 一区二区三区免费网站 | 一区二区av | 亚洲一区二区中文字幕 | jizz在线免费观看 | 国产精品一区二区av | 一本一道久久a久久精品蜜桃 |