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
注我的微信公眾號:后端技術漫談
不定期推送關于后端開發、爬蟲、算法題、數據結構方面的原創技術文章,以及生活中的逸聞趣事。
我目前是一名后端開發工程師。主要關注后端開發,數據安全,網絡爬蟲,物聯網,邊緣計算等方向。
原創博客主要內容
image
本文快速回顧了常考的的知識點,用作面試復習,事半功倍。
上篇主要內容: 狀態碼、Http1.0/1.1/2.0、Https、GET和POST
下篇主要內容: Web攻擊技術、HTTP基礎概念、HTTP Header詳解、HTTP應用
全復習手冊文章導航
Csdn全復習手冊文章導航:
https://blog.csdn.net/qqxx6661/article/details/86775594
已發布知識點復習手冊
本文內容主要參考來自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 信息
2XX 成功
3XX 重定向
4XX 客戶端錯誤
5XX 服務器錯誤
參考:
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的原始服務器或網關的位置。)
支持分塊傳輸編碼
HTTP1.0中,存在一些浪費帶寬的現象,例如客戶端只是需要某個對象的一部分,而服務器卻將整個對象送過來了,并且不支持斷點續傳功能,HTTP1.1則在請求頭引入了range頭域,它允許只請求資源的某個部分,即返回碼是206(Partial Content),這樣就方便了開發者自由的選擇以便于充分利用帶寬和連接。
另一種解釋:可以把數據分割成多塊,讓瀏覽器逐步顯示頁面。
錯誤通知的管理/新增狀態碼
在HTTP1.1中新增了24個錯誤狀態響應碼,如:
緩存處理(協商緩存)
在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 實現簡單是以犧牲性能為代價的:
二進制分幀層
HTTP/2.0 將報文分成 HEADERS 幀和 DATA 幀,它們都是二進制格式的。
在通信過程中,只會有一個 TCP 連接存在,它承載了任意數量的雙向數據流(Stream)。
在這里插入圖片描述
和1.1區別在于:
在這里插入圖片描述
在這里插入圖片描述
二進制分幀:多路復用(MultiPlexing)
即連接共享,即每一個request都是是用作連接共享機制的。一個request對應一個id,這樣一個連接上可以有多個request,每個連接的request可以隨機的混雜在一起,接收方可以根據request的 id將request再歸屬到各自不同的服務端請求里面。
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的區別
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認證
請看下面加黑字體是重點:
在這里插入圖片描述
客戶端:
在這個過程注意幾點:
HTTPs認證后的傳輸
HTTPs 采用混合的加密機制,使用公開密鑰加密用于傳輸對稱密鑰來保證安全性,之后使用對稱密鑰加密進行通信來保證效率。(下圖中的 Session Key 就是對稱密鑰)
在這里插入圖片描述
完整性保護
SSL 提供報文摘要功能來進行完整性保護。
HTTP 也提供了 MD5 報文摘要功能,但是卻不是安全的。例如報文內容被篡改之后,同時重新計算 MD5 的值,通信接收方是無法意識到發生篡改。
HTTPs 的報文摘要功能之所以安全,是因為它結合了加密和認證這兩個操作。試想一下,加密之后的報文,遭到篡改之后,也很難重新計算報文摘要,因為無法輕易獲取明文。
HTTPs 的缺點
作用
GET 用于獲取資源,而 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
安全
安全的 HTTP 方法不會改變服務器狀態,也就是說它只是可讀的。GET 方法是安全的,而 POST 卻不是
因為 POST 的目的是傳送實體主體內容,這個內容可能是用戶上傳的表單數據,上傳成功之后,服務器可能把這個數據存儲到數據庫中,因此狀態也就發生了改變。
安全的方法除了 GET 之外還有:HEAD、OPTIONS。
不安全的方法除了 POST 之外還有 PUT、DELETE。
冪等性
冪等的 HTTP 方法,同樣的請求被執行一次與連續執行多次的效果是一樣的,服務器的狀態也是一樣的。
GET,HEAD,PUT 和 DELETE 等方法都是冪等的,
而POST 方法不是。所有的安全方法也都是冪等的。
可緩存
XMLHttpRequest
為了闡述 POST 和 GET 的另一個區別,需要先了解 XMLHttpRequest:
XMLHttpRequest 是一個 API,它為客戶端提供了在客戶端和服務器之間傳輸數據的功能。它提供了一個通過 URL 來獲取數據的簡單方式,并且不會使整個頁面刷新。這使得網頁只更新一部分頁面而不會打擾到用戶。XMLHttpRequest 在 AJAX 中被大量使用。
在使用 XMLHttpRequest 的 POST 方法時,瀏覽器會先發送 Header 再發送 Data。
但并不是所有瀏覽器會這么做,例如火狐就不會。而 GET 方法 Header 和 Data 會一起發送。
我是一名后端開發工程師。主要關注后端開發,數據安全,網絡爬蟲,物聯網,邊緣計算等方向,歡迎交流。
各大平臺都可以找到我
原創博客主要內容
個人公眾號:后端技術漫談
如果文章對你有幫助,不妨收藏起來并轉發給您的朋友們~
下文章來源于一口LINUX
我是程序員小賤
從面試出發,解剖各個知識點,讓我們向上成長!這里除了學習,還有音樂,生活攝影,籃球等,期待你的加入!
本文將從以下幾個方面進行分享。其中包括HTTP發展史,HTTP緩存代理機制,常用的web攻擊,HTTP和HTTPS的流量識別,網絡協議學習的工具推薦以及高頻HTTP與HTTPS的高頻面試題題解等,開工。
提綱
1989年,蒂姆·伯納斯 - 李(Tim Berners-Lee)在論文中提出可以在互聯網上構建超鏈接文檔,并提出了三點.
URI:統一資源標識符。互聯網的唯一ID
HTML:超文本文檔
HTTP:傳輸超文本的文本傳輸協議
學習一門知識,采用五分鐘時間看看這個知識是干啥的可能會更加有目的性。HTTP可謂無處不在,這里例舉出幾個。
HTTP應用場景
HTTP(hypertext transport protocol)翻譯過來為"超文本傳輸協議",文本可以理解為簡單的字符文字組合,也可以理解為更為復雜的音頻或者圖像等。那么將這個詞語拆分為三個部分。
超文本傳輸協議
"超文本"和"文本"相比多了一個字"超",這樣看來比文本豐富,因為它可以將多種文本/圖像等進行混合,更重要的是可以從一個文本跳轉到另一個文本(文本連接)。
"傳輸",傳輸的過程中需要溝通,溝通即可能一對一溝通也可能一對多溝通(進行內容協商),無論怎么樣,參加溝通的人數>1,想盡一切一切辦法更快更好的完成相應的任務。
"協議",無規矩不成方圓,做機密項目之前需要簽署保密協議,找工作要簽"三方協議",三方協議是學校,公司,和個人組成的協議,都是為了讓大家受一定的約束,違反了即有相應的懲罰。
三方協議
HTTP/0.9
當時網絡資源匱乏,0.9版本相對簡單,采用純文本格式,且設置為只讀,所以當時只能使用"Get"的方式從服務器獲得HTML文檔,響應以后則關閉。如下圖所示
GET /Mysite.html
響應中只包含了文檔本身。響應內容無響應頭,無錯誤碼,無狀態碼,可以說是"裸奔"。
<HTML>
Hello world
</HTML>
HTTP/1.0
此時HTTP/0.9請求過程如下
HTTP 0.9
HTTP1.0
隨著時代的進步,僅僅文本的傳輸無法滿足需求,更多情況需要采用圖文的方式才能生動的表達出自己的觀點。隨著1995年開發出Apache,同時其他的多媒體等技術發展迅速,從而進一步的促使HTTP新功能的出現。HTTP1.0在1996年誕生,增加了一下幾個方面:
典型的請求過程
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,就得遵守這個標準。
隨著文件越來越大,圖片等信息越來越復雜,如果每一次上傳下載文件都需要建立連接斷開連接的過程將增加大量的開銷。為此,提出了持久連接,也就是一次TCP連接可以具有多個HTTP請求。當然持久連接是可選擇的,如果考慮關閉,只需要使用Connecttion:close關閉即可。長連接如下圖所示
長連接
我們知道,在電商系統中,經常會因為促銷活動導致流量飆升,為了緩解流量,其中有種方法即加緩存或者加服務器。如果是單臺服務器負載過大,數據庫可能分庫分表。數據結構算法中分而治之方法亦是如此。那么HTTP中,同樣的道理,如果文件太大,就大文件切分為小文件塊發送。
HTTP /2
HTTP/1.1的出現,幾年間出來大量牛掰的互聯網公司,發展實在是太快,但是HTTP1.1中這幾點成為詬病
顧名思義,"慢啟動"從0到1循循漸進。轎車啟動不會按下按鈕就直接起飛,而是緩慢調節到適合的速度。這不是挺好的?為什么會帶來性能問題呢。我們知道一個頁面有靜態數據,動態頁面,很多小文件在加載的過程中就會直接發起請求,這樣導致太多的請求都會經歷慢啟動過程,花費時間太多。
帶寬固定,多條TCP連接同時發起競爭帶寬資源,由于各個TCP連接之間沒有通信機制,也無法得知哪些資源優先級更高,從而導致想快速下載的資源反而延遲下載。
阻塞,在網絡編程中,我們采用異步,多路復用(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一樣的應用數據二進制分幀傳輸。其主要解決的問題有兩個。
客戶端與服務端進行交互的信息為報文。客戶端為請求報文,服務端為響應報文。我們先用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-TYPE和Encoding-type可以知道body部分的類型,下一步將是對內容進行協商。HTTP中,請求體中使用Accept告訴服務端需要什么類型數據(我能處理哪些類型數據),響應頭中使用Content表明發送了什么類型數據,具體如下圖所示
好了,為了各個國家民族順利友好的溝通和明確的區分。HTTP請求頭中使用"type-subtype",注意此時分隔符是"-"。比如en-GB表示英式英語,zh-CN表示常用的漢語,那對于客戶端而言,它通過Accept-Language來標記自己可以理解的自然語言,對應的服務端使用Content-Language表明實體數據使用的語言類型,如下圖所示。
字符集和編碼
Cookie機制
HTTP是無狀態、無記憶的,Cookie機制的出現讓其有記憶功能,是怎么個實現呢
Cookie
從上圖我們可以知道Cookie是由瀏覽器負責存儲,并不是操作系統負責,我們換個瀏覽器打開同樣的網頁,服務就認不出來了。
Cookie常見的應用一個是身份識別,一個是廣告追蹤,比如我們在訪問網頁視頻或者圖片的時候,廣告商會悄悄給我們Cookie打上標記,方便做關聯分析和行為分析,從而給我推薦一些相關內容。
HTTP代理
之前介紹的都是一問一答的情景,但是在大部分的情況下都會存在多臺服務器進行通信服務。其中比較常見的就是在請求方與應答方中間增加一個中間代理。
代理
代理作為中間位置,相對請求方為服務端,相當于后端服務端為請求方。代理常見的功能為負載均衡。在負載均衡中需要區分正向代理與反向代理,其中也就會涉及調度算法,比如輪詢,一致性哈希等。
正向代理與反向代理
那么問題來了,代理作為隱藏身份,相當于隱藏了真實的客戶端與服務端,那在是不是
好人占多數,壞人也不少。總有些要搞壞事,因為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握手過程
注意:
根據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 地址**
寫到這里,說它簡單是假的,簡單的東西通常更具有擴展的可能性。根據需求的變更,越來越復雜。
1:靈活且易擴展,他的頭部字段很多都是可定制且可擴展
2:應用廣泛。各個領域都有涉及。"跨平臺,跨語言"
3:無狀態。沒有記憶功能,少功能即少占用資源。另外無狀態更容易搭建集群,通過負載均衡將請求轉發到任意一臺服務器。缺點是無法支持需要連續步驟的"事務"操作。我們知道TCP協議有11種狀態,不同狀態代表通信過程中不同的含義。同樣操作系統中的進程也有執行,就緒,活動阻塞等多種狀態。但是HTTP全程都是"懵逼"無狀態。比如小華請求服務器獲取視頻X,服務器覺得可行就發給小華。小華還想獲取視頻Y,這時服務器不會記錄之前的狀態,也就不知道這兩個請求是否是同一個,所以小華還得告訴服務器自己的身份。
4:明文。優點是能讓開發人員通過wireshark工具更直觀的調試。缺點即裸奔互聯網,沒隱私可言。
5:可靠傳輸。HTTP為應用層協議,基于TCP/IP,而TCP為“可靠”傳輸協議,因此HTTP能在請求應答中"可靠"傳輸數據。
6:應用層協議。應用層協議很多,其中常用的郵件協議SMTP,上傳下載文件ftp,默認端口22/23,SSH遠程登錄(XSHELL)。這些應用層協議都太專一,而HTTP通過各種頭部字段,實體數據的組合,并綜合緩存代理等功能,不得不說是網絡中的冠希哥。
這里說的識別,通過代碼層面(libpcap封裝)實現HTTP的識別,也能進一步體現TCP/IP協議棧的分層特性。先看回憶一下IP頭部格式。
IP頭部
注意頭部中的協議字段,如果此字段值為0x0600則為TCP分組。當知道了是TCP分組后,是不是可以通過TCP頭部中端口(80)就可以判斷為HTTP呢,不能的,很多情況都會使用動態端口的方式進行部署。此時可以通過HTTP中的關鍵字進行判斷。如果為HTTP,再通過頭部字段中的"Content-type",charset等確認文本信息,編碼方式,最后采用解碼算法進行還原。
方法一也是比較直接的方法是直接通過抓包工具,插件配置即可。這里想給大家分享另一種思路和在Linux持續捕包的方法。
使用python的dpkt庫(pip install dpkt即可),dpkt庫方便對每一層協議進行拆解,同時也能進行流的拆分以及特征的提取。下面舉一個通過無頭瀏覽的方式自動化采集流量(ps如果需要較大規模的流量采集則可以考慮使用docker集群的方式)
Read_pcap
SVM
識別結果
希望大家看完本文,下面的這些面試是不是可以秒殺了
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 早期提示通過提示瀏覽器預加載資源來幫助優化頁面呈現時間。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。