08_鍵入網(wǎng)址再按下回車声怔,后面究竟發(fā)生了什么态贤?

內(nèi)容

  1. 在www目錄下,運(yùn)行start批處理程序醋火,啟動(dòng)本機(jī)的Openr服務(wù)器悠汽,啟動(dòng)后可以用List批處理確認(rèn)服務(wù)是否正常運(yùn)行
  2. 打開(kāi)wireshark,選擇TCP port HTTP過(guò)濾器芥驳,再鼠標(biāo)雙擊Npcap Loopback Adapter柿冲,開(kāi)始抓取本機(jī)127.0.0.1地址上的網(wǎng)絡(luò)數(shù)據(jù)
  3. 在chrome瀏覽器的地址欄,輸入Http://127.0.0.1/兆旬,再按下回車鍵假抄,等歡迎頁(yè)面顯示出來(lái)之后,wireshark里就會(huì)有捕獲的數(shù)據(jù)包
使用IP地址訪問(wèn)web服務(wù)器

抓包分析

在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)閉連接凌停。

HTTP的三次抓包+四次揮手

敘述全過(guò)程:

  1. 瀏覽器從地址欄的輸入中獲得服務(wù)器的IP地址和端口號(hào)
  2. 瀏覽器用TCP的三次握手與服務(wù)器建立連接
  3. 瀏覽器向服務(wù)器發(fā)送拼好的報(bào)文
  4. 服務(wù)器收到報(bào)文后處理請(qǐng)求粱年,同樣拼好報(bào)文再發(fā)送給瀏覽器
  5. 瀏覽器解析報(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ō)明谣拣。


復(fù)雜場(chǎng)景

如果用的是電腦臺(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é)

  1. HTTP協(xié)議基于底層的TCP/IP協(xié)議磺送,所以必須要用IP地址建立連接
  2. 如果不知道IP地址驻子,就要用DNS協(xié)議去解析得到IP地址,否則就會(huì)連接失敗
  3. 建立TCP連接后會(huì)順序收發(fā)數(shù)據(jù)估灿,請(qǐng)求方和應(yīng)答方都必須依據(jù)HTTP規(guī)范構(gòu)建和解析報(bào)文
  4. 為了減少響應(yīng)時(shí)間崇呵,整個(gè)過(guò)程中的每一個(gè)環(huán)節(jié)都會(huì)有緩存,能夠?qū)崿F(xiàn)“短路”操作
  5. 雖然現(xiàn)實(shí)中的HTTP傳輸過(guò)程非常復(fù)雜馅袁,但理論上仍然可以簡(jiǎn)化成實(shí)驗(yàn)室里的兩點(diǎn)模型
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末域慷,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子司顿,更是在濱河造成了極大的恐慌芒粹,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件大溜,死亡現(xiàn)場(chǎng)離奇詭異化漆,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)钦奋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)座云,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人付材,你說(shuō)我怎么就攤上這事朦拖。” “怎么了厌衔?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵璧帝,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我富寿,道長(zhǎng)睬隶,這世上最難降的妖魔是什么锣夹? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮苏潜,結(jié)果婚禮上银萍,老公的妹妹穿的比我還像新娘。我一直安慰自己恤左,他們只是感情好贴唇,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著飞袋,像睡著了一般戳气。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上巧鸭,一...
    開(kāi)封第一講書(shū)人閱讀 51,462評(píng)論 1 302
  • 那天物咳,我揣著相機(jī)與錄音,去河邊找鬼蹄皱。 笑死览闰,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的巷折。 我是一名探鬼主播压鉴,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼锻拘!你這毒婦竟也來(lái)了油吭?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤署拟,失蹤者是張志新(化名)和其女友劉穎婉宰,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體推穷,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡心包,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了馒铃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蟹腾。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖区宇,靈堂內(nèi)的尸體忽然破棺而出娃殖,到底是詐尸還是另有隱情,我是刑警寧澤议谷,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布炉爆,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏芬首。R本人自食惡果不足惜鲫凶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望衩辟。 院中可真熱鬧,春花似錦波附、人聲如沸艺晴。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)封寞。三九已至,卻和暖如春仅财,著一層夾襖步出監(jiān)牢的瞬間狈究,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工盏求, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留抖锥,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓碎罚,卻偏偏與公主長(zhǎng)得像磅废,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子荆烈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容