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

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

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

接下來(lái)我們要安裝 OpenResty,去它的官網(wǎng),點(diǎn)擊左邊欄的“Download”,進(jìn)入下載頁(yè)面,下載適合你系統(tǒng)的版本(這里我下載的是 64 位的 1.15.8.1,包的名字是“openresty-1.15.8.1-win64.zip”)。

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

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

- start:?jiǎn)?dòng) OpenResty 服務(wù)器;
- stop:停止 OpenResty 服務(wù)器;
- reload:重啟 OpenResty 服務(wù)器;
- list:列出已經(jīng)啟動(dòng)的 OpenResty 服務(wù)器進(jìn)程。
使用鼠標(biāo)雙擊“start”批處理文件,就會(huì)啟動(dòng) OpenResty 服務(wù)器在后臺(tái)運(yùn)行,這個(gè)過(guò)程可能會(huì)有 Windows 防火墻的警告,選擇“允許”即可。
運(yùn)行后,鼠標(biāo)雙擊“list”可以查看 OpenResty 是否已經(jīng)正常啟動(dòng),應(yīng)該會(huì)有兩個(gè) nginx.exe 的后臺(tái)進(jìn)程,大概是下圖的樣子。

有了 Web 服務(wù)器后,接下來(lái)我們要運(yùn)行 Wireshark,開(kāi)始抓包。
因?yàn)槲覀兊膶?shí)驗(yàn)環(huán)境運(yùn)行在本機(jī)的 127.0.0.1 上,也就是 loopback“環(huán)回”地址。所以,在 Wireshark 里要選擇“Npcap loopback Adapter”,過(guò)濾器選擇“HTTP TCP port(80)”,即只抓取 HTTP 相關(guān)的數(shù)據(jù)包。鼠標(biāo)雙擊開(kāi)始界面里的“Npcap loopback Adapter”即可開(kāi)始抓取本機(jī)上的網(wǎng)絡(luò)數(shù)據(jù)。

然后我們打開(kāi) Chrome,在地址欄輸入“http://localhost/”,訪問(wèn)剛才啟動(dòng)的 OpenResty 服務(wù)器,就會(huì)看到一個(gè)簡(jiǎn)單的歡迎界面,如下圖所示。

這時(shí)再回頭去看 Wireshark,應(yīng)該會(huì)顯示已經(jīng)抓到了一些數(shù)據(jù),就可以用鼠標(biāo)點(diǎn)擊工具欄里的“停止捕獲”按鈕告訴 Wireshark“到此為止”,不再繼續(xù)抓包。

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



















