優(yōu)化知識之快速掌握HTTP協(xié)議讓協(xié)議更友好
2019-05-14
HTTP 協(xié)議極其龐雜,它影響著瀏覽器、爬蟲、代理服務器、防火墻、CDN、Web 容器、微服務等諸多方面,自身的規(guī)范卻并不統(tǒng)一,所要面對的各類軟件的新舊版本也同時存在于網(wǎng)絡上。在這種情況下,如果對 HTTP 沒有一個深入的理解,就很容易被各種各樣的網(wǎng)絡問題難倒。
那么,如何才能快速掌握HTTP協(xié)議呢?
在我看來,需要從以下四個方面入手:
工欲善其事,必先利其器,首先我們先要掌握好抓包及相關的工具,這樣在分析各種網(wǎng)絡協(xié)議時也就更加得心應手。
先從架構入手,搞清楚 HTTP 協(xié)議到底想解決什么問題,面臨哪些非功能性的約束,又是怎樣一步步發(fā)展變遷至今的。
熟悉協(xié)議格式,對隧道或者正向代理下的 URI 格式、對多表述包體和不定長包體的傳輸格式要了解,對 DNS 的 QUESTION/ANSWER 也要了解。
掌握應用場景,跨域訪問與同源策略到底在糾結什么?代理服務器上的共享緩存如何精細化控制?
先給大家分享我整理的 HTTP 學習知識圖譜,你可以收藏起來,時不時地拿出來對照:
(高清圖看這篇:http://note.youdao.com/noteshare?id=56e65085e89f449feb5804a887dbf058&sub=68510F5CB15E46C6BFA7021506A65330)
下面,我們來一一詳述這四個方面。
1、用好工具
學好HTTP協(xié)議,至少要用到下面4個工具:
1.1 Chrome Network抓包面板
這個工具有4個優(yōu)點:
快速分析HTTP請求
便捷卸載TLS/SSL內(nèi)容
可協(xié)助分析頁面加載性能
方便分析websocket內(nèi)容
該工具包含5個面板,在過濾器的Filter輸入欄中還支持復雜的屬性過濾,在請求列表中可以看到請求的上下游,亦能看到每個請求的時間分布。
1.2 telnet
這個小工具主要用于構造原始的應用層協(xié)議,幫助我們理解HTTP實際在網(wǎng)絡中傳輸?shù)母袷绞鞘裁礃拥摹?/p>
1.3 curl
telnet有2個問題:
1、太過繁瑣,每次要輸入完整的請求。實際我們可能只是想改一下方法或者某個HEADER頭部。
2、不支持HTTPS,不支持包體壓縮,導致無法向某些站點發(fā)起請求。
而curl完美解決了這些問題。它也用于構造定制化的HTTP請求,并可以分析HTTP響應頭部或者包體。
1.4 Wireshark
這是學習完整Web協(xié)議棧的必備工具,我們可以在服務器端用tcpdump抓包后,在可視化的Wireshark上便捷分析。
Wireshark功能極為強大:
既支持BPF捕獲過濾器,也支持分析時的顯示過濾器;
通過流跟蹤或者會話圖標,我們可以輕松的以session會話為單位進行分析;
通過可配置的著色規(guī)則,但以不同的色彩幫助我們輕松找出有問題的報文;
通過報文的標注及導出,以及文件的合并、時間的平移,可以輕松將多臺機器上的抓到的報文放在一起分析對比;
既可以通過Packet Detail中看到每層報文解析出的可讀值,也能在Packet Byte中看到二進制流。
支持報文統(tǒng)計,對大量HTTP報文的分析非常方便!
2、理解架構
要理解HTTP的架構,需要從以下4個方面入手:
2.1 HTTP協(xié)議想解決什么問題?
HTTP協(xié)議設計之初用于解決人與機器間的通訊,所謂“B/S架構”中的瀏覽器是我們必須考慮進的因素。
因此,HTTP協(xié)議需要傳輸超媒體數(shù)據(jù)(包括圖片、視頻等大粒度數(shù)據(jù))。
當然,現(xiàn)在許多物聯(lián)網(wǎng)中的設備也在使用HTTP協(xié)議,所以,它也在解決機器與機器間的通訊。
當然,網(wǎng)絡爬蟲也是HTTP協(xié)議要面對的問題,robots.txt這樣的規(guī)范也應運而生。
2.2 HTTP協(xié)議面對哪些非功能性約束?
主要包括以下5個方面:
高可擴展性,因為它需要面對全世界用戶群體以及數(shù)十年以上的壽命
低門檻,既有使用門檻也包括開發(fā)門檻,JavaApplet的式微與Javascript的如日中天就是極好的例證
分布式環(huán)境下的大粒度數(shù)據(jù)傳輸
internet下無法控制的負載以及種類版本繁多的組件
向前兼容,HTTP/1.1中的許多特性都需要照顧到還有僅支持HTTP/1.0的代理服務器在互聯(lián)網(wǎng)上運行
2.3 遵循的架構設計方案是怎樣的?
HTTP/1.1是完全遵循REST架構設計,而REST架構主要包含以下4個子架構:
LCS:空間上分層的客戶端服務器,因此我們才有了隧道、代理、網(wǎng)關、CDN、負載均衡等產(chǎn)品;
CSS:無狀態(tài)的客戶端服務器,因此我們才有了Request/Response請求模式,才要求cookie頭部或者URL不能超過4K等。
COD:按需代碼,即將代碼從服務器移至客戶端再運行,今天的前端生態(tài)都是基于此架構下而生的Javascript衍伸的。
$:緩存,HTTP組件中無處沒有緩存,共享緩存、私有緩存,沒指明緩存時限還要預估一個緩存過期值。
2.4 HTTP協(xié)議特性有哪些?
首先,我們需要理解它在OSI概念模型的哪一層,它又是處在TCP/IP體系的什么位置。
其次,我們可以從上述架構中推導出它的定義:一種無狀態(tài)的、應用層的、以請求/應答方式運行的協(xié)議,它使用可擴展的語義和自描述消息格式,與基于網(wǎng)絡的超文本信息系統(tǒng)靈活的互動!
3、熟悉協(xié)議格式
學習HTTP協(xié)議格式時,應從以下3個方面入手:
3.1 擴充巴科斯-瑙爾范式:ABNF元語言
元語言可用于描述協(xié)議格式,而ABNF就嚴謹定義了HTTP的格式。
ABNF并不復雜,只需要我們花10分鐘即可學會,它包括操作符和核心規(guī)則2大部分,這里不再列出。
3.2 HTTP協(xié)議格式
掌握HTTP協(xié)議格式需要理清一個樹狀知識圖,參見本文末尾我整理的HTTP知識圖譜。
3.3 DNS協(xié)議格式
我們需要掌握3個方面的知識:
DNS報文是基于UDP的,它的通用格式是固定的,需要理解各字段含義
Questions部分需要重點看QNAME域名是如何編碼的,以及QTYPE的含義
Answers部分字段更多,特別是對NAME及RDATA部分的偏移表示法要有所了解
4、掌握應用場景
HTTP的應用場景極其廣泛,下面我列出常見的9個場景,在協(xié)議格式中提到的各方法、響應碼、頭部、包體編碼方式都與具體場景相關。
4.1 內(nèi)容如何協(xié)商
響應式協(xié)商由于RFC規(guī)范不明少有使用,而主動式協(xié)商關于語言、編碼、媒體類型等是我們?nèi)粘4蚪坏赖某R姺绞健?/p>
4.2 FORM表單如何提交
表單提交雖然有3種編碼方式,但最常用的還是boundary分隔的多表述共存于單一包體的方式,waf防火墻必須考慮如何應用這種包體內(nèi)的SQL注入攻擊。
4.3 Range請求的使用
傳輸大文件所用到的斷點續(xù)傳和多線程下載,都需要使用Range規(guī)范,為防止多請求下載過程中服務器端更新的情況,還引入條件請求If-Range。
4.4 Cookie與Session的設計
Set-Cookie中有許多屬性,既有限制有效期的expires-av、max-age-av,也有限制使用范圍的domain-av、path-av,還有限制協(xié)議的secure-av或是限制使用對象的httponly-av。
這種種限制都在針對瀏覽器使用cookie是否安全,而同時為了便利性瀏覽器也支持第三方cookie,這更是為廠商搜集用戶信息提供了方便。
4.5 瀏覽器同源策略與跨域請求
同源策略是瀏覽器所做的限制,如果我們直接基于網(wǎng)絡庫處理響應是不受此限制的。所以,這個同源策略的有效性非常依賴瀏覽器的實現(xiàn)。當然,同源策略中不包含防范CSRF攻擊,服務器通?;趖oken策略解決CSRF攻擊。
安全與便利是必須權衡取舍的,為了增加便利性,必須允許AJAX的跨域請求,于是CORS便誕生了。
4.6 條件請求
條件請求不只可應對多線程下載時的資源中途變量,也可針對多人協(xié)作的wiki系統(tǒng)生效,同時也能用于緩存更新。實際在Restful API設計中它大有發(fā)揮余地。
4.7 共享緩存與私有緩存
當下的互聯(lián)網(wǎng)上緩存無處不在,即使服務器上沒有配置某些資源可以緩存,瀏覽器也在想盡辦法預估出一段時間緩存資源。因為,緩存能夠極大的提升用戶體驗、降低網(wǎng)絡負載!能夠控制緩存的HTTP頭部非常多,它不只控制緩存的有效期,也在控制緩存依據(jù)的關鍵字。
4.8 重定向的應用
關于重定向我們需要從2個維度4個象限去理解:可更改方法 | 不可更改方法、可緩存|不可緩存
這便引出了301、302、303、307、308這5種不同的響應狀態(tài)碼。
4.9 網(wǎng)絡爬蟲
爬蟲無處不在,遠不只久遠的搜索引擎爬蟲,當下在出行(例如12306火車票或者亞航)、電商、社交(新浪微博)等都廣受爬蟲騷擾,爬蟲不只爬取信息,還模擬人類制造行為,例如許多搶票機、僵尸粉都如此。而另一方面,為了歡迎google/baidu的爬蟲,又誕生了各種SEO策略及教程,還有許多利用PageRank漏洞提升關鍵詞排名的商家在以此盈利。所以,理解爬蟲的工作方式也是非常重要的。
當然,HTTP應用場景遠不止這些,但徹底掌握這些場景將使我們完全理解HTTP協(xié)議中常見的方法、頭部、響應碼等等。
HTTP 協(xié)議是 Web 協(xié)議里非常重的一塊,作為程序員,無論你是前后端工程師,還是運維測試,如果 想面試更高的職位,或者要站在更高的角度去理解技術業(yè)務架構,并能在問題出現(xiàn)時快速、高效地解決問題,Web 協(xié)議一定是你繞不過去的一道坎。 熟練掌握各種常用 Web 協(xié)議,可以幫你在工作中輕松應對各種網(wǎng)絡難題。