偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

HTTP協(xié)議入門

開發(fā) 前端
HTTP 協(xié)議是互聯(lián)網(wǎng)的基礎(chǔ)協(xié)議,也是網(wǎng)頁(yè)開發(fā)的必備知識(shí),最新版本 HTTP/2 更是讓它成為技術(shù)熱點(diǎn)。本文介紹 HTTP 協(xié)議的歷史演變和設(shè)計(jì)思路。

HTTP 協(xié)議是互聯(lián)網(wǎng)的基礎(chǔ)協(xié)議,也是網(wǎng)頁(yè)開發(fā)的必備知識(shí),***版本 HTTP/2 更是讓它成為技術(shù)熱點(diǎn)。

本文介紹 HTTP 協(xié)議的歷史演變和設(shè)計(jì)思路。

 

 

 

[[192298]]

 

一、HTTP/0.9

HTTP 是基于 TCP/IP 協(xié)議的應(yīng)用層協(xié)議。它不涉及數(shù)據(jù)包(packet)傳輸,主要規(guī)定了客戶端和服務(wù)器之間的通信格式,默認(rèn)使用80端口。

最早版本是1991年發(fā)布的0.9版。該版本極其簡(jiǎn)單,只有一個(gè)命令GET。

  1. GET /index.html 

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

協(xié)議規(guī)定,服務(wù)器只能回應(yīng)HTML格式的字符串,不能回應(yīng)別的格式。

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

服務(wù)器發(fā)送完畢,就關(guān)閉TCP連接。

二、HTTP/1.0

2.1 簡(jiǎn)介

1996年5月,HTTP/1.0 版本發(fā)布,內(nèi)容大大增加。

首先,任何格式的內(nèi)容都可以發(fā)送。這使得互聯(lián)網(wǎng)不僅可以傳輸文字,還能傳輸圖像、視頻、二進(jìn)制文件。這為互聯(lián)網(wǎng)的大發(fā)展奠定了基礎(chǔ)。

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

再次,HTTP請(qǐng)求和回應(yīng)的格式也變了。除了數(shù)據(jù)部分,每次通信都必須包括頭信息(HTTP header),用來(lái)描述一些元數(shù)據(jù)。

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

2.2 請(qǐng)求格式

下面是一個(gè)1.0版的HTTP請(qǐng)求的例子。

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

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

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

2.3 回應(yīng)格式

服務(wù)器的回應(yīng)如下。

  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>  

回應(yīng)的格式是”頭信息 + 一個(gè)空行(\r\n) + 數(shù)據(jù)”。其中,***行是”協(xié)議版本 + 狀態(tài)碼(status code) + 狀態(tài)描述”。

2.4 Content-Type 字段

關(guān)于字符的編碼,1.0版規(guī)定,頭信息必須是 ASCII 碼,后面的數(shù)據(jù)可以是任何格式。因此,服務(wù)器回應(yīng)的時(shí)候,必須告訴客戶端,數(shù)據(jù)是什么格式,這就是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

這些數(shù)據(jù)類型總稱為MIME type,每個(gè)值包括一級(jí)類型和二級(jí)類型,之間用斜杠分隔。

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

  1. application/vnd.debian.binary-package 

上面的類型表明,發(fā)送的是Debian系統(tǒng)的二進(jìn)制數(shù)據(jù)包。

MIME type還可以在尾部使用分號(hào),添加參數(shù)。

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

上面的類型表明,發(fā)送的是網(wǎng)頁(yè),而且編碼是UTF-8。

客戶端請(qǐng)求的時(shí)候,可以使用Accept字段聲明自己可以接受哪些數(shù)據(jù)格式。

  1. Accept: */* 

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

MIME type不僅用在HTTP協(xié)議,還可以用在其他地方,比如HTML網(wǎng)頁(yè)。

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

2.5 Content-Encoding 字段

由于發(fā)送的數(shù)據(jù)可以是任何格式,因此可以把數(shù)據(jù)壓縮后再發(fā)送。Content-Encoding字段說(shuō)明數(shù)據(jù)的壓縮方法。

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

客戶端在請(qǐng)求時(shí),用Accept-Encoding字段說(shuō)明自己可以接受哪些壓縮方法。

  1. Accept-Encoding: gzip, deflate 

2.6 缺點(diǎn)

HTTP/1.0 版的主要缺點(diǎn)是,每個(gè)TCP連接只能發(fā)送一個(gè)請(qǐng)求。發(fā)送數(shù)據(jù)完畢,連接就關(guān)閉,如果還要請(qǐng)求其他資源,就必須再新建一個(gè)連接。

TCP連接的新建成本很高,因?yàn)樾枰蛻舳撕头?wù)器三次握手,并且開始時(shí)發(fā)送速率較慢(slow start)。所以,HTTP 1.0版本的性能比較差。隨著網(wǎng)頁(yè)加載的外部資源越來(lái)越多,這個(gè)問(wèn)題就愈發(fā)突出了。

為了解決這個(gè)問(wèn)題,有些瀏覽器在請(qǐng)求時(shí),用了一個(gè)非標(biāo)準(zhǔn)的Connection字段。

  1. Connection: keep-alive 

這個(gè)字段要求服務(wù)器不要關(guān)閉TCP連接,以便其他請(qǐng)求復(fù)用。服務(wù)器同樣回應(yīng)這個(gè)字段。

  1. Connection: keep-alive 

一個(gè)可以復(fù)用的TCP連接就建立了,直到客戶端或服務(wù)器主動(dòng)關(guān)閉連接。但是,這不是標(biāo)準(zhǔn)字段,不同實(shí)現(xiàn)的行為可能不一致,因此不是根本的解決辦法。

三、HTTP/1.1

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

3.1 持久連接

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

客戶端和服務(wù)器發(fā)現(xiàn)對(duì)方一段時(shí)間沒有活動(dòng),就可以主動(dòng)關(guān)閉連接。不過(guò),規(guī)范的做法是,客戶端在***一個(gè)請(qǐng)求時(shí),發(fā)送Connection: close,明確要求服務(wù)器關(guān)閉TCP連接。

  1. Connectionclose 

目前,對(duì)于同一個(gè)域名,大多數(shù)瀏覽器允許同時(shí)建立6個(gè)持久連接。

3.2 管道機(jī)制

1.1 版還引入了管道機(jī)制(pipelining),即在同一個(gè)TCP連接里面,客戶端可以同時(shí)發(fā)送多個(gè)請(qǐng)求。這樣就進(jìn)一步改進(jìn)了HTTP協(xié)議的效率。

舉例來(lái)說(shuō),客戶端需要請(qǐng)求兩個(gè)資源。以前的做法是,在同一個(gè)TCP連接里面,先發(fā)送A請(qǐng)求,然后等待服務(wù)器做出回應(yīng),收到后再發(fā)出B請(qǐng)求。管道機(jī)制則是允許瀏覽器同時(shí)發(fā)出A請(qǐng)求和B請(qǐng)求,但是服務(wù)器還是按照順序,先回應(yīng)A請(qǐng)求,完成后再回應(yīng)B請(qǐng)求。

3.3 Content-Length 字段

一個(gè)TCP連接現(xiàn)在可以傳送多個(gè)回應(yīng),勢(shì)必就要有一種機(jī)制,區(qū)分?jǐn)?shù)據(jù)包是屬于哪一個(gè)回應(yīng)的。這就是Content-length字段的作用,聲明本次回應(yīng)的數(shù)據(jù)長(zhǎng)度。

  1. Content-Length: 3495 

上面代碼告訴瀏覽器,本次回應(yīng)的長(zhǎng)度是3495個(gè)字節(jié),后面的字節(jié)就屬于下一個(gè)回應(yīng)了。

在1.0版中,Content-Length字段不是必需的,因?yàn)闉g覽器發(fā)現(xiàn)服務(wù)器關(guān)閉了TCP連接,就表明收到的數(shù)據(jù)包已經(jīng)全了。

3.4 分塊傳輸編碼

使用Content-Length字段的前提條件是,服務(wù)器發(fā)送回應(yīng)之前,必須知道回應(yīng)的數(shù)據(jù)長(zhǎng)度。

對(duì)于一些很耗時(shí)的動(dòng)態(tài)操作來(lái)說(shuō),這意味著,服務(wù)器要等到所有操作完成,才能發(fā)送數(shù)據(jù),顯然這樣的效率不高。更好的處理方法是,產(chǎn)生一塊數(shù)據(jù),就發(fā)送一塊,采用”流模式”(stream)取代”緩存模式”(buffer)。

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

  1. Transfer-Encoding: chunked 

每個(gè)非空的數(shù)據(jù)塊之前,會(huì)有一個(gè)16進(jìn)制的數(shù)值,表示這個(gè)塊的長(zhǎng)度。***是一個(gè)大小為0的塊,就表示本次回應(yīng)的數(shù)據(jù)發(fā)送完了。下面是一個(gè)例子。

  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版還新增了許多動(dòng)詞方法:PUT、PATCH、HEAD、 OPTIONS、DELETE。

另外,客戶端請(qǐng)求的頭信息新增了Host字段,用來(lái)指定服務(wù)器的域名。

  1. Host: www.example.com 

有了Host字段,就可以將請(qǐng)求發(fā)往同一臺(tái)服務(wù)器上的不同網(wǎng)站,為虛擬主機(jī)的興起打下了基礎(chǔ)。

3.6 缺點(diǎn)

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

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

四、SPDY 協(xié)議

2009年,谷歌公開了自行研發(fā)的 SPDY 協(xié)議,主要解決 HTTP/1.1 效率不高的問(wèn)題。

這個(gè)協(xié)議在Chrome瀏覽器上證明可行以后,就被當(dāng)作 HTTP/2 的基礎(chǔ),主要特性都在 HTTP/2 之中得到繼承。

五、HTTP/2

2015年,HTTP/2 發(fā)布。它不叫 HTTP/2.0,是因?yàn)闃?biāo)準(zhǔn)委員會(huì)不打算再發(fā)布子版本了,下一個(gè)新版本將是 HTTP/3。

5.1 二進(jìn)制協(xié)議

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

二進(jìn)制協(xié)議的一個(gè)好處是,可以定義額外的幀。HTTP/2 定義了近十種幀,為將來(lái)的高級(jí)應(yīng)用打好了基礎(chǔ)。如果使用文本實(shí)現(xiàn)這種功能,解析數(shù)據(jù)將會(huì)變得非常麻煩,二進(jìn)制解析則方便得多。

5.2 多工

HTTP/2 復(fù)用TCP連接,在一個(gè)連接里,客戶端和瀏覽器都可以同時(shí)發(fā)送多個(gè)請(qǐng)求或回應(yīng),而且不用按照順序一一對(duì)應(yīng),這樣就避免了”隊(duì)頭堵塞”。

舉例來(lái)說(shuō),在一個(gè)TCP連接里面,服務(wù)器同時(shí)收到了A請(qǐng)求和B請(qǐng)求,于是先回應(yīng)A請(qǐng)求,結(jié)果發(fā)現(xiàn)處理過(guò)程非常耗時(shí),于是就發(fā)送A請(qǐng)求已經(jīng)處理好的部分, 接著回應(yīng)B請(qǐng)求,完成后,再發(fā)送A請(qǐng)求剩下的部分。

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

5.3 數(shù)據(jù)流

因?yàn)?HTTP/2 的數(shù)據(jù)包是不按順序發(fā)送的,同一個(gè)連接里面連續(xù)的數(shù)據(jù)包,可能屬于不同的回應(yīng)。因此,必須要對(duì)數(shù)據(jù)包做標(biāo)記,指出它屬于哪個(gè)回應(yīng)。

HTTP/2 將每個(gè)請(qǐng)求或回應(yīng)的所有數(shù)據(jù)包,稱為一個(gè)數(shù)據(jù)流(stream)。每個(gè)數(shù)據(jù)流都有一個(gè)***的編號(hào)。數(shù)據(jù)包發(fā)送的時(shí)候,都必須標(biāo)記數(shù)據(jù)流ID,用來(lái)區(qū)分它屬于哪個(gè)數(shù)據(jù)流。另外還規(guī)定,客戶端發(fā)出的數(shù)據(jù)流,ID一律為奇數(shù),服務(wù)器發(fā)出的,ID為偶數(shù)。

數(shù)據(jù)流發(fā)送到一半的時(shí)候,客戶端和服務(wù)器都可以發(fā)送信號(hào)(RST_STREAM幀),取消這個(gè)數(shù)據(jù)流。1.1版取消數(shù)據(jù)流的唯一方法,就是關(guān)閉TCP連接。這就是說(shuō),HTTP/2 可以取消某一次請(qǐng)求,同時(shí)保證TCP連接還打開著,可以被其他請(qǐng)求使用。

客戶端還可以指定數(shù)據(jù)流的優(yōu)先級(jí)。優(yōu)先級(jí)越高,服務(wù)器就會(huì)越早回應(yīng)。

5.4 頭信息壓縮

HTTP 協(xié)議不帶有狀態(tài),每次請(qǐng)求都必須附上所有信息。所以,請(qǐng)求的很多字段都是重復(fù)的,比如Cookie和User Agent,一模一樣的內(nèi)容,每次請(qǐng)求都必須附帶,這會(huì)浪費(fèi)很多帶寬,也影響速度。

HTTP/2 對(duì)這一點(diǎn)做了優(yōu)化,引入了頭信息壓縮機(jī)制(header compression)。一方面,頭信息使用gzip或compress壓縮后再發(fā)送;另一方面,客戶端和服務(wù)器同時(shí)維護(hù)一張頭信息表,所有字段都會(huì)存入這個(gè)表,生成一個(gè)索引號(hào),以后就不發(fā)送同樣字段了,只發(fā)送索引號(hào),這樣就提高速度了。

5.5 服務(wù)器推送

HTTP/2 允許服務(wù)器未經(jīng)請(qǐng)求,主動(dòng)向客戶端發(fā)送資源,這叫做服務(wù)器推送(server push)。

常見場(chǎng)景是客戶端請(qǐng)求一個(gè)網(wǎng)頁(yè),這個(gè)網(wǎng)頁(yè)里面包含很多靜態(tài)資源。正常情況下,客戶端必須收到網(wǎng)頁(yè)后,解析HTML源碼,發(fā)現(xiàn)有靜態(tài)資源,再發(fā)出靜態(tài)資源請(qǐng)求。其實(shí),服務(wù)器可以預(yù)期到客戶端請(qǐng)求網(wǎng)頁(yè)后,很可能會(huì)再請(qǐng)求靜態(tài)資源,所以就主動(dòng)把這些靜態(tài)資源隨著網(wǎng)頁(yè)一起發(fā)給客戶端了。

六、參考鏈接

  • Journey to HTTP/2, by Kamran Ahmed
  • HTTP, by Wikipedia
  • HTTP/1.0 Specification
  • HTTP/2 Specification 
責(zé)任編輯:龐桂玉 來(lái)源: 前端大全
相關(guān)推薦

2022-05-11 11:54:55

Http傳送協(xié)議

2014-10-22 09:36:41

TCPIP

2020-06-17 21:39:11

HTTP協(xié)議服務(wù)器

2022-03-09 18:54:30

HTTP緩存協(xié)議cache

2019-08-23 06:36:32

2018-04-17 16:29:24

Java面試HTTP

2015-10-09 15:07:02

HTTP網(wǎng)絡(luò)協(xié)議

2021-10-18 08:35:50

HTTPSHTTP協(xié)議

2014-06-05 10:21:29

HTTP

2010-06-08 10:56:56

HTTP協(xié)議功能

2024-11-15 11:11:48

2013-07-09 14:36:24

2014-11-13 10:57:03

http協(xié)議

2018-09-30 14:45:15

IPFSHTTP互聯(lián)網(wǎng)協(xié)議

2015-09-15 13:48:01

網(wǎng)絡(luò)協(xié)議HTTP Client

2010-06-18 13:37:02

AODV協(xié)議

2010-06-24 13:35:53

GRE協(xié)議

2010-07-01 16:41:33

PPPOE協(xié)議

2014-07-01 09:46:30

HTTP

2022-10-08 00:00:00

websocket協(xié)議HTTP
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)