自己動手,搭建HTTP實驗環境
這一講是“破冰篇”的最后一講,我會先簡單地回顧一下之前的內容,然后在 Windows 系統上實際操作,用幾個應用軟件搭建出一個“最小化”的 HTTP 實驗環境,方便后續的“基礎篇”“進階篇”“安全篇”的學習。
“破冰篇”回顧
HTTP 協議誕生于 30 年前,設計之初的目的是用來傳輸純文本數據。但由于形式靈活,搭配 URI、HTML 等技術能夠把互聯網上的資源都聯系起來,構成一個復雜的超文本系統,讓人們自由地獲取信息,所以得到了迅猛發展。
HTTP 有多個版本,目前應用的最廣泛的是 HTTP/1.1,它幾乎可以說是整個互聯網的基石。但 HTTP/1.1 的性能難以滿足如今的高流量網站,于是又出現了 HTTP/2 和 HTTP/3。不過這兩個新版本的協議還沒有完全推廣開。在可預見的將來,HTTP/1.1 還會繼續存在下去。
HTTP 翻譯成中文是“超文本傳輸協議”,是一個應用層的協議,通常基于 TCP/IP,能夠在網絡的任意兩點之間傳輸文字、圖片、音頻、視頻等數據。
HTTP 協議中的兩個端點稱為請求方和應答方。請求方通常就是 Web 瀏覽器,也叫 user agent,應答方是 Web 服務器,存儲著網絡上的大部分靜態或動態的資源。
在瀏覽器和服務器之間還有一些“中間人”的角色,如 CDN、網關、代理等,它們也同樣遵守 HTTP 協議,可以幫助用戶更快速、更安全地獲取資源。
HTTP 協議不是一個孤立的協議,需要下層很多其他協議的配合。最基本的是 TCP/IP,實現尋址、路由和可靠的數據傳輸,還有 DNS 協議實現對互聯網上主機的定位查找。
對 HTTP 更準確的稱呼是“HTTP over TCP/IP”,而另一個“HTTP over SSL/TLS”就是增加了安全功能的 HTTPS。
軟件介紹
常言道“實踐出真知”,又有俗語“光說不練是假把式”。要研究 HTTP 協議,最好有一個實際可操作、可驗證的環境,通過實際的數據、現象來學習,肯定要比單純的“動嘴皮子”效果要好的多。
現成的環境當然有,只要能用瀏覽器上網,就會有 HTTP 協議,就可以進行實驗。但現實的網絡環境又太復雜了,有很多無關的干擾因素,這些“噪音”會“淹沒”真正有用的信息。
所以,我給你的建議是:搭建一個“最小化”的環境,在這個環境里僅有 HTTP 協議的兩個端點:請求方和應答方,去除一切多余的環節,從而可以抓住重點,快速掌握 HTTP 的本質。

簡單說一下這個“最小化”環境用到的應用軟件:
- Wireshark
- Chrome/Firefox
- Telnet
- OpenResty
Wireshark是著名的網絡抓包工具,能夠截獲在 TCP/IP 協議棧中傳輸的所有流量,并按協議類型、地址、端口等任意過濾,功能非常強大,是學習網絡協議的必備工具。
它就像是網絡世界里的一臺“高速攝像機”,把只在一瞬間發生的網絡傳輸過程如實地“拍攝”下來,事后再“慢速回放”,讓我們能夠靜下心來仔細地分析那一瞬到底發生了什么。
Chrome是 Google 開發的瀏覽器,是目前的主流瀏覽器之一。它不僅上網方便,也是一個很好的調試器,對 HTTP/1.1、HTTPS、HTTP/2、QUIC 等的協議都支持得非常好,用 F12 打開“開發者工具”還可以非常詳細地觀測 HTTP 傳輸全過程的各種數據。
如果你更習慣使用Firefox,那也沒問題,其實它和 Chrome 功能上都差不太多,選擇自己喜歡的就好。
與 Wireshark 不同,Chrome 和 Firefox 屬于“事后諸葛亮”,不能觀測 HTTP 傳輸的過程,只能看到結果。
Telnet是一個經典的虛擬終端,基于 TCP 協議遠程登錄主機,我們可以使用它來模擬瀏覽器的行為,連接服務器后手動發送 HTTP 請求,把瀏覽器的干擾也徹底排除,能夠從最原始的層面去研究 HTTP 協議。
OpenResty你可能比較陌生,它是基于 Nginx 的一個“強化包”,里面除了 Nginx 還有一大堆有用的功能模塊,不僅支持 HTTP/HTTPS,還特別集成了腳本語言 Lua 簡化 Nginx 二次開發,方便快速地搭建動態網關,更能夠當成應用容器來編寫業務邏輯。
選擇 OpenResty 而不直接用 Nginx 的原因是它相當于 Nginx 的“超集”,功能更豐富,安裝部署更方便。我也會用 Lua 編寫一些服務端腳本,實現簡單的 Web 服務器響應邏輯,方便實驗。
安裝過程
這個“最小化”環境的安裝過程也比較簡單,大約只需要你半個小時不到的時間就能搭建完成。
我在 GitHub 上為本專欄開了一個項目:http_study,可以直接用“git clone”下載,或者去 Release 頁面,下載打好的壓縮包。
我使用的操作環境是 Windows 10,如果你用的是 Mac 或者 Linux,可以用 VirtualBox 等虛擬機軟件安裝一個 Windows 虛擬機,再在里面操作。
首先你要獲取最新的 http_study 項目源碼,假設 clone 或解壓的目錄是“D:\http_study”,操作完成后大概是下圖這個樣子。

Chrome 和 WireShark 的安裝比較簡單,一路按“下一步”就可以了。版本方面使用最新的就好,我的版本可能不是最新的,Chrome 是 73,WireShark 是 3.0.0。
Windows 10 自帶 Telnet,不需要安裝,但默認是不啟用的,需要你稍微設置一下。
打開 Windows 的設置窗口,搜索“Telnet”,就會找到“啟用或關閉 Windows 功能”,在這個窗口里找到“Telnet 客戶端”,打上對鉤就可以了,可以參考截圖。

接下來我們要安裝 OpenResty,去它的官網,點擊左邊欄的“Download”,進入下載頁面,下載適合你系統的版本(這里我下載的是 64 位的 1.15.8.1,包的名字是“openresty-1.15.8.1-win64.zip”)。

然后要注意,你必須把 OpenResty 的壓縮包解壓到剛才的“D:\http_study”目錄里,并改名為“openresty”。

安裝工作馬上就要完成了,為了能夠讓瀏覽器能夠使用 DNS 域名訪問我們的實驗環境,還要改一下本機的 hosts 文件,位置在“C:\WINDOWS\system32\drivers\etc”,在里面添加三行本機 IP 地址到測試域名的映射,你也可以參考 GitHub 項目里的 hosts 文件,這就相當于在一臺物理實機上“托管”了三個虛擬主機。
- 127.0.0.1 www.chrono.com127.0.0.1 www.metroid.net127.0.0.1 origin.io復制代碼
注意修改 hosts 文件需要管理員權限,直接用記事本編輯是不行的,可以切換管理員身份,或者改用其他高級編輯器,比如 Notepad++,而且改之前最好做個備份。
到這里,我們的安裝工作就完成了!之后你就可以用 Wireshark、Chrome、Telnet 在這個環境里隨意“折騰”,弄壞了也不要緊,只要把目錄刪除,再來一遍操作就能復原。
測試驗證
實驗環境搭建完了,但還需要把它運行起來,做一個簡單的測試驗證,看是否運轉正常。
首先我們要啟動 Web 服務器,也就是 OpenResty。
在 http_study 的“www”目錄下有四個批處理文件,分別是:

- start:啟動 OpenResty 服務器;
- stop:停止 OpenResty 服務器;
- reload:重啟 OpenResty 服務器;
- list:列出已經啟動的 OpenResty 服務器進程。
使用鼠標雙擊“start”批處理文件,就會啟動 OpenResty 服務器在后臺運行,這個過程可能會有 Windows 防火墻的警告,選擇“允許”即可。
運行后,鼠標雙擊“list”可以查看 OpenResty 是否已經正常啟動,應該會有兩個 nginx.exe 的后臺進程,大概是下圖的樣子。

有了 Web 服務器后,接下來我們要運行 Wireshark,開始抓包。
因為我們的實驗環境運行在本機的 127.0.0.1 上,也就是 loopback“環回”地址。所以,在 Wireshark 里要選擇“Npcap loopback Adapter”,過濾器選擇“HTTP TCP port(80)”,即只抓取 HTTP 相關的數據包。鼠標雙擊開始界面里的“Npcap loopback Adapter”即可開始抓取本機上的網絡數據。

然后我們打開 Chrome,在地址欄輸入“http://localhost/”,訪問剛才啟動的 OpenResty 服務器,就會看到一個簡單的歡迎界面,如下圖所示。

這時再回頭去看 Wireshark,應該會顯示已經抓到了一些數據,就可以用鼠標點擊工具欄里的“停止捕獲”按鈕告訴 Wireshark“到此為止”,不再繼續抓包。

至于這些數據是什么,表示什么含義,我會在下一講再詳細介紹。
如果你能夠在自己的電腦上走到這一步,就說明“最小化”的實驗環境已經搭建成功了,不要忘了實驗結束后運行批處理“stop”停止 OpenResty 服務器。
小結
這次我們學習了如何在自己的電腦上搭建 HTTP 實驗環境,在這里簡單小結一下今天的內容。
- 現實的網絡環境太復雜,有很多干擾因素,搭建“最小化”的環境可以快速抓住重點,掌握 HTTP 的本質;
- 我們選擇 Wireshark 作為抓包工具,捕獲在 TCP/IP 協議棧中傳輸的所有流量;
- 我們選擇 Chrome 或 Firefox 瀏覽器作為 HTTP 協議中的 user agent;
- 我們選擇 OpenResty 作為 Web 服務器,它是一個 Nginx 的“強化包”,功能非常豐富;
- Telnet 是一個命令行工具,可用來登錄主機模擬瀏覽器操作;
- 在 GitHub 上可以下載到本專欄的專用項目源碼,只要把 OpenResty 解壓到里面即可完成實驗環境的搭建。
課下作業
- 按照今天所學的,在你自己的電腦上搭建出這個 HTTP 實驗環境并測試驗證。
- 由于篇幅所限,我無法詳細介紹 Wireshark,你有時間可以再上網搜索 Wireshark 相關的資料,了解更多的用法。