日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

一、HTTP簡介

HTTP協議是Hyper Text Transfer Protocol(超文本傳輸協議)的縮寫,“超文本”即不僅僅是文本,還可以傳輸html 文件, 圖片文件等。

HTTP協議工作于客戶端-服務端架構為上。瀏覽器作為HTTP客戶端通過URL向HTTP服務端即WEB服務器發送所有請求。Web服務器根據接收到的請求后,向客戶端發送響應信息。

二、主要特點

簡單快速:客戶向服務器請求服務時,只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。每種方法規定了客戶與服務器聯系的類型不同。由于HTTP協議簡單,使得HTTP服務器的程序規模小,因而通信速度很快。

靈活:HTTP允許傳輸任意類型的數據對象。正在傳輸的類型由Content-Type加以標記。

無連接:無連接的含義是限制每次連接只處理一個請求。服務器處理完客戶的請求,并收到客戶的應答后,即斷開連接。采用這種方式可以節省傳輸時間。

無狀態:HTTP協議是無狀態協議。無狀態是指協議對于事務處理沒有記憶能力。缺少狀態意味著如果后續處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數據量增大。另一方面,在服務器不需要先前信息時它的應答就較快。

支持B/S及C/S模式。

三、基礎概念

URL

URI 包含 URL 和 URN,目前 WEB 只有 URL 比較流行,所以見到的基本都是 URL。

URI(Uniform Resource Identifier,統一資源標識符)

URL(Uniform Resource Locator,統一資源定位符)

URN(Uniform Resource Name,統一資源名稱)

速讀,五分鐘深入了解HTTP

 

三者的區別

URI用來唯一的標識一個資源。Web上可用的每種資源如HTML文檔、圖像、視頻片段、程序等都是一個來URI來標識的。URI一般由三部組成: ①訪問資源的命名機制 ②存放資源的主機名 ③資源自身的名稱,由路徑表示,著重強調于資源。

URL是一種具體的URI,即URL可以用來標識一個資源,而且還指明了如何locate這個資源。采用URL可以用一種統一的格式來描述各種信息資源,包括文件、服務器的地址和目錄等。URL一般由三部組成: ①協議(或稱為服務方式) ②存有該資源的主機IP地址(有時也包括端口號) ③主機資源的具體地址。如目錄和文件名等

URN是通過名字來標識資源,比如mailto:JAVA-net@java.sun.com。

一個URL的例子

http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name

從上面的URL可以看出,一個完整的URL包括以下幾部分:

1.協議部分: 該URL的協議部分為“http:”,這代表網頁使用的是HTTP協議。在Internet中可以使用多種協議,如HTTP,FTP等等本例中使用的是HTTP協議。在"HTTP"后面的“//”為分隔符

2.域名部分: 該URL的域名部分為“www.aspxfans.com”。一個URL中,也可以使用IP地址作為域名使用

3.端口部分: 跟在域名后面的是端口,域名和端口之間使用“:”作為分隔符。端口不是一個URL必須的部分,如果省略端口部分,將采用默認端口

4.虛擬目錄部分: 從域名后的第一個“/”開始到最后一個“/”為止,是虛擬目錄部分。虛擬目錄也不是一個URL必須的部分。本例中的虛擬目錄是“/news/”

5.文件名部分: 從域名后的最后一個“/”開始到“?”為止,是文件名部分,如果沒有“?”,則是從域名后的最后一個“/”開始到“#”為止,是文件部分,如果沒有“?”和“#”,那么從域名后的最后一個“/”開始到結束,都是文件名部分。本例中的文件名是“index.asp”。文件名部分也不是一個URL必須的部分,如果省略該部分,則使用默認的文件名

6.錨部分: 從“#”開始到最后,都是錨部分。本例中的錨部分是“name”。錨部分也不是一個URL必須的部分

7.參數部分: 從“?”開始到“#”為止之間的部分為參數部分,又稱搜索部分、查詢部分。本例中的參數部分為“boardID=5&ID=24618&page=1”。參數可以允許有多個參數,參數與參數之間用“&”作為分隔符。

請求和響應報文

1. 請求報文

速讀,五分鐘深入了解HTTP

 

請求報文由請求行(request line)、請求頭部(header)、空行和請求數據四個部分組成。

第一部分:請求行,用來說明請求類型,要訪問的資源以及所使用的HTTP版本

GET說明請求類型為GET,[/562f25980001b1b106000338.jpg]為要訪問的資源,該行的最后一部分說明使用的是HTTP1.1版本。

第二部分:請求頭部,緊接著請求行(即第一行)之后的部分,用來說明服務器要使用的附加信息

從第二行起為請求頭部,HOST將指出請求的目的地.User-Agent,服務器端和客戶端腳本都能訪問它,它是瀏覽器類型檢測邏輯的重要基礎.該信息由你的瀏覽器來定義,并且在每個請求中自動發送等等

第三部分:空行,請求頭部后面的空行是必須的

即使第四部分的請求數據為空,也必須有空行

第四部分:請求數據也叫主體,可以添加任意的其他數據

2. 響應報文

速讀,五分鐘深入了解HTTP

 

HTTP響應也由四個部分組成,分別是:狀態行、消息報頭、空行和響應正文

第一部分:狀態行,由HTTP協議版本號, 狀態碼, 狀態消息 三部分組成。

第一行為狀態行,(HTTP/1.1)表明HTTP版本為1.1版本,狀態碼為200,狀態消息為(ok)

第二部分:消息報頭,用來說明客戶端要使用的一些附加信息

第二行和第三行為消息報頭, Date:生成響應的日期和時間;Content-Type:指定了MIME類型的HTML(text/html),編碼類型是UTF-8

第三部分:空行,消息報頭后面的空行是必須的

第四部分:響應正文,服務器返回給客戶端的文本信息。

空行后面的html部分為響應正文。

四、HTTP 方法

根據HTTP標準,HTTP請求可以使用多種請求方法。HTTP1.0定義了三種請求方法: GET, POST 和 HEAD方法。HTTP1.1新增了五種請求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。后來又引入了PATCH方法,是對PUT方法的補充。

GET

請求指定的頁面信息,并返回實體主體。

HEAD

類似于get請求,只不過返回的響應中沒有具體的內容,用于獲取報頭。主要用于確認 URL 的有效性以及資源更新的日期時間等。

POST

POST 主要用來傳輸數據,而 GET 主要用來獲取資源。POST請求可能會導致新的資源的建立和/或已有資源的修改。

PUT

從客戶端向服務器傳送的數據取代指定的文檔的內容。由于自身不帶驗證機制,任何人都可以上傳文件,因此存在安全性問題,一般不使用該方法。

DELETE

請求服務器刪除指定的頁面。與 PUT 功能相反,并且同樣不帶驗證機制。

CONNECT

要求在與代理服務器通信時建立隧道

使用 SSL(Secure Sockets Layer,安全套接層)和 TLS(Transport Layer Security,傳輸層安全)協議把通信內容加密后經網絡隧道傳輸。

CONNECT www.example.com:443 HTTP/1.1

速讀,五分鐘深入了解HTTP

 

OPTIONS

查詢支持的方法

查詢指定的 URL 能夠支持的方法。

會返回 Allow: GET, POST, HEAD, OPTIONS 這樣的內容。

TRACE

追蹤路徑

服務器會將通信路徑返回給客戶端。

發送請求時,在 Max-Forwards 首部字段中填入數值,每經過一個服務器就會減 1,當數值為 0 時就停止傳輸。

通常不會使用 TRACE,并且它容易受到 XST 攻擊(Cross-Site Tracing,跨站追蹤)。主要用于測試或診斷。

PATCH

對資源進行部分修改

PUT 也可以用于修改資源,但是只能完全替代原始資源,PATCH 允許部分修改。

五、HTTP 狀態碼

服務器返回的 響應報文 中第一行為狀態行,包含了狀態碼以及原因短語,用來告知客戶端請求的結果。

狀態碼類別原因短語1XXInformational(信息性狀態碼)接收的請求正在處理2XXSuccess(成功狀態碼)請求正常處理完畢3XXRedirection(重定向狀態碼)需要進行附加操作以完成請求4XXClient Error(客戶端錯誤狀態碼)服務器無法處理請求5XXServer Error(服務器錯誤狀態碼)服務器處理請求出錯

1XX 信息

100 Continue :表明到目前為止都很正常,客戶端可以繼續發送請求或者忽略這個響應。

2XX 成功

200 OK

204 No Content :請求已經成功處理,但是返回的響應報文不包含實體的主體部分。一般在只需要從客戶端往服務器發送信息,而不需要返回數據時使用。

206 Partial Content :表示客戶端進行了范圍請求,響應報文包含由 Content-Range 指定范圍的實體內容。

3XX 重定向

301 Moved Permanently :永久性重定向

302 Found :臨時性重定向

303 See Other :和 302 有著相同的功能,但是 303 明確要求客戶端應該采用 GET 方法獲取資源。

注:雖然 HTTP 協議規定 301、302 狀態下重定向時不允許把 POST 方法改成 GET 方法,但是大多數瀏覽器都會在 301、302 和 303 狀態下的重定向把 POST 方法改成 GET 方法。

304 Not Modified :如果請求報文首部包含一些條件,例如:If-Match,If-Modified-Since,If-None-Match,If-Range,If-Unmodified-Since,如果不滿足條件,則服務器會返回 304 狀態碼。

307 Temporary Redirect :臨時重定向,與 302 的含義類似,但是 307 要求瀏覽器不會把重定向請求的 POST 方法改成 GET 方法。

4XX 客戶端錯誤

400 Bad Request :請求報文中存在語法錯誤。

401 Unauthorized :該狀態碼表示發送的請求需要有認證信息(BASIC 認證、DIGEST 認證)。如果之前已進行過一次請求,則表示用戶認證失敗。

403 Forbidden :請求被拒絕。

404 Not Found

5XX 服務器錯誤

500 Internal Server Error :服務器正在執行請求時發生錯誤。

503 Service Unavailable :服務器暫時處于超負載或正在進行停機維護,現在無法處理請求。

六、HTTP 首部

有 4 種類型的首部字段:通用首部字段、請求首部字段、響應首部字段和實體首部字段

各種首部字段及其含義如下(不需要全記,僅供查閱):

通用首部字段

首部字段名說明Cache-Control控制緩存的行為Connection控制不再轉發給代理的首部字段、管理持久連接Date創建報文的日期時間Pragma報文指令Trailer報文末端的首部一覽Transfer-Encoding指定報文主體的傳輸編碼方式Upgrade升級為其他協議Via代理服務器的相關信息Warning錯誤通知

請求首部字段

首部字段名說明Accept用戶代理可處理的媒體類型Accept-Charset優先的字符集Accept-Encoding優先的內容編碼Accept-Language優先的語言(自然語言)AuthorizationWeb 認證信息Expect期待服務器的特定行為From用戶的電子郵箱地址Host請求資源所在服務器If-Match比較實體標記(ETag)If-Modified-Since比較資源的更新時間If-None-Match比較實體標記(與 If-Match 相反)If-Range資源未更新時發送實體 Byte 的范圍請求If-Unmodified-Since比較資源的更新時間(與 If-Modified-Since 相反)Max-Forwards最大傳輸逐跳數Proxy-Authorization代理服務器要求客戶端的認證信息Range實體的字節范圍請求Referer對請求中 URI 的原始獲取方TE傳輸編碼的優先級User-AgentHTTP 客戶端程序的信息

響應首部字段

首部字段名說明Accept-Ranges是否接受字節范圍請求Age推算資源創建經過時間ETag資源的匹配信息Location令客戶端重定向至指定 URIProxy-Authenticate代理服務器對客戶端的認證信息Retry-After對再次發起請求的時機要求ServerHTTP 服務器的安裝信息Vary代理服務器緩存的管理信息WWW-Authenticate服務器對客戶端的認證信息

實體首部字段

首部字段名說明Allow資源可支持的 HTTP 方法Content-Encoding實體主體適用的編碼方式Content-Language實體主體的自然語言Content-Length實體主體的大小Content-Location替代對應資源的 URIContent-MD5實體主體的報文摘要Content-Range實體主體的位置范圍Content-Type實體主體的媒體類型Expires實體主體過期的日期時間Last-Modified資源的最后修改日期時間

七、具體應用

連接管理

速讀,五分鐘深入了解HTTP

 

1. 短連接與長連接

當瀏覽器訪問一個包含多張圖片的 HTML 頁面時,除了請求訪問 HTML 頁面資源,還會請求圖片資源。如果每進行一次 HTTP 通信就要新建一個 TCP 連接,那么開銷會很大。

長連接只需要建立一次 TCP 連接就能進行多次 HTTP 通信。

從 HTTP/1.1 開始默認是長連接的,如果要斷開連接,需要由客戶端或者服務器端提出斷開,使用 Connection : close;

在 HTTP/1.1 之前默認是短連接的,如果需要使用長連接,則使用 Connection : Keep-Alive。

那么http如何判斷一個報文結束? 所有http不外乎2情況:

  • 無entity body,則"rnrn"(兩個回車符),判斷。
  • 有entity body,則用"Content-Length“字段值判斷。

參考http消息包的結束標記

2. 流水線

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

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

Cookie

HTTP 協議是無狀態的,主要是為了讓 HTTP 協議盡可能簡單,使得它能夠處理大量事務。HTTP/1.1 引入 Cookie 來保存狀態信息。

Cookie 是服務器發送到用戶瀏覽器并保存在本地的一小塊數據,它會在瀏覽器之后向同一服務器再次發起請求時被攜帶上,用于告知服務端兩個請求是否來自同一瀏覽器。由于之后每次請求都會需要攜帶 Cookie 數據,因此會帶來額外的性能開銷(尤其是在移動環境下)。

Cookie 曾一度用于客戶端數據的存儲,因為當時并沒有其它合適的存儲辦法而作為唯一的存儲手段,但現在隨著現代瀏覽器開始支持各種各樣的存儲方式,Cookie 漸漸被淘汰。新的瀏覽器 API 已經允許開發者直接將數據存儲到本地,如使用 Web storage API(本地存儲和會話存儲)或 IndexedDB。

1. 用途

會話狀態管理(如用戶登錄狀態、購物車、游戲分數或其它需要記錄的信息)

個性化設置(如用戶自定義設置、主題等)

瀏覽器行為跟蹤(如跟蹤分析用戶行為等)

2. 創建過程

服務器發送的響應報文包含 Set-Cookie 首部字段,客戶端得到響應報文后把 Cookie 內容保存到瀏覽器中。

HTTP/1.0 200 OKContent-type: text/htmlSet-Cookie: yummy_cookie=chocoSet-Cookie: tasty_cookie=strawberry[page content]

客戶端之后對同一個服務器發送請求時,會從瀏覽器中取出 Cookie 信息并通過 Cookie 請求首部字段發送給服務器。

GET /sample_page.html HTTP/1.1Host: www.example.orgCookie: yummy_cookie=choco; tasty_cookie=strawberry

3. 分類

會話期 Cookie:瀏覽器關閉之后它會被自動刪除,也就是說它僅在會話期內有效。

持久性 Cookie:指定一個特定的過期時間(Expires)或有效期(max-age)之后就成為了持久性的 Cookie。

Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT;

4. 作用域

Domain 標識指定了哪些主機可以接受 Cookie。如果不指定,默認為當前文檔的主機(不包含子域名)。如果指定了 Domain,則一般包含子域名。例如,如果設置 Domain=mozilla.org,則 Cookie 也包含在子域名中(如 developer.mozilla.org)。

Path 標識指定了主機下的哪些路徑可以接受 Cookie(該 URL 路徑必須存在于請求 URL 中)。以字符 %x2F ("/") 作為路徑分隔符,子路徑也會被匹配。例如,設置 Path=/docs,則以下地址都會匹配:

/docs

/docs/Web/

/docs/Web/HTTP

5. JavaScript

通過 document.cookie 屬性可創建新的 Cookie,也可通過該屬性訪問非 HttpOnly 標記的 Cookie。

document.cookie = "yummy_cookie=choco";document.cookie = "tasty_cookie=strawberry";console.log(document.cookie);

6. HttpOnly

標記為 HttpOnly 的 Cookie 不能被 JavaScript 腳本調用。跨站腳本攻擊 (XSS) 常常使用 JavaScript 的 document.cookie API 竊取用戶的 Cookie 信息,因此使用 HttpOnly 標記可以在一定程度上避免 XSS 攻擊。

Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; HttpOnly

7. Secure

標記為 Secure 的 Cookie 只能通過被 HTTPS 協議加密過的請求發送給服務端。但即便設置了 Secure 標記,敏感信息也不應該通過 Cookie 傳輸,因為 Cookie 有其固有的不安全性,Secure 標記也無法提供確實的安全保障。

8. Session

除了可以將用戶信息通過 Cookie 存儲在用戶瀏覽器中,也可以利用 Session 存儲在服務器端,存儲在服務器端的信息更加安全。

Session 可以存儲在服務器上的文件、數據庫或者內存中。也可以將 Session 存儲在 redis 這種內存型數據庫中,效率會更高。

使用 Session 維護用戶登錄狀態的過程如下:

用戶進行登錄時,用戶提交包含用戶名和密碼的表單,放入 HTTP 請求報文中;

服務器驗證該用戶名和密碼,如果正確則把用戶信息存儲到 Redis 中,它在 Redis 中的 Key 稱為 Session ID;

服務器返回的響應報文的 Set-Cookie 首部字段包含了這個 Session ID,客戶端收到響應報文之后將該 Cookie 值存入瀏覽器中;

客戶端之后對同一個服務器進行請求時會包含該 Cookie 值,服務器收到之后提取出 Session ID,從 Redis 中取出用戶信息,繼續之前的業務操作。

應該注意 Session ID 的安全性問題,不能讓它被惡意攻擊者輕易獲取,那么就不能產生一個容易被猜到的 Session ID 值。此外,還需要經常重新生成 Session ID。在對安全性要求極高的場景下,例如轉賬等操作,除了使用 Session 管理用戶狀態之外,還需要對用戶進行重新驗證,比如重新輸入密碼,或者使用短信驗證碼等方式。

9. 瀏覽器禁用 Cookie

此時無法使用 Cookie 來保存用戶信息,只能使用 Session。除此之外,不能再將 Session ID 存放到 Cookie 中,而是使用 URL 重寫技術,將 Session ID 作為 URL 的參數進行傳遞。

10. Cookie 與 Session 選擇

Cookie 只能存儲 ASCII 碼字符串,而 Session 則可以存取任何類型的數據,因此在考慮數據復雜性時首選 Session;

Cookie 存儲在瀏覽器中,容易被惡意查看。如果非要將一些隱私數據存在 Cookie 中,可以將 Cookie 值進行加密,然后在服務器進行解密;

對于大型網站,如果用戶所有的信息都存儲在 Session 中,那么開銷是非常大的,因此不建議將所有的用戶信息都存儲到 Session 中。

緩存

1. 優點

緩解服務器壓力;

降低客戶端獲取資源的延遲:緩存通常位于內存中,讀取緩存的速度更快。并且緩存在地理位置上也有可能比源服務器來得近,例如瀏覽器緩存。

2. 實現方法

讓代理服務器進行緩存;

讓客戶端瀏覽器進行緩存。

3. Cache-Control

HTTP/1.1 通過 Cache-Control 首部字段來控制緩存。

3.1 禁止進行緩存

no-store 指令規定不能對請求或響應的任何一部分進行緩存。

Cache-Control: no-store

3.2 強制確認緩存

no-cache 指令規定緩存服務器需要先向源服務器驗證緩存資源的有效性,只有當緩存資源有效才將能使用該緩存對客戶端的請求進行響應。

Cache-Control: no-cache

3.3 私有緩存和公共緩存

private 指令規定了將資源作為私有緩存,只能被單獨用戶所使用,一般存儲在用戶瀏覽器中。

Cache-Control: private

public 指令規定了將資源作為公共緩存,可以被多個用戶所使用,一般存儲在代理服務器中。

Cache-Control: public

3.4 緩存過期機制

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

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

Cache-Control: max-age=31536000

Expires 首部字段也可以用于告知緩存服務器該資源什么時候會過期。

Expires: Wed, 04 Jul 2012 08:26:05 GMT

在 HTTP/1.1 中,會優先處理 max-age 指令;

在 HTTP/1.0 中,max-age 指令會被忽略掉。

4. 緩存驗證

需要先了解 ETag 首部字段的含義,它是資源的唯一標識。URL 不能唯一表示資源,例如 http://www.google.com/ 有中文和英文兩個資源,只有 ETag 才能對這兩個資源進行唯一標識。

ETag: "82e22293907ce725faf67773957acd12"

可以將緩存資源的 ETag 值放入 If-None-Match 首部,服務器收到該請求后,判斷緩存資源的 ETag 值和資源的最新 ETag 值是否一致,如果一致則表示緩存資源有效,返回 304 Not Modified。

If-None-Match: "82e22293907ce725faf67773957acd12"

Last-Modified 首部字段也可以用于緩存驗證,它包含在源服務器發送的響應報文中,指示源服務器對資源的最后修改時間。但是它是一種弱校驗器,因為只能精確到一秒,所以它通常作為 ETag 的備用方案。如果響應首部字段里含有這個信息,客戶端可以在后續的請求中帶上 If-Modified-Since 來驗證緩存。服務器只在所請求的資源在給定的日期時間之后對內容進行過修改的情況下才會將資源返回,狀態碼為 200 OK。如果請求的資源從那時起未經修改,那么返回一個不帶有消息主體的 304 Not Modified 響應。

Last-Modified: Wed, 21 Oct 2015 07:28:00 GMT
If-Modified-Since: Wed, 21 Oct 2015 07:28:00 GMT

內容協商

通過內容協商返回最合適的內容,例如根據瀏覽器的默認語言選擇返回中文界面還是英文界面。

1. 類型

1.1 服務端驅動型

客戶端設置特定的 HTTP 首部字段,例如 Accept、Accept-Charset、Accept-Encoding、Accept-Language,服務器根據這些字段返回特定的資源。

它存在以下問題:

服務器很難知道客戶端瀏覽器的全部信息;

客戶端提供的信息相當冗長(HTTP/2 協議的首部壓縮機制緩解了這個問題),并且存在隱私風險(HTTP 指紋識別技術);

給定的資源需要返回不同的展現形式,共享緩存的效率會降低,而服務器端的實現會越來越復雜。

1.2 代理驅動型

服務器返回 300 Multiple Choices 或者 406 Not Acceptable,客戶端從中選出最合適的那個資源。

2. Vary

Vary: Accept-Language

在使用內容協商的情況下,只有當緩存服務器中的緩存滿足內容協商條件時,才能使用該緩存,否則應該向源服務器請求該資源。

例如,一個客戶端發送了一個包含 Accept-Language 首部字段的請求之后,源服務器返回的響應包含 Vary: Accept-Language 內容,緩存服務器對這個響應進行緩存之后,在客戶端下一次訪問同一個 URL 資源,并且 Accept-Language 與緩存中的對應的值相同時才會返回該緩存。

內容編碼

內容編碼將實體主體進行壓縮,從而減少傳輸的數據量。

常用的內容編碼有:gzip、compress、deflate、identity。

瀏覽器發送 Accept-Encoding 首部,其中包含有它所支持的壓縮算法,以及各自的優先級。服務器則從中選擇一種,使用該算法對響應的消息主體進行壓縮,并且發送 Content-Encoding 首部來告知瀏覽器它選擇了哪一種算法。由于該內容協商過程是基于編碼類型來選擇資源的展現形式的,在響應的 Vary 首部至少要包含 Content-Encoding。

范圍請求

如果網絡出現中斷,服務器只發送了一部分數據,范圍請求可以使得客戶端只請求服務器未發送的那部分數據,從而避免服務器重新發送所有數據。

1. Range

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

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

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

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

2. Accept-Ranges

響應首部字段 Accept-Ranges 用于告知客戶端是否能處理范圍請求,可以處理使用 bytes,否則使用 none。

Accept-Ranges: bytes

3. 響應狀態碼

在請求成功的情況下,服務器會返回 206 Partial Content 狀態碼。

在請求的范圍越界的情況下,服務器會返回 416 Requested Range Not Satisfiable 狀態碼。

在不支持范圍請求的情況下,服務器會返回 200 OK 狀態碼。

分塊傳輸編碼

Chunked Transfer Coding,可以把數據分割成多塊,讓瀏覽器逐步顯示頁面。

多部分對象集合

一份報文主體內可含有多種類型的實體同時發送,每個部分之間用 boundary 字段定義的分隔符進行分隔,每個部分都可以有首部字段。

例如,上傳多個表單時可以使用如下方式:

Content-Type: multipart/form-data; boundary=AaB03x--AaB03xContent-Disposition: form-data; name="submit-name"Larry--AaB03xContent-Disposition: form-data; name="files"; filename="file1.txt"Content-Type: text/plain... contents of file1.txt ...--AaB03x--

虛擬主機

HTTP/1.1 使用虛擬主機技術,使得一臺服務器擁有多個域名,并且在邏輯上可以看成多個服務器。

通信數據轉發

1. 代理

代理服務器接受客戶端的請求,并且轉發給其它服務器。

使用代理的主要目的是:

緩存

負載均衡

網絡訪問控制

訪問日志記錄

代理服務器分為正向代理和反向代理兩種:

用戶察覺得到正向代理的存在。

速讀,五分鐘深入了解HTTP

 

而反向代理一般位于內部網絡中,用戶察覺不到。

速讀,五分鐘深入了解HTTP

 

2. 網關

與代理服務器不同的是,網關服務器會將 HTTP 轉化為其它協議進行通信,從而請求其它非 HTTP 服務器的服務。

3. 隧道

使用 SSL 等加密手段,在客戶端和服務器之間建立一條安全的通信線路。

八、HTTPs

HTTP 有以下安全性問題:

使用明文進行通信,內容可能會被竊聽;

不驗證通信方的身份,通信方的身份有可能遭遇偽裝;

無法證明報文的完整性,報文有可能遭篡改。

HTTPs 并不是新協議,而是讓 HTTP 先和 SSL(Secure Sockets Layer)通信,再由 SSL 和 TCP 通信,也就是說 HTTPs 使用了隧道進行通信。

通過使用 SSL,HTTPs 具有了加密(防竊聽)、認證(防偽裝)和完整性保護(防篡改)。

速讀,五分鐘深入了解HTTP

 

加密

1. 對稱密鑰加密

對稱密鑰加密(Symmetric-Key Encryption),加密和解密使用同一密鑰。

優點:運算速度快;

缺點:無法安全地將密鑰傳輸給通信方。

速讀,五分鐘深入了解HTTP

 

2.非對稱密鑰加密

非對稱密鑰加密,又稱公開密鑰加密(Public-Key Encryption),加密和解密使用不同的密鑰。

公開密鑰所有人都可以獲得,通信發送方獲得接收方的公開密鑰之后,就可以使用公開密鑰進行加密,接收方收到通信內容后使用私有密鑰解密。

非對稱密鑰除了用來加密,還可以用來進行簽名。因為私有密鑰無法被其他人獲取,因此通信發送方使用其私有密鑰進行簽名,通信接收方使用發送方的公開密鑰對簽名進行解密,就能判斷這個簽名是否正確。

優點:可以更安全地將公開密鑰傳輸給通信發送方;

缺點:運算速度慢。

速讀,五分鐘深入了解HTTP

 

3. HTTPs 采用的加密方式

HTTPs 采用混合的加密機制,使用非對稱密鑰加密用于傳輸對稱密鑰來保證傳輸過程的安全性,之后使用對稱密鑰加密進行通信來保證通信過程的效率。(下圖中的 Session Key 就是對稱密鑰)

速讀,五分鐘深入了解HTTP

 

認證

通過使用 證書 來對通信方進行認證。

數字證書認證機構(CA,Certificate Authority)是客戶端與服務器雙方都可信賴的第三方機構。

服務器的運營人員向 CA 提出公開密鑰的申請,CA 在判明提出申請者的身份之后,會對已申請的公開密鑰做數字簽名,然后分配這個已簽名的公開密鑰,并將該公開密鑰放入公開密鑰證書后綁定在一起。

進行 HTTPs 通信時,服務器會把證書發送給客戶端。客戶端取得其中的公開密鑰之后,先使用數字簽名進行驗證,如果驗證通過,就可以開始通信了。

通信開始時,客戶端需要使用服務器的公開密鑰將自己的私有密鑰傳輸給服務器,之后再進行對稱密鑰加密。

速讀,五分鐘深入了解HTTP

 

完整性保護

SSL 提供報文摘要功能來進行完整性保護。

HTTP 也提供了 MD5 報文摘要功能,但不是安全的。例如報文內容被篡改之后,同時重新計算 MD5 的值,通信接收方是無法意識到發生了篡改。

HTTPs 的報文摘要功能之所以安全,是因為它結合了加密和認證這兩個操作。試想一下,加密之后的報文,遭到篡改之后,也很難重新計算報文摘要,因為無法輕易獲取明文。

HTTPs 的缺點

因為需要進行加密解密等過程,因此速度會更慢;

需要支付證書授權的高額費用。

九、HTTP/2.0

HTTP/1.x 缺陷

HTTP/1.x 實現簡單是以犧牲性能為代價的:

客戶端需要使用多個連接才能實現并發和縮短延遲;

不會壓縮請求和響應首部,從而導致不必要的網絡流量;

不支持有效的資源優先級,致使底層 TCP 連接的利用率低下。

二進制分幀層

HTTP/2.0 將報文分成 HEADERS 幀和 DATA 幀,它們都是二進制格式的。

速讀,五分鐘深入了解HTTP

 

在通信過程中,只會有一個 TCP 連接存在,它承載了任意數量的雙向數據流(Stream)。

一個數據流(Stream)都有一個唯一標識符和可選的優先級信息,用于承載雙向信息。

消息(Message)是與邏輯請求或響應對應的完整的一系列幀。

幀(Frame)是最小的通信單位,來自不同數據流的幀可以交錯發送,然后再根據每個幀頭的數據流標識符重新組裝。

速讀,五分鐘深入了解HTTP

 

服務端推送

HTTP/2.0 在客戶端請求一個資源時,會把相關的資源一起發送給客戶端,客戶端就不需要再次發起請求了。例如客戶端請求 page.html 頁面,服務端就把 script.js 和 style.css 等與之相關的資源一起發給客戶端。

速讀,五分鐘深入了解HTTP

 

首部壓縮

HTTP/1.1 的首部帶有大量信息,而且每次都要重復發送。

HTTP/2.0 要求客戶端和服務器同時維護和更新一個包含之前見過的首部字段表,從而避免了重復傳輸。

不僅如此,HTTP/2.0 也使用 Huffman 編碼對首部字段進行壓縮。

速讀,五分鐘深入了解HTTP

 

十、HTTP/1.1 新特性

詳細內容請見上文

默認是長連接

支持流水線

支持同時打開多個 TCP 連接

支持虛擬主機

新增狀態碼 100

支持分塊傳輸編碼

新增緩存處理指令 max-age

十一、GET 和 POST 比較

數據傳輸方式

GET提交的數據會放在URL之后,以?分割URL和傳輸數據,參數之間以&相連,如EditPosts.aspx?name=test1&id=123456。 POST方法是把提交的數據放在HTTP包的Body中。(一個形象地比喻是:當執行GET請求的時候,要給汽車貼上GET的標簽(設置method為GET),而且要求把傳送的數據放在車頂上(url中)以方便記錄。如果是POST請求,就要在車上貼上POST的標簽,并把貨物放在車廂里。)

因為 URL 只支持 ASCII 碼,因此 GET 的參數中如果存在中文等字符就需要先進行編碼。例如 中文 會轉換為 %E4%B8%AD%E6%96%87,而空格會轉換為 %20。POST 參考支持標準字符集。

保密性

GET方式提交數據,會帶來安全問題,比如一個登錄頁面,通過GET方式提交數據時,用戶名和密碼將出現在URL上,如果頁面可以被緩存或者其他人可以訪問這臺機器,就可以從歷史記錄獲得該用戶的賬號和密碼

但是,不能因為 POST 參數存儲在實體主體中就認為它的安全性更高,因為照樣可以通過一些抓包工具(Fiddler)查看。

冪等性

冪等的 HTTP 方法,同樣的請求被執行一次與連續執行多次的效果是一樣的,服務器的狀態也是一樣的。換句話說就是,冪等方法不應該具有副作用(統計用途除外)。

所有的安全方法也都是冪等的。

在正確實現的條件下,GET,HEAD,PUT 和 DELETE 等方法都是冪等的,而 POST 方法不是。

傳輸數據的大小

首先聲明:HTTP協議沒有對傳輸的數據大小進行限制,HTTP協議規范也沒有對URL長度進行限制。

而在實際開發中存在的限制主要有:

**GET:**特定瀏覽器和服務器對URL長度有限制,例如 IE對URL長度的限制是2083字節(2K+35)。對于其他瀏覽器,如Netscape、FireFox等,理論上沒有長度限制,其限制取決于操作系 統的支持。

因此對于GET提交時,傳輸數據就會受到URL長度的 限制。

**POST:**由于不是通過URL傳值,理論上數據不受 限。但實際各個WEB服務器會規定對post提交數據大小進行限制,Apache、IIS6都有各自的配置。

安全

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

GET 方法是安全的,而 POST 卻不是,因為 POST 的目的是傳送實體主體內容,這個內容可能是用戶上傳的表單數據,上傳成功之后,服務器可能把這個數據存儲到數據庫中,因此狀態也就發生了改變。

安全的方法除了 GET 之外還有:HEAD、OPTIONS。

不安全的方法除了 POST 之外還有 PUT、DELETE。

速度

GET產生一個TCP數據包;POST產生兩個TCP數據包。

對于GET方式的請求,瀏覽器會把http header和data一并發送出去,服務器響應200(返回數據);而對于POST,瀏覽器先發送header,服務器響應100 continue,瀏覽器再發送data,服務器響應200 ok(返回數據)。

參考

關于HTTP協議,一篇就夠了HTTPGET和POST兩種基本請求方法的區別

本文來源:http://8rr.co/zgQS

分享到:
標簽:HTTP
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定