內(nèi)容
- 在www目錄下,運(yùn)行start批處理程序醋火,啟動(dòng)本機(jī)的Openr服務(wù)器悠汽,啟動(dòng)后可以用List批處理確認(rèn)服務(wù)是否正常運(yùn)行
- 打開(kāi)wireshark,選擇TCP port HTTP過(guò)濾器芥驳,再鼠標(biāo)雙擊Npcap Loopback Adapter柿冲,開(kāi)始抓取本機(jī)127.0.0.1地址上的網(wǎng)絡(luò)數(shù)據(jù)
- 在chrome瀏覽器的地址欄,輸入Http://127.0.0.1/兆旬,再按下回車鍵假抄,等歡迎頁(yè)面顯示出來(lái)之后,wireshark里就會(huì)有捕獲的數(shù)據(jù)包
抓包分析
在wireshark里丽猬,可以看到11個(gè)包(因?yàn)橛昧藶V包功能宿饱,濾掉了3個(gè)包,原本是14個(gè)包)脚祟,基于此谬以,來(lái)分析來(lái),鍵入網(wǎng)址按下回車之后的數(shù)據(jù)傳輸全過(guò)程由桌。
通過(guò)前面的講解为黎,能知道HTTP協(xié)議是運(yùn)行在TCP/IP基礎(chǔ)上的,依靠TCP/IP協(xié)議來(lái)實(shí)現(xiàn)數(shù)據(jù)的可靠傳輸行您。所以瀏覽器要用HTTP協(xié)議收發(fā)數(shù)據(jù)铭乾,首先要做就是建立TCP鏈接。
因?yàn)橥扪诘刂窓诶镏苯虞斎肓薎P地址炕檩,“127.0.0.1”,而web服務(wù)器的默認(rèn)端口是80捌斧,所以瀏覽器就要依照TCP協(xié)議的規(guī)范捧书,使用三次握手建立與web服務(wù)器的連接。對(duì)應(yīng)到wireshark里骤星,就是最開(kāi)始的三個(gè)抓包经瓷,瀏覽器使用的端口是52085,服務(wù)器使用的端口是80洞难,經(jīng)過(guò)SYN舆吮、SYN/ACK、ACK的三個(gè)抓包后,瀏覽器與服務(wù)器的TCP連接就建立起來(lái)了色冀。
有了可靠的TCP連接通道后潭袱,HTTP協(xié)議就開(kāi)始工作了。于是锋恬,瀏覽器按照HTTP協(xié)議規(guī)定的格式屯换,通過(guò)TCP發(fā)送了一個(gè)“GET/HTTP/1.1”請(qǐng)求報(bào)文,也就是Wireshark里的第四個(gè)包与学。至于包的具體內(nèi)容彤悔,可以之后再說(shuō)。
隨后索守,Web服務(wù)器回復(fù)了第五個(gè)包晕窑,在TCP協(xié)議層面確認(rèn):剛才的報(bào)文我已經(jīng)收到了,不過(guò)這個(gè)TCP包HTTP協(xié)議是看不見(jiàn)的卵佛。
web服務(wù)器收到報(bào)文后杨赤,在內(nèi)部就要處理這個(gè)請(qǐng)求,同樣也是依據(jù)HTTP協(xié)議的規(guī)定截汪,解析報(bào)文疾牲,看看這個(gè)瀏覽器發(fā)送這個(gè)請(qǐng)求想要干什么。
他一衙解,原來(lái)是要求獲取根目錄下的默認(rèn)文件说敏,那就從磁盤(pán)上把那個(gè)文件全讀出來(lái),再拼成符合HTTP格式的報(bào)文丢郊,發(fā)回去。這個(gè)就是Wireshark里的第六個(gè)包医咨,“HTTP/1.1 200OK”, 底層走的還是TCP協(xié)議枫匾。
同樣的,瀏覽器也要給服務(wù)器回復(fù)一個(gè)TCP的ACK確認(rèn)拟淮,“你的響應(yīng)報(bào)文收到了干茉,多謝”,即第七個(gè)包很泊。這時(shí)角虫,瀏覽器就收到了相應(yīng)數(shù)據(jù),但里面是什么呢委造?所以也要解析報(bào)文戳鹅,一看,服務(wù)器給我的是HTML文件昏兆,那好枫虏,那我就調(diào)用排版引擎、JS引擎來(lái)處理一下,然后再瀏覽器窗口展現(xiàn)出了歡迎頁(yè)面隶债。
這之后腾它,還有兩個(gè)來(lái)回,共四個(gè)包死讹,重復(fù)了相同的步驟瞒滴。這時(shí)瀏覽器自動(dòng)請(qǐng)求了作為網(wǎng)站圖標(biāo)的“favicon.ico”文件,與我們的輸入網(wǎng)址無(wú)關(guān)赞警。但因?yàn)槲覀兊膶?shí)驗(yàn)環(huán)境沒(méi)有這個(gè)文件妓忍,所以服務(wù)器在硬盤(pán)上找不到,返回了一個(gè)“404仅颇,not found”单默。
至此,鍵入網(wǎng)址再按下回車的全過(guò)程就結(jié)束了忘瓦,下圖為交互圖紙搁廓。不過(guò),圖里TCP關(guān)閉連接的四次揮手耕皮,在抓包里沒(méi)有出現(xiàn)境蜕,這是因?yàn)镠TTP/1/1廠連接特性,默認(rèn)不會(huì)立即關(guān)閉連接凌停。
敘述全過(guò)程:
- 瀏覽器從地址欄的輸入中獲得服務(wù)器的IP地址和端口號(hào)
- 瀏覽器用TCP的三次握手與服務(wù)器建立連接
- 瀏覽器向服務(wù)器發(fā)送拼好的報(bào)文
- 服務(wù)器收到報(bào)文后處理請(qǐng)求粱年,同樣拼好報(bào)文再發(fā)送給瀏覽器
- 瀏覽器解析報(bào)文,渲染輸出頁(yè)面
使用域名訪問(wèn)web服務(wù)器
剛才我們是在瀏覽器地址里直接輸入IP地址罚拟,但在絕大多數(shù)情況下台诗,我們是不知道服務(wù)器IP地址的,使用的是域名赐俗,那么改用域名后拉队,這個(gè)過(guò)程會(huì)有什么不同嗎?
實(shí)際動(dòng)手試下吧阻逮,把地址欄的輸入改成:“www.chrono.com”粱快,重復(fù)wiresh抓包過(guò)程,會(huì)發(fā)現(xiàn)叔扼,好像沒(méi)有什么不同事哭,瀏覽器上同樣顯示出了歡迎界面,抓到的包也同樣是11
個(gè)瓜富,先是三次握手鳍咱,然后是兩次HTTP傳輸。
這里就出現(xiàn)了一個(gè)問(wèn)題:瀏覽器是如何從網(wǎng)址里知道与柑,"www.chrono.com"的IP地址就是“127.0.0.1”的呢流炕?
像是之前寫(xiě)過(guò)的DNS內(nèi)容澎现,當(dāng)瀏覽器看到了網(wǎng)址的"www.chrono.com",發(fā)現(xiàn)他不是數(shù)字形式的IP地址每辟,那就肯定是域名了剑辫,于是就會(huì)發(fā)起域名解析動(dòng)作,通過(guò)訪問(wèn)一系列的域名解析服務(wù)器渠欺,試圖把這個(gè)域名翻譯成TCP/IP協(xié)議里的IP地址妹蔽。不過(guò)因?yàn)橛蛎馕龅娜^(guò)程實(shí)在是太復(fù)雜了,如果每一個(gè)域名都要大費(fèi)周折地去網(wǎng)上查一下挠将,那上網(wǎng)肯定會(huì)慢得受不了胳岂。
所以,在域名解析的過(guò)程中會(huì)有多級(jí)的緩存舔稀,瀏覽器首先看一下自己的緩存里有沒(méi)有乳丰,如果沒(méi)有就向操作系統(tǒng)的緩存要,還沒(méi)有就檢查本機(jī)域名解析文件hosts内贮。如果hosts文件里有产园,那瀏覽器就知道了域名對(duì)應(yīng)的IP地址,就可以愉快地建立TCP連接發(fā)送HTTP請(qǐng)求了夜郁。圖里的瀏覽器多出了一個(gè)訪問(wèn)hosts文件的動(dòng)作什燕,這也就是本機(jī)的DNS解析。
真實(shí)的網(wǎng)絡(luò)世界
在兩個(gè)最小化環(huán)境的實(shí)驗(yàn)里竞端,
第一個(gè)實(shí)驗(yàn)是最簡(jiǎn)單的場(chǎng)景屎即,只有兩個(gè)角色:瀏覽器和服務(wù)器,瀏覽器可以直接用IP地址找到服務(wù)器事富,兩者直接建立TCP連接后發(fā)送HTTP報(bào)文通信技俐。
第二個(gè)實(shí)驗(yàn)是在瀏覽器和服務(wù)器之外,增加了一個(gè)DNS的角色统台,瀏覽器不知道服務(wù)器的IP地址雕擂,所以必須借助DNS的域名解析功能得到服務(wù)器的IP地址,然后才能與服務(wù)器通信饺谬。
真實(shí)的互聯(lián)網(wǎng)場(chǎng)景要比這兩個(gè)場(chǎng)景復(fù)雜得多,下圖可以做個(gè)詳細(xì)說(shuō)明谣拣。
如果用的是電腦臺(tái)式機(jī)募寨,那么可能會(huì)是用帶水晶頭的雙絞線連上網(wǎng)口,由交換機(jī)接入固定網(wǎng)絡(luò)森缠。如果用的是手機(jī)拔鹰、平板電腦,那么可能就會(huì)通過(guò)蜂窩網(wǎng)絡(luò)贵涵、wifi,由電信基站盐杂、無(wú)線熱點(diǎn)接入移動(dòng)網(wǎng)絡(luò)看彼。
接入網(wǎng)絡(luò)的同時(shí),網(wǎng)絡(luò)運(yùn)行商會(huì)給你的設(shè)備分配一個(gè)IP地址拴还,這個(gè)地址可能是靜態(tài)分配的,也可能是動(dòng)態(tài)分配的欧聘。靜態(tài)IP就始終不變片林,而動(dòng)態(tài)IP可能下次上網(wǎng)就變了。
假設(shè)怀骤,要訪問(wèn)的是Apple網(wǎng)站费封,顯然你是不知道他的真實(shí)IP地址的,在瀏覽器里只能使用域名“www.apple.com”訪問(wèn)蒋伦,那么接下來(lái)要做的必然是域名解析弓摘。這就要用DNS協(xié)議開(kāi)始從操作系統(tǒng)、本地DNS痕届、根DNS韧献、頂級(jí)DNS、權(quán)威DNS的層層解析爷抓,當(dāng)然這中間可能會(huì)有緩存势决,所以可能不會(huì)費(fèi)太多時(shí)間就能拿到結(jié)果。
這時(shí)候蓝撇,互聯(lián)網(wǎng)上還有一個(gè)重要的角色CDN果复,他也會(huì)在DNS的解析過(guò)程中插上一腳。DNS解析可能會(huì)給出CDN服務(wù)器的IP地址渤昌,這樣拿到的就會(huì)是CDN服務(wù)器虽抄,而不是目標(biāo)網(wǎng)站的實(shí)際地址。因?yàn)镃DN會(huì)緩存網(wǎng)站的大部分資源独柑,比如圖片迈窟、CSS樣式表,所以有的HTTP請(qǐng)求就不需要再發(fā)到APPLE忌栅,CDN就可以直接響應(yīng)請(qǐng)求车酣,把數(shù)據(jù)發(fā)過(guò)來(lái)。
由PHP索绪、Java等后臺(tái)服務(wù)動(dòng)態(tài)生成的頁(yè)面湖员,屬于動(dòng)態(tài)資源,CDN無(wú)法緩存瑞驱,只能從目標(biāo)網(wǎng)站獲取娘摔。于是,瀏覽器發(fā)出的HTTP請(qǐng)求唤反,就要開(kāi)始在互聯(lián)網(wǎng)上進(jìn)行長(zhǎng)途跋涉凳寺,經(jīng)過(guò)無(wú)數(shù)的路由器鸭津、網(wǎng)關(guān)、代理肠缨,達(dá)到最后的目的地逆趋。
目標(biāo)網(wǎng)站的服務(wù)器對(duì)外表現(xiàn)的是一個(gè)IP地址,但為了能夠扛住高并發(fā)怜瞒,在內(nèi)部也是一套復(fù)雜的架構(gòu)父泳。通常在入口是負(fù)載均衡設(shè)備,例如四層的LVS或者七層的Nginx吴汪,在后面是許多的服務(wù)器惠窄,構(gòu)成一個(gè)更強(qiáng)更穩(wěn)定的集群。
負(fù)載均衡設(shè)備會(huì)縣訪問(wèn)系統(tǒng)里的緩存服務(wù)器漾橙,通常有memory級(jí)換成Redis和dis級(jí)緩存Varnish杆融,他們的作用與CDN類似,不過(guò)是工作在內(nèi)部網(wǎng)絡(luò)霜运,把最頻繁訪問(wèn)的數(shù)據(jù)緩存幾秒鐘或幾分鐘脾歇,減輕后端應(yīng)用服務(wù)器的壓力。
如果緩存服務(wù)器里也沒(méi)有淘捡,那么負(fù)載均衡設(shè)備就要把請(qǐng)求轉(zhuǎn)發(fā)給應(yīng)用服務(wù)器了藕各。這里就是各種開(kāi)發(fā)框架大顯神通的地方了,例如Java的Tomcat/Netty/Jetty焦除,python的Django激况,還有PHP、Node.js膘魄、Goland等等乌逐。他們又會(huì)再訪問(wèn)后面的MySQL、PostgreSQL创葡、MongoDB等數(shù)據(jù)庫(kù)服務(wù)浙踢,實(shí)現(xiàn)用戶登錄、商品查詢灿渴、購(gòu)物下單洛波、扣款支付等業(yè)務(wù)操作,然后把執(zhí)行的結(jié)果返回給負(fù)載均衡設(shè)備骚露,同時(shí)也可能給緩存服務(wù)器里也放一份蹬挤。
應(yīng)用服務(wù)器的輸出到了負(fù)載均衡設(shè)備這里,請(qǐng)求的處理就算是完成了荸百,就要按照原路再走回去闻伶,還是要經(jīng)過(guò)許多的路由器滨攻、網(wǎng)關(guān)够话、代理蓝翰。如果這個(gè)資源允許緩存,那么經(jīng)過(guò)CDN的時(shí)候女嘲,他也會(huì)做緩存畜份,這樣下次同樣的請(qǐng)求就不會(huì)到達(dá)源站了。
最后網(wǎng)站的響應(yīng)數(shù)據(jù)回到了設(shè)備上欣尼,他可能是HTML爆雹、JSON、圖片或者其他格式的數(shù)據(jù)愕鼓,需要由瀏覽器解析處理才能顯示出來(lái)钙态。如果數(shù)據(jù)里還有超鏈接,指向別的資源菇晃,那么就要重走一遍整個(gè)流程册倒,直到把所有的資源都下載完。
小結(jié)
- HTTP協(xié)議基于底層的TCP/IP協(xié)議磺送,所以必須要用IP地址建立連接
- 如果不知道IP地址驻子,就要用DNS協(xié)議去解析得到IP地址,否則就會(huì)連接失敗
- 建立TCP連接后會(huì)順序收發(fā)數(shù)據(jù)估灿,請(qǐng)求方和應(yīng)答方都必須依據(jù)HTTP規(guī)范構(gòu)建和解析報(bào)文
- 為了減少響應(yīng)時(shí)間崇呵,整個(gè)過(guò)程中的每一個(gè)環(huán)節(jié)都會(huì)有緩存,能夠?qū)崿F(xiàn)“短路”操作
- 雖然現(xiàn)實(shí)中的HTTP傳輸過(guò)程非常復(fù)雜馅袁,但理論上仍然可以簡(jiǎn)化成實(shí)驗(yàn)室里的兩點(diǎn)模型