Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 亚洲人交性视频,欧美激情精品久久久久久大尺度,91青草视频

          整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          「面試」HTTP知識點復習手冊(上)

          注我的微信公眾號:后端技術漫談

          不定期推送關于后端開發、爬蟲、算法題、數據結構方面的原創技術文章,以及生活中的逸聞趣事。

          我目前是一名后端開發工程師。主要關注后端開發,數據安全,網絡爬蟲,物聯網,邊緣計算等方向。

          原創博客主要內容

          • Java知識點復習全手冊
          • Leetcode算法題解析
          • 劍指offer算法題解析
          • SpringCloud菜鳥入門實戰系列
          • SpringBoot菜鳥入門實戰系列
          • Python爬蟲相關技術文章
          • 后端開發相關技術文章

          image

          前言

          本文快速回顧了常考的的知識點,用作面試復習,事半功倍。

          上篇主要內容: 狀態碼、Http1.0/1.1/2.0、Https、GET和POST

          下篇主要內容: Web攻擊技術、HTTP基礎概念、HTTP Header詳解、HTTP應用

          面試知識點復習手冊

          全復習手冊文章導航

          Csdn全復習手冊文章導航:

          https://blog.csdn.net/qqxx6661/article/details/86775594

          已發布知識點復習手冊

          • Java基礎知識點面試手冊
          • Java容器(List、Set、Map)知識點快速復習手冊
          • Java并發知識點快速復習手冊(上)
          • Java并發知識點快速復習手冊(下)
          • Java虛擬機知識點快速復習手冊(上)
          • Java虛擬機知識點快速復習手冊(下)
          • 快速梳理23種常用的設計模式
          • Redis基礎知識點面試手冊
          • Leetcode題解分類匯總(前150題)
          • 面試常問的小算法總結
          • 查找算法總結及其部分算法實現Python/Java
          • 排序算法實現與總結Python/Java
          • ……等(請查看全復習手冊導航)

          本文參考

          本文內容主要參考來自CyC2018的Github倉庫:CS-Notes

          有刪減,修改,補充額外增加內容

          本作品采用知識共享署名-非商業性使用 4.0 國際許可協議進行許可。

          --------------------正文-----------------------

          狀態碼

          圖片文件夾兩張圖

          有拓展參考:https://zhuanlan.zhihu.com/p/34648453

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

          1XX 信息

          • 100 Continue :表明到目前為止都很正常,客戶端可以繼續發送請求或者忽略這個響應。
          • 101 Switching Protocols 協議升級:請求者要求服務器切換協議,服務器確認并準備切換 主要用于websocket:表示服務端接受 WebSocket 協議的客戶端連接 也可以用于http2的升級。

          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 狀態碼。 瀏覽器緩存分為強制緩存和協商緩存,優先讀取強制緩存。 強制緩存分為expires和cache-control: expires是一個特定的時間,是比較舊的標準。 cache-control通常是一個具體的時間長度,比較新,優先級也比較高。 協商緩存包括etag和last-modified: last-modified的設置標準是資源的上次修改時間 etag是為了應對資源修改時間可能很頻繁的情況出現的,是基于資源的內容計算出來的值,因此優先級也較高。 如果 Last-Modified 和 ETag 同時被使用,則要求它們的驗證都必須通過才會返回304,若其中某個驗證沒通過,則服務器會按常規返回資源實體及200狀態碼。 協商緩存與強制緩存的區別在于強制緩存不需要訪問服務器,返回結果是200,協商緩存需要訪問服務器,命中協商緩存的話,返回結果是304。 步驟:客戶端發送附帶條件的請求時(if-matched,if-modified-since,if-none-match,if-range,if-unmodified-since任一個)服務器端允許請求訪問資源,但因發生請求未滿足條件的情況后,直接返回304Modified(服務器端資源未改變,可直接使用客戶端未過期的緩存)。 補充網頁:expires/cache-control/last-modified/etag詳解以及解釋為何應chrome該顯示304卻顯示200:
            http://www.cnblogs.com/vajoy/p/5341664.html
          • 307 Temporary Redirect :臨時重定向,與 302 的含義類似,但是 307 要求瀏覽器不允許把重定向請求的 POST 方法改成 GET 方法。 關于303和307:https://blog.csdn.net/liuxingen/article/details/51511034 303、307其實就是把原來301、302不”合法”的處理動作給”合法化”,因為發現大家都不太遵守,所以干脆就增加一條規定。 額外功能:也用于hsts跳轉。hsts全稱HTTP嚴格傳輸安全(HTTP Strict Transport Security,縮寫:HSTS) 功能是要求瀏覽器下次訪問該站點時使用https來訪問,而不再需要先是http再轉https。這樣可以避免ssl剝離攻擊:即攻擊者在用戶使用http訪問的過程中進行攻擊,對服務器冒充自己是用戶,在攻擊者和服務器中使用https訪問,在用戶和服務器中使用http訪問。具體使用方法是在服務器響應頭中添加Strict-Transport-Security,可以設置 max-age。

          4XX 客戶端錯誤

          • 400 Bad Request :請求報文中存在語法錯誤。提交json時,如果json格式有問題,接收端接收json,也會出現400 bad request。比如常見的json串,數組不應該有",但是有"了。
          • 401 Unauthorized :該狀態碼表示發送的請求需要有認證信息(BASIC 認證、DIGEST 認證)。如果之前已進行過一次請求,則表示用戶認證失敗。
          • 403 Forbidden :請求被拒絕,服務器端沒有必要給出拒絕的詳細理由。
          • 404 Not Found
          • 405 method not allowed
            問題原因:請求的方式(get、post、delete)方法與后臺規定的方式不符合。比如: 后臺方法規定的請求方式只接受get,如果用post請求,就會出現 405 method not allowed的提示
          • 408 請求超時

          5XX 服務器錯誤

          • 500: Internal Server Error :服務器正在執行請求時發生錯誤。
          • 502:Bad Gateway:進程響應的內容是nginx無法理解的響應
          • 503 Service Unavilable :服務器暫時處于超負載或正在進行停機維護,現在無法處理請求。(瞬時請求量過大)
          • 504:Gateway Time-out:進程阻塞超過nginx的時間閾值返回504
          • 505:不支持該http版本

          Http1.0/1.1/2.0

          參考:

          1. https://mp.weixin.qq.com/s/GICbiyJpINrHZ41u_4zT-A
          2. https://github.com/CyC2018/Interview-Notebook/blob/master/notes/HTTP.md

          1.1相比1.0

          長連接和流水線(Pipelining)處理

          HTTP 1.1支持長連接(PersistentConnection)和管線化(Pipelining)處理,在一個TCP連接上可以傳送多個HTTP請求和響應,減少了建立和關閉連接的消耗和延遲。

          如果要斷開 TCP 連接,需要由客戶端或者服務器端提出斷開,使用 Connection : close

          在HTTP1.1中默認開啟Connection: keep-alive,一定程度上彌補了HTTP1.0每次請求都要創建連接的缺點。

          Host頭處理/虛擬主機

          在HTTP1.0中認為每臺服務器都綁定一個唯一的IP地址,因此,請求消息中的URL并沒有傳遞主機名(hostname)。但隨著虛擬主機技術的發展,在一臺物理服務器上可以存在多個虛擬主機(Multi-homed Web Servers),并且它們共享一個IP地址。HTTP1.1的請求消息和響應消息都應支持Host頭域,且請求消息中如果沒有Host頭域會報告一個錯誤(400 Bad Request)。(Host頭域指定請求資源的Intenet主機和端口號,必須表示請求url的原始服務器或網關的位置。)

          • 在http 1.1中不能缺失host字段,如果缺失, 服務器返回400 bad request,http1.1中不能缺失host字段,但host字段可以是空值。
          • 在http 1.0中可以缺失host字段。

          支持分塊傳輸編碼

          HTTP1.0中,存在一些浪費帶寬的現象,例如客戶端只是需要某個對象的一部分,而服務器卻將整個對象送過來了,并且不支持斷點續傳功能,HTTP1.1則在請求頭引入了range頭域,它允許只請求資源的某個部分,即返回碼是206(Partial Content),這樣就方便了開發者自由的選擇以便于充分利用帶寬和連接。

          另一種解釋:可以把數據分割成多塊,讓瀏覽器逐步顯示頁面。

          錯誤通知的管理/新增狀態碼

          在HTTP1.1中新增了24個錯誤狀態響應碼,如:

          • 409(Conflict)表示請求的資源與資源的當前狀態發生沖突;
          • 410(Gone)表示服務器上的某個資源被永久性的刪除。

          緩存處理(協商緩存)

          在HTTP1.0中主要使用header里的If-Modified-Since,Expires來做為緩存判斷的標準。

          HTTP1.1則引入了更多的緩存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供選擇的緩存頭來控制緩存策略。

          新增緩存處理指令 max-age

          支持同時打開多個 TCP 連接

          新增狀態碼 100

          2.0相比1.1

          https://mp.weixin.qq.com/s/NMhNVDP47npMqx5ruVy43w

          HTTP/1.x 缺陷

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

          • 客戶端需要使用多個連接才能實現并發和縮短延遲;
          • 不會壓縮請求和響應首部,從而導致不必要的網絡流量;
          • 不支持有效的資源優先級,致使底層 TCP 連接的利用率低下。

          二進制分幀層

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

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

          • 一個數據流(Stream)都有一個唯一標識符和可選的優先級信息,用于承載雙向信息。
          • 消息(Message)是與邏輯請求或響應對應的完整的一系列幀。
          • 幀(Frame)是最小的通信單位,來自不同數據流的幀可以交錯發送,然后再根據每個幀頭的數據流標識符重新組裝。

          在這里插入圖片描述

          和1.1區別在于:

          • HTTP1.x的解析是基于文本。基于文本協議的格式解析存在天然缺陷,文本的表現形式有多樣性,要做到健壯性考慮的場景必然很多
          • 二進制則不同,只認0和1的組合。基于這種考慮HTTP2.0的協議解析決定采用二進制格式,實現方便且健壯。

          在這里插入圖片描述

          在這里插入圖片描述

          二進制分幀:多路復用(MultiPlexing)

          即連接共享,即每一個request都是是用作連接共享機制的。一個request對應一個id,這樣一個連接上可以有多個request,每個連接的request可以隨機的混雜在一起,接收方可以根據request的 id將request再歸屬到各自不同的服務端請求里面。

          • 單連接多資源的方式,減少服務端的鏈接壓力,內存占用更少,連接吞吐量更大;
          • 由于減少TCP 慢啟動時間,提高傳輸的速度。

          HTTP2.0的多路復用和HTTP1.X中的長連接復用有什么區別?

          關鍵點:一個是串行,一個是并行,一個阻塞不影響其他request。

          header壓縮

          如上文中所言,對前面提到過HTTP1.x的header帶有大量信息,而且每次都要重復發送,HTTP2.0使用encoder來減少需要傳輸的header大小,通訊雙方各自cache一份header fields表,既避免了重復header的傳輸,又減小了需要傳輸的大小。

          在這里插入圖片描述

          在這里插入圖片描述

          服務端推送(server push)

          同SPDY一樣,HTTP2.0也具有server push功能。

          在這里插入圖片描述

          在這里插入圖片描述

          SPYD相比1.1

          多路復用

          針對HTTP高延遲的問題,SPDY優雅的采取了多路復用(multiplexing)。多路復用通過多個請求stream共享一個tcp連接的方式,解決了HOL blocking的問題,降低了延遲同時提高了帶寬的利用率。

          請求優先級(request prioritization)

          多路復用帶來一個新的問題是,在連接共享的基礎之上有可能會導致關鍵請求被阻塞。SPDY允許給每個request設置優先級,這樣重要的請求就會優先得到響應。比如瀏覽器加載首頁,首頁的html內容應該優先展示,之后才是各種靜態資源文件,腳本文件等加載,這樣可以保證用戶能第一時間看到網頁內容。

          header壓縮

          前面提到HTTP1.x的header很多時候都是重復多余的。選擇合適的壓縮算法可以減小包的大小和數量。

          服務端推送(server push)

          采用了SPDY的網頁,例如我的網頁有一個sytle.css的請求,在客戶端收到sytle.css數據的同時,服務端會將sytle.js的文件推送給客戶端,當客戶端再次嘗試獲取sytle.js時就可以直接從緩存中獲取到,不用再發請求了。

          基于HTTPS的加密協議傳輸

          大大提高了傳輸數據的可靠性。

          HTTP2.0和SPDY的區別

          • HTTP2.0 支持明文 HTTP 傳輸,而 SPDY 強制使用 HTTPS
          • HTTP2.0 消息頭的壓縮算法采用 HPACK http://http2.github.io/http2-spec/compression.html
          • SPDY 消息頭的壓縮算法采用 DEFLATE http://zh.wikipedia.org/wiki/DEFLATE

          HTTPs

          HTTPS和HTTP的區別主要如下:

          1、https協議需要到ca申請證書,一般免費證書較少,因而需要一定費用

          2、http是超文本傳輸協議,信息是明文傳輸,https則是具有安全性的ssl加密傳輸協議

          3、用的端口也不一樣,前者是80,后者是443。

          4、http的連接很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證、完整性保護的網絡協議,比http協議安全。
            
            

          HTTP 有以下安全性問題:

          • 內容可能會被竊聽;
          • 通信方的身份有可能遭遇偽裝;
          • 報文有可能遭篡改。

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

          隧道:它是將原始IP包(其報頭包含原始發送者和最終目的地)封裝在另一個數據包(稱為封裝的IP包)的數據凈荷中進行傳輸。使用隧道的原因是在不兼容的網絡上傳輸數據,或在不安全網絡上提供一個安全路徑。

          通過使用 SSL,HTTPs 具有了:

          加密(防竊聽)、認證(防偽裝)和完整性保護(防篡改)

          在這里插入圖片描述

          HTTPs認證

          請看下面加黑字體是重點:

          在這里插入圖片描述

          • 服務方 S 向第三方機構CA提交公鑰、組織信息、個人信息(域名)等信息并申請認證;
          • CA 通過線上、線下等多種手段驗證申請者提供信息的真實性,如組織是否存在、企業是否合法,是否擁有域名的所有權等;
          • 如信息審核通過,CA 會向申請者簽發認證文件-證書。
            簽名的產生算法:首先,使用散列函數計算公開的明文信息的信息摘要,然后,采用 CA 的私鑰對信息摘要進行簽名;

          客戶端:

          • 客戶端 C 向服務器 S 發出請求時,S 返回證書文件;
          • 客戶端 C 讀取證書中的相關的明文信息,采用相同的散列函數計算得到信息摘要,然后,利用對應 CA 的公鑰解密簽名數據
          • 對比證書的信息摘要(明文的信息摘要和簽名解密后的一致),如果一致,則可以確認證書的合法性,即公鑰合法;
          • 客戶端然后驗證證書相關的域名信息、有效時間等信息;
          • 客戶端會內置信任 CA 的證書信息(包含公鑰),如果CA不被信任,則找不到對應 CA 的證書,證書也會被判定非法。

          在這個過程注意幾點:

          • 1.申請證書不需要提供私鑰,確保私鑰永遠只能服務器掌握;
          • 2.證書的合法性仍然依賴于非對稱加密算法,證書主要是增加了服務器信息以及簽名;
          • 3.內置 CA 對應的證書稱為根證書,頒發者和使用者相同,自己為自己簽名,即自簽名證書;
          • 4.證書=網站公鑰+申請者與頒發者信息+簽名;

          HTTPs認證后的傳輸

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

          在這里插入圖片描述

          完整性保護

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

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

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

          HTTPs 的缺點

          • 因為需要進行加密解密等過程,因此速度會更慢;
          • 需要支付證書授權的高費用。

          GET 和 POST 的區別

          作用

          GET 用于獲取資源,而 POST 用于傳輸實體主體。

          參數

          • GET 的傳參方式相比于 POST 安全性較差,因為 GET 傳的參數在 URL 中是可見的,可能會泄露私密信息。
          • 并且 GET 只支持 ASCII 字符,因此 GET 的參數中如果存在中文等字符就需要先進行編碼,例如中文會轉換為%E4%B8%AD%E6%96%87,而空格會轉換為%20。POST 支持標準字符集。
          GET /test/demo_form.asp?name1=value1&name2=value2 HTTP/1.1
          
          POST /test/demo_form.asp HTTP/1.1
          Host: w3schools.com
          name1=value1&name2=value2
          
          • 不能因為 POST 參數存儲在實體主體中就認為它的安全性更高,因為照樣可以通過一些抓包工具(Fiddler)查看。

          安全

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

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

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

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

          冪等性

          冪等的 HTTP 方法,同樣的請求被執行一次與連續執行多次的效果是一樣的,服務器的狀態也是一樣的。

          GET,HEAD,PUT 和 DELETE 等方法都是冪等的,

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

          可緩存

          • 請求報文的 HTTP 方法本身是可緩存的,包括 GET 和 HEAD
          • 但是 PUT 和 DELETE 不可緩存,POST 在多數情況下不可緩存的。

          XMLHttpRequest

          為了闡述 POST 和 GET 的另一個區別,需要先了解 XMLHttpRequest:

          XMLHttpRequest 是一個 API,它為客戶端提供了在客戶端和服務器之間傳輸數據的功能。它提供了一個通過 URL 來獲取數據的簡單方式,并且不會使整個頁面刷新。這使得網頁只更新一部分頁面而不會打擾到用戶。XMLHttpRequest 在 AJAX 中被大量使用。

          在使用 XMLHttpRequest 的 POST 方法時,瀏覽器會先發送 Header 再發送 Data

          但并不是所有瀏覽器會這么做,例如火狐就不會。而 GET 方法 Header 和 Data 會一起發送。

          關注我

          我是一名后端開發工程師。主要關注后端開發,數據安全,網絡爬蟲,物聯網,邊緣計算等方向,歡迎交流。

          各大平臺都可以找到我

          • Github:@qqxx6661
          • CSDN:@Rude3Knife
          • 知乎:@Zhendong
          • 簡書:@蠻三刀把刀
          • 掘金:@蠻三刀把刀

          原創博客主要內容

          • Java知識點復習全手冊
          • Leetcode算法題解析
          • 劍指offer算法題解析
          • SpringBoot菜鳥入門實戰系列
          • SpringCloud菜鳥入門實戰系列
          • 爬蟲相關技術文章
          • 后端開發相關技術文章
          • 逸聞趣事/好書分享/個人興趣

          個人公眾號:后端技術漫談

          如果文章對你有幫助,不妨收藏起來并轉發給您的朋友們~

          下文章來源于一口LINUX

          我是程序員小賤

          從面試出發,解剖各個知識點,讓我們向上成長!這里除了學習,還有音樂,生活攝影,籃球等,期待你的加入!

          本文將從以下幾個方面進行分享。其中包括HTTP發展史HTTP緩存代理機制常用的web攻擊HTTP和HTTPS的流量識別,網絡協議學習的工具推薦以及高頻HTTP與HTTPS的高頻面試題題解等,開工。

          提綱

          1989年,蒂姆·伯納斯 - 李(Tim Berners-Lee)在論文中提出可以在互聯網上構建超鏈接文檔,并提出了三點.

          URI:統一資源標識符。互聯網的唯一ID

          HTML:超文本文檔

          HTTP:傳輸超文本的文本傳輸協議

          1 HTTP應用在哪兒

          學習一門知識,采用五分鐘時間看看這個知識是干啥的可能會更加有目的性。HTTP可謂無處不在,這里例舉出幾個。

          HTTP應用場景

          2 HTTP是什么

          HTTP(hypertext transport protocol)翻譯過來為"超文本傳輸協議",文本可以理解為簡單的字符文字組合,也可以理解為更為復雜的音頻或者圖像等。那么將這個詞語拆分為三個部分。

          超文本傳輸協議

          "超文本"和"文本"相比多了一個字"超",這樣看來比文本豐富,因為它可以將多種文本/圖像等進行混合,更重要的是可以從一個文本跳轉到另一個文本(文本連接)。

          "傳輸",傳輸的過程中需要溝通,溝通即可能一對一溝通也可能一對多溝通(進行內容協商),無論怎么樣,參加溝通的人數>1,想盡一切一切辦法更快更好的完成相應的任務。

          "協議",無規矩不成方圓,做機密項目之前需要簽署保密協議,找工作要簽"三方協議",三方協議是學校,公司,和個人組成的協議,都是為了讓大家受一定的約束,違反了即有相應的懲罰。

          三方協議

          3 不同版本的HTTP

          HTTP/0.9

          當時網絡資源匱乏,0.9版本相對簡單,采用純文本格式,且設置為只讀,所以當時只能使用"Get"的方式從服務器獲得HTML文檔,響應以后則關閉。如下圖所示

          GET /Mysite.html
          

          響應中只包含了文檔本身。響應內容無響應頭,無錯誤碼,無狀態碼,可以說是"裸奔"。

          <HTML>
          Hello world
          </HTML>
          HTTP/1.0
          

          此時HTTP/0.9請求過程如下

          • 應用層的HTTP建立在傳輸層的TCP之上并運用TCP可靠性等特性,先三次握手建立連接
          • 客戶端請求建立連接(此時只有GET)
          • 服務端響應請求,數據以 ASCII 字符流返回給客戶端
          • 傳輸完成,斷開連接。

          HTTP 0.9

          HTTP1.0

          隨著時代的進步,僅僅文本的傳輸無法滿足需求,更多情況需要采用圖文的方式才能生動的表達出自己的觀點。隨著1995年開發出Apache,同時其他的多媒體等技術發展迅速,從而進一步的促使HTTP新功能的出現。HTTP1.0在1996年誕生,增加了一下幾個方面:

          • 之前只有Get方法,現在增加Post(加參數),Head方法
          • 加入協議版本號,同時添加文件處理類型
          • 加入HTTP Header,讓HTTP處理請求更加靈活
          • 增加響應狀態碼,標記出錯的原因
          • 提供國際化(不同語言)支持

          典型的請求過程

          GET /image.html HTTP/1.0
          User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64)
          
          200 OK
          Date: Tue, 17 Nov 2020 09:15:31 GMT
          Content-Type: text/html
          <HTML> 
          一個包含圖片的頁面
            <IMG SRC="/image.gif">
          </HTML>
          

          HTTP1.0通信過程

          HTTP1.0

          HTTP /1.1

          1995年是不平凡的一年,網景公司和微軟開啟瀏覽器大戰,誰都想當老大。1999年HTTP/1.1發布并成為標準,寫入RFC,以為以后不管是網關還是APP等,只要你要使用HTTP,就得遵守這個標準。

          • 繼續增加了PUT等方法
          • 允許持久連接

          隨著文件越來越大,圖片等信息越來越復雜,如果每一次上傳下載文件都需要建立連接斷開連接的過程將增加大量的開銷。為此,提出了持久連接,也就是一次TCP連接可以具有多個HTTP請求。當然持久連接是可選擇的,如果考慮關閉,只需要使用Connecttion:close關閉即可。長連接如下圖所示

          長連接

          • 強制要求Host頭

          我們知道,在電商系統中,經常會因為促銷活動導致流量飆升,為了緩解流量,其中有種方法即加緩存或者加服務器。如果是單臺服務器負載過大,數據庫可能分庫分表。數據結構算法中分而治之方法亦是如此。那么HTTP中,同樣的道理,如果文件太大,就大文件切分為小文件塊發送。

          HTTP /2

          HTTP/1.1的出現,幾年間出來大量牛掰的互聯網公司,發展實在是太快,但是HTTP1.1中這幾點成為詬病

          • 原因1 TCP自帶慢啟動

          顧名思義,"慢啟動"從0到1循循漸進。轎車啟動不會按下按鈕就直接起飛,而是緩慢調節到適合的速度。這不是挺好的?為什么會帶來性能問題呢。我們知道一個頁面有靜態數據,動態頁面,很多小文件在加載的過程中就會直接發起請求,這樣導致太多的請求都會經歷慢啟動過程,花費時間太多。

          • 原因2 多條TCP連接帶寬競爭

          帶寬固定,多條TCP連接同時發起競爭帶寬資源,由于各個TCP連接之間沒有通信機制,也無法得知哪些資源優先級更高,從而導致想快速下載的資源反而延遲下載。

          • 原因3 頭部阻塞

          阻塞,在網絡編程中,我們采用異步,多路復用(epoll)方式盡量讓cpu少等待多干事。在HTTP1.1中,雖然大家共用了一條TCP通道,但是第一個請求沒有結束,第二請求就可能阻塞等待,也就是說不能同時發送接收數據。那么一個網頁很多數據文件,如果能夠同時發出請求,讓部分數據文件能夠得到響應并預處理,這樣就大大的利用了帶寬和cpu的資源。基于這些因素,在HTTP2中出現了新的方案

          如何解決頭部阻塞呢?

          HTTP是一問一答的模式,大家都在這個隊列排隊導致堵塞,那就多個隊列并發進行,也就是"對同一個域名發起多個長連接"。舉個例子,在火車站排隊買票的時候,如果只有一個窗口可用,大家只能苦等,多開幾個窗口就可緩解這個問題。

          這個時候用戶數 * 并發數(上限6-8)已經不錯得效果,但是互聯網速度太快,火車站就這么大,窗口也就這么多,怎么辦,建新的火車站進行分流(大部分城市都有什么東站 西站)。在這里叫做"域名分片",使用多個域名,這些域名指向同一服務器。

          HTTP/3

          HTTP/2看似很完美了吧,但是Google輪子哥可不服,其他人在研究HTTP/2的時候,它們就在琢磨QUIC。那QUIC有啥牛掰的地方呢

          QUIC是Google開發的一個基于UDP且能像TCP一樣具有可靠性特點的協議。具備像HTTP/2一樣的應用數據二進制分幀傳輸。其主要解決的問題有兩個。

          1. 進一步解決線頭阻塞問題。通過獨立不同流,讓各個流之間實現相互獨立傳輸,互不干擾
          2. 切換網絡時的連接保持。wifi和3G/4G經常需要來回切換。基于TCP的協議,會因為網絡的切換導致IP地址的改變。而基于UDP的QUIC協議,及時切換也可以恢復之前與服務器的連接。(這里推薦大家可以去看看MPTCP)

          4 HTTP報文詳解

          客戶端與服務端進行交互的信息為報文。客戶端為請求報文,服務端為響應報文。我們先用wireshark抓一個博客看看

          報文層次結構

          GET /article/12 HTTP/1.1
          Host: www.xxx.cn
          Connection: keep-alive
          Cache-Control: max-age=0
          Upgrade-Insecure-Requests: 1
          User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.106 Safari/537.36
          Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
          Accept-Encoding: gzip, deflate
          Accept-Language: zh-CN,zh;q=0.9
          Cookie: SESSION=so9nlsvenminor5abs65sh9dsa
          
          HTTP/1.1 200 OK
          Server: nginx
          Date: Sun, 17 May 2020 17:04:29 GMT
          Content-Type: text/html; charset=UTF-8
          Transfer-Encoding: chunked
          Connection: keep-alive
          Vary: Accept-Encoding
          X-Powered-By: blade-2.0.6-BETA
          Content-Encoding: gzip
          

          請求報文

          請求報文

          請求報文通常由三部分組成:

          起始行:描述請求或者響應的基本信息

          頭部字段集合:key-value形式說明報文

          消息正文:實際傳輸諸如圖片等信息。具體如下圖試試

          1 請求方法:一共有八種方法選擇,如下圖所示。采用不同的方法獲取不同的資源

          HTTP請求方法詳解

          說一下非常常見的幾種請求方法

          Get:從服務器中取資源。可以請求圖片,視頻等

          HEAD:和Get類似,但是從服務器請求的資源不會返回請求的實體數據,只會返回響應頭

          POST/PUT:對應于GET,向服務器發送數據

          2 URI

          統一資源標識符(Uniform Resource Identifier),嚴格來說不等于網址,它包含URL和URN,可是URL太出名了以致于URL="網址"。無論開發,測試運維配置都離不開URI,所以好好掌握。

          網絡層的IP主要目的是解決路由和尋址。現在的IP地址按照"."分割,總共2的32次方大約42億。對于計算機來說比較方便,但是對于人類來說還是不容易記憶,此時出現DNS了,他把IP地址映射為我們平時常見的"redis.org",按照"."分割域名,從左到右級別越高,最右邊為"頂級域名"。如下圖所示

          域名體系

          好了,現在TCP提供可靠(數據不丟失)且字節流(數據完整性),而且也有方便我們記憶的域名,但是互聯網資源千萬種,也不知道訪問什么(圖片,文字,視頻一大堆),這個時候URI(統一資源標識符)出現了,那長啥樣?

          URI格式

          協議名:HTTP協議,另外還有ftp等協議。告知訪問資源時使用什么協議。

          緊接著是分隔符:"://"

          主機名:標記互聯網主機,可以是IP也可以是域名,如果不寫端口則使用默認端口,例如HTTP為80,HTTPS為443.

          登錄認證信息:登錄主機時的用戶名密碼(不建議,直接告訴了別人你的隱私信息)

          主機名:此處可以是域名也可以是IP,如果不寫端口號則是默認端口。比如HTTP默認端口為80,HTTPS默認端口為443

          資源所在位置:資源在主機上的位置,使用“/”分隔多級目錄,在這里是“/en/download.html”。注意,必須"/"開頭

          參數:用"?"開始,表示額外的請求要求。通常使用"key=value"的方式存在,如果多個"key=value"則使用"&"相連。

          看幾個例子

          http://nginx.org/en/download.html

          file:///E:/Demo/index/

          這里注意是三個"///",因為前面"://"作為分隔符,資源路徑按照"/"開頭。

          既然規則這么多,對于接收方而言需要完成的解析也需要遵守規則,全球用戶很多使用HTTP,每個國家地區所使用語言不同,HTTP為了能對其進行統一處理,引入了URI編碼,方法比較簡單,將非ASCII或者特殊字符全部轉換為十六進制字節值,同時在前面加入"%"。比如空格被轉換為"%20","中國"就編碼為"%E4%B8%AD%E5%9B%BD%0A"。

          3 請求體

          響應報文

          響應報文

          狀態行----服務器響應的狀態

          <1> 版本號:使用的HTTP什么版本

          <2> 狀態碼:不同數字代表不同的結果,就如我們在編碼時,通過返回不同的值代表不同的語義。

          狀態碼一共分為5類。

          1××:處于中間狀態,還需后續操作

          2××:成功收到報文并正確處理

          "200 OK"

          最常見的成功狀態碼,表示一切正常,客戶端獲得期許的處理結果。如果不是Head請求,那么在響應頭中通常會有body數據。

          "204 No Content"

          這個的含義和"200"很相似,不同之處在于它的響應頭中沒有body數據

          "206 Partial Content"

          是 HTTP 分塊下載或斷點續傳的基礎,在客戶端發送“范圍請求”、要求獲取資源的部分數據時出現,它與 200 一樣,也是服務器成功處理了請求,但 body 里的數據不是資源的全部,而是其中的一部分。狀態碼 206 通常還會伴隨著頭字段“Content-Range”,表示響應報文里 body 數據的具體范圍,供客戶端確認,例如“Content-Range: bytes 0-99/5000”,意思是此次獲取的是總計 5000 個字節的前 100 個字節。

          3××:重定向到其他資源位置

          "301 Moved Permanently"

          “永久重定向”,意思是本地請求的資源以及不存在,使用新的URI再次訪問。

          “302 Found”

          “Moved Temporarily”,“臨時重定向”,臨時則所請求的資源暫時還在,但是目前需要用另一個URI訪問。

          301 和 302 通過在字段Location中表明需要跳轉的URI。兩者最大的不同在于一個是臨時改變,一個是永久改變。舉個例子,有時候需要將網站全部升級為HTTPS,這種永久性改變就需要配置永久的"301"。有時候晚上更新系統,系統暫時不可用,可以配置"302"臨時訪問,此時不會做緩存優化,第二天還會訪問原來的地址。

          “304 Not Modified”

          運用于緩存控制。它用于 If-Modified-Since 等條件請求,表示資源未修改,可以理解成“重定向已到緩存的文件”(即“緩存重定向”)。

          4××:請求報文有誤,服務器無法處理

          "400 Bad Request”

          通用錯誤碼,表示請求報文有錯誤,但是這個錯誤過于籠統。不知道是客戶端還是哪里的錯誤,所以在實際應用中,通常會返回含有明確含義的狀態碼。

          “403 Forbidden”

          注意了,這一個是表示服務器禁止訪問資源。原因比如涉及到敏感詞匯、法律禁止等。當然,如果能讓客戶端有一個清晰的認識,可以考慮說明拒絕的原因并返回即可。

          “404 Not Found”

          這可能是我們都知道且都不想看到的狀態碼之一,它的本意是想要的資源在本地未找到從而無法提供給服務端,但是現在,只要服務器"耍脾氣"就會給你返回 404,而我們也無從得知后面到底是真的未找到,還是有什么別的原因,

          "405 Method Not Allowed"

          獲取資源的方法好幾種,我們可以對某些方法進行限制。例如不允許 POST 只能 GET;

          "406 Not Acceptable"

          客戶端資源無法滿足客戶端請求的條件,例如請求需要中文但只有英文;

          "408 Request Timeout"

          請求超時,服務器等待了過長的時間;

          "409 Conflict":

          多個請求發生了沖突,可以理解為多線程并發時的競態;

          413 Request Entity Too Large:

          請求報文里的 body 太大;

          414 Request-URI Too Long:請求行里的 URI 太大;

          429 Too Many Requests:客戶端發送了太多的請求,
          通常是由于服務器的限連策略;

          431 Request Header Fields Too Large:請求頭某個字
          段或總體太大;

          5××:服務器錯誤,服務器對請求出的時候發生內部錯誤。

          “500 Internal Server Error”

          和400 類似,屬于一個通用的錯誤碼,但是服務器到底是什么錯誤我們不得而知。其實這是好事,盡量少的將服務器資源暴露外網,盡量保證服務器的安全。

          “502 Bad Gateway”

          通常是服務器作為網關或者代理時返回的錯誤碼,表示服務器自身工作正常,訪問后端服務器時發生了錯誤,但具體的錯誤原因也是不知道的。

          “503 Service Unavailable”

          表示服務器當前很忙,暫時無法響應服務,我們上網時有時候遇到的“網絡服務正忙,請稍后重試”的提示信息就是狀態碼 503。

          503 是一個“臨時”的狀態,

          暫時比較忙,稍后提供服務。在響應報文中的“Retry-After”字段,指示客戶端可以在多久以后再次嘗試發送請求。

          4 請求體

          上面大部分都是涉及到header部分,還有非常重要的body,everybody

          頭字段注意事項

          <1> 字段名不區分大小寫,例如“Host”也可以寫成“host”,但首字母大寫的可讀性更好;

          <2> 字段名里不允許出現空格,可以使用連字符“-”,但不能使用下劃線"_"。例如,“test-name”是合法的字段名,而“test name”“test_name”是不正確的字段名;

          <3> 字段名后面必須緊接著“:”,不能有空格,而":"后的字段值前可以有多個空格;

          <4> 字段的順序是沒有意義的,可以任意排列不影響語義;

          <5> 字段原則上不能重復,除非這個字段本身的語義允許,例如 Set-Cookie。

          HTTP的body常常被分為這幾種的類別

          <1> text:超文本text/html,純文本text/plain

          <2> audio/video:音視頻數據

          <3> application: 可能是文本,也可能是二進制,交給上層應用處理

          <4> image: 圖像文件。image/png等

          但是帶寬一定,數據大了通常考慮使用壓縮算法進行壓縮,在HTTP中使用Encoding type表示,常用的壓縮方式有下面幾種

          <1> gzip:

          一種數據格式,默認且目前僅使用deflate算法壓縮data部分

          <2> deflate:

          deflate是一種壓縮算法,是huffman編碼的一種加強

          <3> br:

          br通過變種的LZ77算法、Huffman編碼以及二階文本建模等方式進行數據壓縮,其他壓縮算法相比,它有著更高的壓塑壓縮效率

          使用相應的壓縮方法在帶寬一定的情況下確實有不錯的效果,但是gzip等主要針對文件壓縮效果不錯,但是對視頻就不行了。這個時候是不是可以使用數據結構中常用的分而治之,大化小再合并的方式呢,

          文件拆分

          ok,在報文中使用"Transer-Encoding:chunked"表示,代表body部分數據是分塊傳輸的。另外在body中存在一個content-length字段表示body的長度,兩者不能共存,另外很多時候是流式數據,body中沒有指明content-length,這個時候一般就是chunked傳輸了。

          現在可以通過采用分塊的方式增強帶寬的利用率,那他的編碼規則如何呢

          <1> 每一個分塊包含長度和數據塊

          <2> 長度頭按照CRLF結束

          <3> 數據塊在長度快后,且最后CRLF結尾

          <4> 使用長度0表示結束,"0\r\n\r\n"

          我們還是看圖加深印象

          chunked分塊

          分塊解決了咋們一部分問題,但是有的時候我們想截斷發送怎么辦呢。在HTTP中提供了使用字段“Accept - Ranges: bytes”,明確告知客戶端:“我是支持范圍請求的”。那么Range范圍是怎樣的呢,Range從0開始計算,比如Range:0-5則讀取前6個字節,服務器收到了這個請求,將如何回應呢

          <1> 合法性檢查。比如一共只有20字節,但是請求range:100-200。此時會返回416----"范圍請求有誤"

          <2> 范圍正常,則返回216,表示請求數據知識一部分

          <3> 服務器端在相應投資端增加Content-Range,格式"bytes x-y/length"。

          敲黑板:斷點續傳怎么操作?

          <1> 查看服務器是否支持范圍請求并記錄文件大小

          <2> 多個線程分別負責不同的range

          <3> 下載同時記錄進度,即使因為網絡等原因中斷也沒事,Range請求剩余即可

          現在我們通過MIME-TYPEEncoding-type可以知道body部分的類型,下一步將是對內容進行協商。HTTP中,請求體中使用Accept告訴服務端需要什么類型數據(我能處理哪些類型數據),響應頭中使用Content表明發送了什么類型數據,具體如下圖所示

          好了,為了各個國家民族順利友好的溝通和明確的區分。HTTP請求頭中使用"type-subtype",注意此時分隔符是"-"。比如en-GB表示英式英語,zh-CN表示常用的漢語,那對于客戶端而言,它通過Accept-Language來標記自己可以理解的自然語言,對應的服務端使用Content-Language表明實體數據使用的語言類型,如下圖所示。

          字符集和編碼

          Cookie機制

          HTTP是無狀態、無記憶的,Cookie機制的出現讓其有記憶功能,是怎么個實現呢

          Cookie

          從上圖我們可以知道Cookie是由瀏覽器負責存儲,并不是操作系統負責,我們換個瀏覽器打開同樣的網頁,服務就認不出來了。

          Cookie常見的應用一個是身份識別,一個是廣告追蹤,比如我們在訪問網頁視頻或者圖片的時候,廣告商會悄悄給我們Cookie打上標記,方便做關聯分析和行為分析,從而給我推薦一些相關內容。

          HTTP代理

          之前介紹的都是一問一答的情景,但是在大部分的情況下都會存在多臺服務器進行通信服務。其中比較常見的就是在請求方與應答方中間增加一個中間代理。

          代理

          代理作為中間位置,相對請求方為服務端,相當于后端服務端為請求方。代理常見的功能為負載均衡。在負載均衡中需要區分正向代理與反向代理,其中也就會涉及調度算法,比如輪詢,一致性哈希等。

          正向代理與反向代理

          那么問題來了,代理作為隱藏身份,相當于隱藏了真實的客戶端與服務端,那在是不是

          5 HTTPS

          好人占多數,壞人也不少。總有些要搞壞事,因為HTTP是明文,所以需要想辦法保護明文,從而出現了https。

          安全是什么

          安全四要素

          機密性

          對信息進行保密,只能可信的人可以訪問(讓我想起時間管理者)。

          完整性

          數據在傳輸過程中內容不被"篡改"。雖然機密性對數據進行保密了,但是有上策也有下策(hack)

          身份認證

          證明自己的身份是本人,保證其消息發給可信的人

          不可否認

          君子一言駟馬難追,說話算數,說過的話做過的事要有所保證

          HTTPS

          HTTP和HTTPS

          從上圖我們知道HTTPS無非是在傳輸層和應用層中間加了一層TLS,正是TLS緊跟當代密碼學的步伐,盡全力的保障用戶的安全。老規矩,我們用wireshark看看長什么樣子。

          TLS

          可以看出在交互的過程中多了不少新東西,了解TLS,TLS由SSL握手協議,SSL修改密碼規范協議,SSL警報協議,SSL記錄協議組成。

          TLS組成

          SSL握手協議:

          相對于三次握手

          記錄協議

          記錄為TLS發送接收數據的基本單位。它的自協議需要通過記錄協議發出。如果多個紀錄數據則可以一個TCP包一次性發出。

          警報協議

          類似HTTP狀態碼,通過反饋不同的消息進行不同的策略。

          變更密碼規范協議

          告訴對方,從此刻開始,后續的數據將使用加密算法進行加密再傳輸。

          對稱加密與非對稱加密

          對稱加密

          對稱加密,顧名思義,加密方與解密方使用同一鑰匙(秘鑰)。具體一些就是,發送方通過使用相應的加密算法和秘鑰,對將要發送的信息進行加密;對于接收方而言,使用解密算法和相同的秘鑰解鎖信息,從而有能力閱讀信息。

          對稱加密

          非對稱加密

          在對稱加密中,發送方與接收方使用相同的秘鑰。那么在非對稱加密中則是發送方與接收方使用的不同的秘鑰。其主要解決的問題是防止在秘鑰協商的過程中發生泄漏。比如在對稱加密中,小藍將需要發送的消息加密,然后告訴你密碼是123balala,ok,對于其他人而言,很容易就能劫持到密碼是123balala。那么在非對稱的情況下,小藍告訴所有人密碼是123balala,對于中間人而言,拿到也沒用,因為沒有私鑰。所以,非對稱密鑰其實主要解決了密鑰分發的難題。如下圖

          非對稱加密

          其實我們經常都在使用非對稱加密,比如使用多臺服務器搭建大數據平臺hadoop,為了方便多臺機器設置免密登錄,是不是就會涉及到秘鑰分發。再比如搭建docker集群也會使用相關非對稱加密算法。

          混合加密

          非對稱加密算法,大多數是從數學問題演變而來,運算速度較慢。混合加密所謂取長補短。通信過程中使用RSA等解決密鑰交換問題,然后使用隨機數產生的在對稱算法中的會話密鑰,最后使用加密。對方使用私鑰解密得到的密文取出會話秘鑰,這樣就實現了密鑰交換。

          混合加密

          通過混淆加密等方式完成了機密性任務,作為Hack只需要偽造發布公鑰或者作為之間人竊聽密文。但是我們知道安全是四要素,還需要保證數據的完整性,身份認證等。

          摘要

          摘要算法可以理解為一種特殊的"單向"加密算法,無密鑰,不可逆。在平時項目中,應該大家都是用過MD5,SHA-1。但是在TLS中使用SHA-2。

          假設小A轉賬5000給小C,小A加上SHA-2摘要。網站計算摘要并對比,如果一致則完整可信。

          摘要可信

          此時小B想修改小A給的money,這個時候網站計算摘要就會發現不一樣,不可信

          摘要不可信

          HTTPS請求建立連接過程

          HTTP握手過程

          注意:

          1. 首先通過非對稱加密建立通信過程
          2. 在握手階段,為什么使用3個隨機數,一方面防止「隨機數 C」被猜出,另一方增加Session key隨機性
          3. Client發出支持的「對稱/非對稱加密」算法
          4. server返回選用的「對稱/非對稱加密」算法
          5. Client對算法進行確認
          6. Server對算法進行確認

          根據wireshak結果,對TLS進一步剖析。TCP三次握手建立連接,作為禮貌,Client先打招呼"Client Hello"。里面包含了Client的版本號所支持的密碼套件和隨機數,如下圖所示

          Client Hello

          Server端表示尊重,回復"Server Hello",同時進行版本校對,給出隨機數(Server Random),從Client算法列表中選擇一個密碼套件,在這里選擇的"TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"。

          cipher Suite

          這里的"TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"什么意思呢

          密碼套件選擇橢圓曲線加RSA、AES、SHA256

          雙方通過證書驗證身份。因為本機服務器選用了ECDHE算法,為了實現密鑰交換算法,它會發送證書后把橢圓曲線的公鑰(Server Params)連帶"Server Key Exchange"消息發送出去。

          Server Key Exchange

          意思是,剛才混合加密套件比較復雜,給你個算法參數,好好記住,別弄丟了。

          ServerHelloDone

          隨后服務端回復"hello done"告知打招呼完畢

          打完招呼完畢后,客戶端對證書進行核實。然后根據密碼套件也生成橢圓曲線的公鑰,用"Client Key Exchange"消息發給服務器

          Client Key Exchange

          此時客戶端和服務端都有了密鑰交換的兩個參數(Client Params、ServerParams),然后通過 ECDHE 算法算出了一個新的值,叫“Pre-Master”

          有了主密鑰會話密鑰,客戶端發送“Change Cipher Spec”和“Finished”消息,最后將所有消息加上摘要發送給服務器驗證。

          服務器同樣發送“Change Cipher Spec”和“Finished”消息,握手結束,開始進行HTTP請求與響應

          4 初探域名

          我們知道域名的出現讓我們更容易記憶,按照"."分割,越靠近右邊級別越高。域名本質是一個名字空間系統,采用多級域名的方式區分不同的國家,公司等,作為一種身份的標識。

          根域名服務器(Root DNS Server):管理頂級域名服務器,返回“com”“net”“cn”等頂級域名服務器的 IP 地址;

          頂級域名服務器(Top-level DNS Server):管理各自域名下的權威域名服務器,比如
          com 頂級域名服務器可以返回 apple.com 域名服務器的 IP 地址;

          權威域名服務器(Authoritative DNS Server):管理自己域名下主機的 IP 地址,比如apple.com 權威域名服務器可以返回 www.apple.com 的 IP 地址**

          6 HTTP特點小結

          寫到這里,說它簡單是假的,簡單的東西通常更具有擴展的可能性。根據需求的變更,越來越復雜。

          1:靈活且易擴展,他的頭部字段很多都是可定制且可擴展

          2:應用廣泛。各個領域都有涉及。"跨平臺,跨語言"

          3:無狀態。沒有記憶功能,少功能即少占用資源。另外無狀態更容易搭建集群,通過負載均衡將請求轉發到任意一臺服務器。缺點是無法支持需要連續步驟的"事務"操作。我們知道TCP協議有11種狀態,不同狀態代表通信過程中不同的含義。同樣操作系統中的進程也有執行,就緒,活動阻塞等多種狀態。但是HTTP全程都是"懵逼"無狀態。比如小華請求服務器獲取視頻X,服務器覺得可行就發給小華。小華還想獲取視頻Y,這時服務器不會記錄之前的狀態,也就不知道這兩個請求是否是同一個,所以小華還得告訴服務器自己的身份。

          4:明文。優點是能讓開發人員通過wireshark工具更直觀的調試。缺點即裸奔互聯網,沒隱私可言。

          5:可靠傳輸。HTTP為應用層協議,基于TCP/IP,而TCP為“可靠”傳輸協議,因此HTTP能在請求應答中"可靠"傳輸數據。

          6:應用層協議。應用層協議很多,其中常用的郵件協議SMTP,上傳下載文件ftp,默認端口22/23,SSH遠程登錄(XSHELL)。這些應用層協議都太專一,而HTTP通過各種頭部字段,實體數據的組合,并綜合緩存代理等功能,不得不說是網絡中的冠希哥

          7 HTTP識別(還原)

          這里說的識別,通過代碼層面(libpcap封裝)實現HTTP的識別,也能進一步體現TCP/IP協議棧的分層特性。先看回憶一下IP頭部格式。

          IP頭部

          注意頭部中的協議字段,如果此字段值為0x0600則為TCP分組。當知道了是TCP分組后,是不是可以通過TCP頭部中端口(80)就可以判斷為HTTP呢,不能的,很多情況都會使用動態端口的方式進行部署。此時可以通過HTTP中的關鍵字進行判斷。如果為HTTP,再通過頭部字段中的"Content-type"charset等確認文本信息,編碼方式,最后采用解碼算法進行還原。

          8 HTTPS(密文)識別

          方法一也是比較直接的方法是直接通過抓包工具,插件配置即可。這里想給大家分享另一種思路和在Linux持續捕包的方法。

          • 數據集采集

          使用python的dpkt庫(pip install dpkt即可),dpkt庫方便對每一層協議進行拆解,同時也能進行流的拆分以及特征的提取。下面舉一個通過無頭瀏覽的方式自動化采集流量(ps如果需要較大規模的流量采集則可以考慮使用docker集群的方式)

          Read_pcap

          • 根據所提特征生成npz(實際上是numpy提供的數組存儲方式)
          • 使用開源skearn庫進行模型訓練并識別預測,此處假設使用SVM(僅使用默認參數)

          SVM

          • 識別結果(參數進行適度調整定會更好的效果)

          識別結果

          9 HTTP面試題測試

          希望大家看完本文,下面的這些面試是不是可以秒殺了

          • Get和Post區別
          • HTTP與HTTPS區別
          • HTTP通信過程
          • 游覽器輸入一個地址。到頁面展示中間經歷了哪些步驟?
          • cookies機制和session機制的區別:
          • HTTP請求報文與響應報文格式
          • 一次完整的HTTP請求所經歷的7個步驟
          • HTTP優化方案
          • 不同版本的HTTP區別
          • HTTP優點缺點
          • URI和URL的區別
          • 如何判斷是否為http
          • HTTP 1.1引入分塊傳輸編碼提供了以下幾點好處
          • 長連接與短連接的區別,以及應用場景
          • 常見web攻擊
          • 站內跳轉和外部重定向有何區別
          • HTTP的keep-alive是干什么的?
          • 關于Http 2.0 你知道多少?
          • 講講304緩存的原理
          • HTTP與RPC異同
          • 從傳輸協議來說

          RPC既可以基于TCP也可以基于HTTP協議,但是HTTP通常都是基于HTTP

          • 從性能消耗來說

          RPC可以基于thrift實現高效二進制傳輸。HTTP大部分通過json實現,無論從字節大小還是序列化耗時都比t'hrift耗時

          • 從負載均衡來說

          RPC基本上自帶負載均衡策略,而HTTP需要配置Nginx實現。

          天,Google Chrome 103 發布了,其中包含一系列新功能。 值得注意的功能之一就是HTTP狀態碼103的引入。順便說一下,http 103狀態碼跟chrome 103版本不是一回事。

          來自Mozilla Developer Network文檔,HTTP 103 Early Hints是信息響應狀態代碼,主要用于與Link標頭一起使用,以允許用戶在服務器仍在準備響應時開始預加載資源。HTTP 103 可用于通過使用鏈接 rel=preload 配置 HTTP 標頭字段來優化頁面速度。

          如何工作?

          通常,當瀏覽器發送請求時,服務器會立刻接收并處理請求,然后發送 HTTP 200 OK 響應,如下所示。

          使用 HTTP 103 Early Hints,頁面渲染速度還有提升空間。

          一旦服務器更新了 HTTP 103,當瀏覽器發送請求時,如果服務器知道請求內容中需要 style.css 或 script.js 等資源,那么它會提前用 HTTP 103 Hint(響應)提示瀏覽器去預加載一些內容,如下所示。

          比正常直接返回多加了上面這個103 Hint過程

          103提示完成之后,它將向瀏覽器發送正常的 HTTP 200 OK。當瀏覽器預先加載內容時,此過程將有助于提高頁面渲染速度。

          如上所述,此功能需要更新服務器。請自行查看如何配置對應的Web服務器來啟用它。

          這個103提示僅適用于 HTTP/2 和 HTTP/3。

          它僅支持 200、301、304 響應返回碼。

          此外,它適用于具有 preconnect 或 preload rel 類型的響應鏈接標頭。

          看下圖的例子,curl了一個頁面,開始它先返回了103代碼和一些需要preload的資源,這時候,瀏覽器不需要等待請求完全返回就可以開始加載它們。然后服務器200正常返回請求的資源,這就是為什么可以提高渲染速度。

          結論

          正如您所了解的,HTTP 103 早期提示通過提示瀏覽器預加載資源來幫助優化頁面呈現時間。


          主站蜘蛛池模板: 亚洲AV无码国产一区二区三区| 国产伦精品一区二区三区免.费 | 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 无码精品前田一区二区| 青娱乐国产官网极品一区| 无码人妻一区二区三区在线水卜樱 | 成人精品一区二区三区电影| 无码国产精品一区二区免费vr | 日本中文字幕在线视频一区| 国产日韩一区二区三区| 久久精品一区二区东京热| 真实国产乱子伦精品一区二区三区| 亚洲精品伦理熟女国产一区二区| 亚洲日韩精品一区二区三区无码 | 亚洲一区二区三区高清视频| 亚洲色精品aⅴ一区区三区| 精品国产一区二区22| 亚洲一区二区高清| 亚洲午夜日韩高清一区| 色一情一乱一伦一区二区三区日本| 精品久久综合一区二区| 天堂一区二区三区在线观看| 亚洲日韩国产欧美一区二区三区 | 日韩精品免费一区二区三区| 在线成人一区二区| 中文字幕精品一区二区2021年 | 欧洲精品码一区二区三区免费看| 麻豆AV天堂一区二区香蕉 | 乱色精品无码一区二区国产盗| 国产免费无码一区二区| 国产AV午夜精品一区二区入口| 亚洲A∨无码一区二区三区| 国产免费一区二区视频| 亚洲午夜电影一区二区三区| 亚洲一区二区三区免费视频| 欧美一区内射最近更新| 国产人妖在线观看一区二区| 国产精久久一区二区三区| 精品亚洲一区二区| 国产精品香蕉一区二区三区| 日本精品一区二区三区视频|