🧑💻 寫在開頭
點贊 + 收藏 === 學會🤣🤣🤣
http
超文字傳輸協議(HTTP)是用於傳輸諸如HTML的超媒體文件的應用層協議。它被設計用於Web瀏覽器和Web伺服器之間的通訊,但它也可以用於其他目的。 HTTP遵循經典的客戶端-服務端模型,客戶端開啟一個連線以發出請求,然後等待它收到伺服器端響應。 HTTP是無狀態協議,意味著伺服器不會在兩個請求之間保留任何資料(狀態)。雖然通常基於TCP / IP層,但可以在任何可靠的傳輸層上使用;也就是說,一個不會靜默丟失訊息的協議,如UDP。
http1.0 時代
影響一個 HTTP 網路請求的因素主要有兩個:頻寬和延遲。
-
頻寬:如果說我們還停留在撥號上網的階段,頻寬可能會成為一個比較嚴重影響請求的問題,但是現在網路基礎建設已經使得頻寬得到極大的提升,我們不再會擔心由頻寬而影響網速,那麼就只剩下延遲了。
-
延遲:
- 瀏覽器阻塞(HOL blocking):瀏覽器會因為一些原因阻塞請求。瀏覽器對於同一個域名,同時只能有 4 個連線(這個根據瀏覽器核心不同可能會有所差異),超過瀏覽器最大連線數限制,後續請求就會被阻塞。
- DNS 查詢(DNS Lookup):瀏覽器需要知道目標伺服器的 IP 才能建立連線。將域名解析為 IP 的這個系統就是 DNS。這個通常可以利用DNS快取結果來達到減少這個時間的目的。
- 建立連線(Initial connection):HTTP 是基於 TCP 協議的,瀏覽器最快也要在第三次握手時才能捎帶 HTTP 請求報文,達到真正的建立連線,但是這些連線無法複用會導致每次請求都經歷三次握手和慢啟動。三次握手在高延遲的場景下影響較明顯,慢啟動則對檔案類大請求影響較大。
主要區別
HTTP1.0最早在網頁中使用是在1996年,那個時候只是使用一些較為簡單的網頁上和網路請求上,而HTTP1.1則在1999年才開始廣泛應用於現在的各大瀏覽器網路請求中,同時HTTP1.1也是當前使用最為廣泛的HTTP協議。 主要區別主要體現在:
-
快取處理,在HTTP1.0中主要使用header裡的If-Modified-Since,Expires來做為快取判斷的標準,HTTP1.1則引入了更多的快取控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供選擇的快取頭來控制快取策略。
-
頻寬最佳化及網路連線的使用,HTTP1.0中,存在一些浪費頻寬的現象,例如客戶端只是需要某個物件的一部分,而伺服器卻將整個物件送過來了,並且不支援斷點續傳功能,HTTP1.1則在請求頭引入了range頭域,它允許只請求資源的某個部分,即返回碼是206(Partial Content),這樣就方便了開發者自由的選擇以便於充分利用頻寬和連線。
-
錯誤通知的管理,在HTTP1.1中新增了24個錯誤狀態響應碼,如409(Conflict)表示請求的資源與資源的當前狀態發生衝突;410(Gone)表示伺服器上的某個資源被永久性的刪除。
-
Host頭處理,在HTTP1.0中認為每臺伺服器都繫結一個唯一的IP地址,因此,請求訊息中的URL並沒有傳遞主機名(hostname)。但隨著虛擬主機技術的發展,在一臺物理伺服器上可以存在多個虛擬主機(Multi-homed Web Servers),並且它們共享一個IP地址。HTTP1.1的請求訊息和響應訊息都應支援Host頭域,且請求訊息中如果沒有Host頭域會報告一個錯誤(400 Bad Request)。
-
長連線,HTTP 1.1支援長連線(PersistentConnection)和請求的流水線(Pipelining)處理,在一個TCP連線上可以傳送多個HTTP請求和響應,減少了建立和關閉連線的消耗和延遲,在HTTP1.1中預設開啟Connection: keep-alive,一定程度上彌補了HTTP1.0每次請求都要建立連線的缺點。
Https
HTTP Strict Transport Security (通常簡稱為HSTS) 是一個安全功能,它告訴瀏覽器只能透過HTTPS訪問當前資源, 禁止HTTP方式.
Strict Transport Security解決了這個問題;只要你透過HTTPS請求訪問銀行網站,並且銀行網站配置好Strict Transport Security,你的瀏覽器知道自動使用HTTPS請求,這可以阻止駭客的中間人攻擊的把戲。
啟用 Strict Transport Security
開啟HSTS只需要當透過HTTPS方式訪問你的網站時,返回 Strict-Transport-SecurityHTTP 頭資訊: Strict-Transport-Security: max-age=expireTime [; includeSubdomains]
HTTPS與HTTP的一些區別
- HTTPS協議需要到CA申請證書,一般免費證書很少,需要交費。
- HTTP協議執行在TCP之上,所有傳輸的內容都是明文,HTTPS執行在SSL/TLS之上,SSL/TLS執行在TCP之上,所有傳輸的內容都經過加密的。
- HTTP和HTTPS使用的是完全不同的連線方式,用的埠也不一樣,前者是80,後者是443。
- HTTPS可以有效的防止運營商劫持,解決了防劫持的一個大問題。
使用SPDY加快你的網站速度
2012年google如一聲驚雷提出了SPDY的方案,大家才開始從正面看待和解決老版本HTTP協議本身的問題,SPDY可以說是綜合了HTTPS和HTTP兩者有點於一體的傳輸協議,主要解決:
- 降低延遲,針對HTTP高延遲的問題,SPDY優雅的採取了多路複用(multiplexing)。多路複用透過多個請求stream共享一個tcp連線的方式,解決了HOL blocking的問題,降低了延遲同時提高了頻寬的利用率。
- 請求優先順序(request prioritization)。多路複用帶來一個新的問題是,在連線共享的基礎之上有可能會導致關鍵請求被阻塞。SPDY允許給每個request設定優先順序,這樣重要的請求就會優先得到響應。比如瀏覽器載入首頁,首頁的html內容應該優先展示,之後才是各種靜態資原始檔,指令碼檔案等載入,這樣可以保證使用者能第一時間看到網頁內容。
- header壓縮。前面提到HTTP1.x的header很多時候都是重複多餘的。選擇合適的壓縮演算法可以減小包的大小和數量。
- 基於HTTPS的加密協議傳輸,大大提高了傳輸資料的可靠性。
- 服務端推送(server push),採用了SPDY的網頁,例如我的網頁有一個sytle.css的請求,在客戶端收到sytle.css資料的同時,服務端會將sytle.js的檔案推送給客戶端,當客戶端再次嘗試獲取sytle.js時就可以直接從快取中獲取到,不用再發請求了。SPDY構成圖:
SPDY位於HTTP之下,TCP和SSL之上,這樣可以輕鬆相容老版本的HTTP協議(將HTTP1.x的內容封裝成一種新的frame格式),同時可以使用已有的SSL功能。
HTTP2
HTTP2.0可以說是SPDY的升級版(其實原本也是基於SPDY設計的),但是,HTTP2.0 跟 SPDY 仍有不同的地方,主要是以下兩點
● HTTP2.0 支援明文 HTTP 傳輸,而 SPDY 強制使用 HTTPS
● HTTP2.0 訊息頭的壓縮演算法採用 HPACK,而非 SPDY 採用的 DEFLATE
http2 新特性
● 新的二進位制格式(Binary Format),HTTP1.x的解析是基於文字。基於文字協議的格式解析存在天然缺陷,文字的表現形式有多樣性,要做到健壯性考慮的場景必然很多,二進位制則不同,只認0和1的組合。基於這種考慮HTTP2.0的協議解析決定採用二進位制格式,實現方便且健壯。
● 多路複用(MultiPlexing),即連線共享,即每一個request都是是用作連線共享機制的。一個request對應一個id,這樣一個連線上可以有多個request,每個連線的request可以隨機的混雜在一起,接收方可以根據request的 id將request再歸屬到各自不同的服務端請求裡面。多路複用原理圖:
●header壓縮,如上文中所言,對前面提到過HTTP1.x的header帶有大量資訊,而且每次都要重複傳送,HTTP2.0使用encoder來減少需要傳輸的header大小,通訊雙方各自cache一份header fields表,既避免了重複header的傳輸,又減小了需要傳輸的大小。
● 服務端推送(server push),同SPDY一樣,HTTP2.0也具有server push功能。目前,有大多數網站已經啟用HTTP2.0,例如YouTuBe,淘寶網等網站,利用chrome控制檯可以檢視是否啟用H2:
chrome=>Network=>Name欄右鍵=>√Protocol
http升級為https
前提準備
-
已申請了自己的域名
-
註冊阿里雲賬號
-
當然要有自己的伺服器, 裝一下 Nginx, 待會域名校驗會用到
申請阿里雲免費證書
選購證書
- 控制檯搜尋 SSL, 點選"選購證書"
- 選擇 單域名 -- DV SSL -- 免費版, 可以看到收費0, 支付成功會有提示
申請證書
進入證書控制檯, 點選證書申請, 填寫資訊
域名校驗方式我選擇的是 手動"檔案校驗"的方式,
如果你的伺服器是阿里雲的, 選擇 "自動DNS驗證"會很方便, 在這裡咱們就按照常規方式來, 也算了解一下運維過程
準備校驗檔案
這裡所謂驗證
, 其實就是透過上面的域名能訪問到, 校驗檔案, 訪問不到當然沒法讓你使用啦
Nginx 配置這裡可能要注意下, 也沒什麼難度
下載證書
根據自己的伺服器型別下載, 這裡咱們選擇Nginx
上傳證書, 配置Nginx
咱們把ssl證書放到/ssl
(目錄隨意吧), 把下載的證書檔案解壓之後, 上傳到該目錄
貼一下Nginx配置, 記得改完配置要重啟Nginx哦
server { #listen 80; #偵聽80埠,如果強制所有的訪問都必須是HTTPs的,這行需要登出掉 listen 443 ssl; server_name xxx.com; #域名 # 增加ssl #ssl on; #如果強制HTTPs訪問,這行要開啟 ssl_certificate /ssl/xxxx.pem; ssl_certificate_key /ssl/xxxxx.key; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; # 指定密碼為openssl支援的格式 ssl_protocols SSLv2 SSLv3 TLSv1.2; ssl_ciphers HIGH:!aNULL:!MD5; # 密碼加密方式 ssl_prefer_server_ciphers on; # 依賴SSLv3和TLSv1協議的伺服器密碼將優先於客戶端密碼 # 定義首頁索引目錄和名稱 location / { root /usr/share/nginx/html; index index.html index.htm; } #重定向錯誤頁面到 /50x.html error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }
然後就可以愉快的訪問體驗HTTPS了
乾貨贈送: Nginx 排錯小技巧
在配置過程中, 可能會出現訪問沒反應, 等各種問題,
這時候, 不要慌, 咱們有思路
此時一定要觀察Nginx的 access.log 和 error.log, 從error.log 一般能找到有效資訊, 可以拿到error關鍵字, 再取搜尋引擎去分析解決
我剛才配置就失敗了一次, Nginx配置完證書之後, 重啟, 輸入url訪問未反應,
隨即看下error.log,
2020/05/10 03:11:39 [emerg] 1#1: cannot load certificate "/ssl/xxx.key": PEM_read_bio_X509_AUX() failed (SSL: error:0909006C:PEM routines:get_name:no start line:Expecting: TRUSTED CERTIFICATE)
帶著關鍵字去搜尋, 隨便點進去一篇, 突然注意點, 我證書配置對應錯了, 哈哈, 尷尬
馬上改正, 重啟, 驗證有效, OK !