工作的這十多年來,我開發過智能 IC 卡,也倒騰過商用密碼機;做過政務項目,也做過商務搜索;寫過網游核心引擎,也寫過 CDN 存儲系統;在 Windows 上用 C/C++ 做客戶端,在 AIX、Linux 上用 Java、PHP 寫后臺服務……現在則是專注于“魔改”Nginx,深度定制實現網絡協議的分析與檢測。
當極客時間的編輯聯系我,要我寫 HTTP 專欄的時候,我的第一反應是:“HTTP 協議好簡單的,有這個必要嗎?”
你可能也會有同樣的想法:“HTTP 不就是請求 / 響應、GET/POST、Header/Body 嗎?網絡上的資料一抓一大把,有什么問題搜一下就是了。”
不瞞你說,我當時就是這么想的,在之前的工作中也是一直這么做的,而且一直“感覺良好”,覺得 HTTP 就是這個樣子,沒有什么特別的地方,沒有什么值得講的。
但在編輯的一再堅持下,我“勉為其難”接下了這個任務。然后做了一個小范圍的“調查”,問一些周圍的同事,各個領域的都有,比如產品、開發、運維、測試、前端、后端、手機端……想看看他們有什么意見。
出乎我的意料,他們無一例外都對這個“HTTP 專欄”有很強烈的需求,想好好“補補課”,系統地學習了解 HTTP,這其中甚至還包括有七、八年(甚至更多)工作經驗的老手。
這不禁讓我陷入了思考,為什么如此“簡單”的協議卻還有這么多的人想要學呢?
我想,一個原因可能是 HTTP 協議“**太常見**”了。就像現實中的水和空氣一樣,如此重要卻又如此普遍,普遍到我們幾乎忽視了它的存在。真的很像那句俗語所說:“魚總是最后看見水的”,但水對魚的生存卻又是至關重要。
我認真回憶了一下這些年的工作經歷,這才發現 HTTP 只是表面上顯得簡單,而底層的運行機制、工作原理絕不簡單,可以說是非常地復雜。只是我們平常總是“KPI 優先”,網上抓到一個解決方法用過就完事了,沒有去深究里面的要點和細節。
下面的幾個場景,都是我周圍同事的實際感受,你是否也在工作中遇到過這樣的困惑呢?你能把它們都解釋清楚嗎?
* 用 Nginx 搭建 Web 服務器,照著網上的文章配好了,但里面那么多的指令,什么 keepalive、rewrite、proxy\_pass 都是怎么回事?為什么要這么配置?
* 用 Python 寫爬蟲,URI、URL“傻傻分不清”,有時里面還會加一些奇怪的字符,怎么處理才好?
* 都說 HTTP 緩存很有用,可以大幅度提升系統性能,可它是怎么做到的?又應該用在何時何地?
* HTTP 和 HTTPS 是什么關系?還經常聽說有 SSL/TLS/SNI/OCSP/ALPN……這么多稀奇古怪的縮寫,頭都大了,實在是搞不懂。
其實這些問題也并不是什么新問題,把關鍵字粘貼進搜索欄,再點一下按鈕,搜索引擎馬上就能找出幾十萬個相關的頁面。但看完第一頁的前幾個鏈接后,通常還是有種“懵懵懂懂”“似懂非懂”的感覺,覺得說的對,又不全對,和自己的思路總是不夠“Match”。
不過大多數情況下你可能都沒有時間細想,優先目標是把手頭的工作“對付過去”。長此以來,你對 HTTP 的認識也可能僅限于這樣的“知其然,而不知其所以然”,實際情況就是 HTTP 天天用,時時用,但想認真、系統地學習一下,梳理出自己的知識體系,經常會發現無從下手。
我把這種 HTTP 學習的現狀歸納為三點:**正式資料“少”、網上資料“雜”、權威資料“難”**。
第一個,**正式資料“少”**。
上購書網站,搜個 Python、Java,搜個 MySQL、Node.js,能出一大堆。但搜 HTTP,實在是少得可憐,那么幾本,一只手的手指頭就可以數得過來,和語言類、數據庫類、框架類圖書真是形成了鮮明的對比。
現有的 HTTP 相關圖書我都看過,怎么說呢,它們都有一個特點,“廣撒網,捕小魚”,都是知識點,可未免太“照本宣科”了,理論有余實踐不足,看完了還是不知道怎么去用。
而且這些書的“歲數”都很大,依據的都是 20 年前的 RFC2616,很多內容都不合時宜,而新標準 7230 已經更新了很多關鍵的細節。
第二個,**網上資料“雜”**。
正式的圖書少,而且過時,那就求助于網絡社區吧。現在的博客、論壇、搜索引擎非常發達,網上有很多 HTTP 協議相關的文章,也都是網友的實踐經驗分享,“干貨”很多,很能解決實際問題。
但網上文章的特點是細小、零碎,通常只“釘”在一個很小的知識點上,而且由于帖子長度的限制,無法深入展開論述,很多都是“淺嘗輒止”,通常都止步在“How”層次,很少能說到“Why”,能說透的更是寥寥無幾。
網文還有一個難以避免的“毛病”,就是“良莠不齊”。同一個主題可能會有好幾種不同的說法,有的還會互相矛盾、以訛傳訛。這種情況是最麻煩的,你必須花大力氣去鑒別真假,不小心就會被“帶到溝里”。
可想而知,這種“東一榔頭西一棒子”的學習方式,用“碎片”拼湊出來的 HTTP 知識體系是非常不完善的,會有各種漏洞,遇到問題時基本派不上用場,還得再去找其他的“碎片”。
第三個,**權威資料“難”**。
圖書少,網文雜,我們還有一個終極的學習資料,那就是 RFC 文檔。
RFC 是互聯網工程組(IETF)發布的官方文件,是對 HTTP 最權威的定義和解釋。但它也是最難懂的,全英文看著費勁,理解起來更是難上加難,文檔之間還會互相關聯引用,“勸退率”極高。
這三個問題就像是“三座大山”,阻礙了像你這樣的很多有心人去學習、了解 HTTP 協議。
那么,怎么才能更好地學習 HTTP 呢?
我為這個專欄定了一個基調:“要有廣度,但更要有深度”。目標是成為含金量最高的 HTTP 學習資料,新手可以由淺入深、系統學習,老手可以溫故知新、查缺補漏,讓你花最少的時間,用最少的精力,掌握最多、最全面、最系統的知識。
由于 HTTP 應用得非常廣泛,幾乎涉及到所有的領域,所以我會在廣度上從 HTTP 盡量向外擴展,不只講協議本身,與它相關的 TCP/IP、DNS、SSL/TLS、Web Server 等都會講到,而且會把它們打通串聯在一起,形成知識鏈,讓你知道它們之間是怎么聯系、怎么運行的。
專欄文章的深度上我也是下足了功夫,全部基于最新的 RFC 標準文檔,再結合我自己多年的實踐體會,力求講清講透,能讓你看了以后有豁然開朗的感覺。
比如分析 HTTPS,我會用 Wireshark 從建立 TCP 連接時就開始抓包,從二進制最底層來分析里面的 Record、Cipher Suite、Extension,講 ECDHE、AES、SHA384,再畫出詳細的流程圖,做到“一覽無余”。
陸游有詩:“**紙上得來終覺淺,絕知此事要躬行**”。學習網絡協議最重要的就是實踐,在專欄里我還會教你用 Nginx 搭建一個“麻雀雖小,五臟俱全”的實驗環境,讓你與 HTTP 零距離接觸。
它有一個最大的優點:自身就是一個完整的網絡環境,即使不聯網也能夠在里面收發 HTTP 消息。
我還精心設計了配套的測試用例,最小化應用場景,排除干擾因素,你可以在里面任意測試 HTTP 的各種特性,再配合 Wireshark 抓包,就能夠理論結合實踐,更好地掌握 HTTP 的知識。
每一講的末尾,我也會留幾個思考題,你可以把它當作是求職時的面試官問題,盡量認真思考后再回答,這樣能夠把專欄的學習由“被動地聽”,轉變為“主動地學”,實現“學以致用”。
當然了,你和我的“興趣點”不可能完全一樣,我在講課時也難免“顧此失彼”“掛一漏萬”,希望你積極留言,我會視情況做些調整,或者用答疑的形式補充沒講到的內容。
今年是萬維網和 HTTP 誕生 30 周年,也是 HTTP/1.1 誕生 20 周年,套用莎翁《哈姆雷特》里的名句,讓我們在接下來的三個月里一起努力。
“To Be a HTTP Hero!”