在瀏覽器輸入一個(gè)網(wǎng)址回車后,發(fā)生了什么?
阿里實(shí)習(xí)面試的最后一個(gè)開放性問題:在瀏覽器輸入一個(gè)網(wǎng)址回車后,發(fā)生了什么?
答得并不是很好。所以也基本與阿里無緣了。一直以來,都沒能系統(tǒng)的學(xué)習(xí)一下Web相關(guān)知識。所以對這個(gè)問題的回答也是稍顯勉強(qiáng)。現(xiàn)借這個(gè)機(jī)會,將這個(gè)問題好好理一下吧。
大致流程
當(dāng)用戶在瀏覽器輸入www.tainies.cn這個(gè)url時(shí),將會發(fā)生很多操作:
- 首先,它會請求DNS把這個(gè)域名解析成對應(yīng)的IP地址
- 然后,根據(jù)這個(gè)IP在互聯(lián)網(wǎng)上找到對應(yīng)的服務(wù)器,向服務(wù)器發(fā)起一個(gè)get請求,由這個(gè)服務(wù)器決定返回默認(rèn)的數(shù)據(jù)資源給訪問的用戶
- 在服務(wù)器端可能還有很復(fù)雜的業(yè)務(wù)邏輯:服務(wù)器可能有很多臺,到底指定哪臺服務(wù)器來處理請求,這需要一個(gè)負(fù)載均衡設(shè)備來平均分配所有用戶的請求;
- 還有請求的數(shù)據(jù)是存儲在分布式緩存里還是一個(gè)靜態(tài)文件中,或是數(shù)據(jù)庫里;
- 當(dāng)數(shù)據(jù)返回瀏覽器時(shí),瀏覽器解析數(shù)據(jù)發(fā)現(xiàn)還有一些靜態(tài)資源(如CSS、JS或者圖片)時(shí),又會發(fā)起另外的HTTP請求,而這些請求很可能會在CDN上,那么CDN服務(wù)器又會處理這個(gè)用戶的請求
- 大體上一個(gè)用戶請求會涉及這么多的操作,每一個(gè)細(xì)節(jié)都會影響這個(gè)請求最終是否會成功。
HTTP 協(xié)議解析
B/S網(wǎng)絡(luò)架構(gòu)的核心是HTTP協(xié)議,掌握HTTP協(xié)議對一個(gè)從事互聯(lián)網(wǎng)工作的程序員來說非常重要。
要理解HTTP協(xié)議,最重要的就是熟悉HTTP協(xié)議中的HTTP Header, HTTP Header控制著互聯(lián)網(wǎng)成千上萬的用戶的數(shù)據(jù)的傳輸。最關(guān)鍵的是,它控制著用戶瀏覽器的渲染行為和服務(wù)器的執(zhí)行邏輯。例如,當(dāng)服務(wù)器沒有用戶請求的數(shù)據(jù)時(shí)會返回一個(gè)404狀態(tài)碼,告訴瀏覽器沒有要請求的數(shù)據(jù),通常瀏覽器就會展示一個(gè)非常不愿意看到的該頁面不存在的錯(cuò)誤信息。
DNS域名解析
如圖所示,當(dāng)一個(gè)用戶在瀏覽器中輸入www.tainies.cn時(shí),DNS解析將會有將近10個(gè)步驟,大致描述如下:
-
瀏覽器會檢查緩存中有沒有這個(gè)域名對應(yīng)的解析過的IP地址,如果緩存中有,這個(gè)解析過程就結(jié)束。瀏覽器緩存域名也是有限制的,不僅瀏覽器緩存大小有限制,而且緩存的時(shí)間也是有限制的,通常情況下為幾分鐘到幾個(gè)小時(shí)不等,域名被緩存的時(shí)間限制可以通過TTL屬性來設(shè)置。這個(gè)緩存時(shí)間太長或太短都不好,如果緩存時(shí)間夠長,一旦域名被解析到的IP有變化,會導(dǎo)致被客戶端緩存的域名無法解析到變化后的IP地址,以致該域名不能正常解析,這段時(shí)間內(nèi)有可能會有一部分客戶無法訪問網(wǎng)站。如果設(shè)置時(shí)間太短,會導(dǎo)致用戶每次訪問網(wǎng)站都要重新解析一次域名。
-
如果用戶的瀏覽器緩存中沒有,瀏覽器會查找操作系統(tǒng)緩存中是否有域名對應(yīng)的DNS解析結(jié)果。其實(shí),操作系統(tǒng)也會有一個(gè)域名解析的過程,在Windows中可以通過C:\Windows\System32\drivers\etc\hosts文件來設(shè)置,你可以將任何域名解析到任何能夠訪問的IP地址。如果你在這里指定了一個(gè)域名對應(yīng)的IP地址,那么瀏覽器會首先使用這個(gè)IP地址。正是因?yàn)橛羞@種本地DNS解析的規(guī)程,所以黑客就有可能通過修改你的域名解析來把特定的域名解析到它指定的IP地址上,導(dǎo)致這些域名被劫持。
前兩步在本機(jī)完成。如果本機(jī)中仍無法完成域名的解析,就會真正請求域名服務(wù)器來解析這個(gè)域名了。
-
如何、怎么知道域名服務(wù)器呢?在網(wǎng)絡(luò)配置中都會有“DNS服務(wù)器地址”這一項(xiàng),這個(gè)地址就用于解決前面所說的如果兩個(gè)過程無法解析時(shí)要怎么辦,操作系統(tǒng)會把這個(gè)域名發(fā)送給這類設(shè)置的LDNS,也就是本地區(qū)的域名服務(wù)器。這個(gè)DNS通常都提供給你互聯(lián)網(wǎng)接入的一個(gè)DNS解析服務(wù),例如你是在學(xué)習(xí)接入互聯(lián)網(wǎng),那么你的DNS服務(wù)器肯定在你的學(xué)校。如果你是在一個(gè)小區(qū)接入互聯(lián)網(wǎng)的,那么這個(gè)DNS就是提供給你接入互聯(lián)網(wǎng)的應(yīng)用提供商,即電信或聯(lián)通,也就是通常所說的SPA,那么這個(gè)DNS通常也會在你所在城市的某個(gè)角落,通常不會很遠(yuǎn)。LDNS主要承擔(dān)了域名的解析工作。
-
如果LDNS仍然沒有命中,就直接到Root Server域名服務(wù)器請求解析
-
根域名服務(wù)器返回給本地域名服務(wù)器一個(gè)所查詢域的主域名服務(wù)器(gTLD Server)地址。gTLD是國際頂級域名服務(wù)器,如.com、.cn、.org等,全球只有13臺左右
-
本地域名服務(wù)器(Local DNS Server)再向上一步返回的gTLD服務(wù)器發(fā)送請求
-
接受請求的gTLD服務(wù)器查找并返回此域名對應(yīng)的Name Server域名服務(wù)器的地址,這個(gè)Name Server通常就是你注冊的域名服務(wù)器,例如你在某個(gè)域名服務(wù)提供商申請的域名,那么這個(gè)域名解析任務(wù)就是由這個(gè)域名提供商的服務(wù)器來完成的
-
Name Server域名服務(wù)器會查詢存儲的域名和IP的映射關(guān)系表,正常情況下都會根據(jù)域名得到目標(biāo)IP記錄,連同一個(gè)TTL值返回給DNS Server域名服務(wù)器
-
返回該域名對應(yīng)的IP和TTL值,Local DNS Server會緩存這個(gè)域名和IP的對應(yīng)關(guān)系,緩存時(shí)間由TTL值控制
-
把解析的結(jié)果返回給用戶,用戶根據(jù)TTL值緩存在本地系統(tǒng)緩存中,域名解析過程結(jié)束
在實(shí)際的DNS解析過程中,可能還不止這10個(gè)步驟,如Name Server也可能有多級,或者有一個(gè)GTM來負(fù)載均衡控制,這都有可能會影響域名解析的過程。
CDN工作機(jī)制
CDN也就是內(nèi)容分發(fā)網(wǎng)絡(luò)(Content Delivery Network),它是構(gòu)筑在現(xiàn)有Internet上的一種先進(jìn)的流量分配網(wǎng)絡(luò)。其目的是通過在現(xiàn)有的Internet中增加一層新的網(wǎng)絡(luò)架構(gòu),將網(wǎng)站的內(nèi)容發(fā)布到最接近用戶的網(wǎng)絡(luò)“邊緣”,使用戶可以就近取得所需的內(nèi)容,提高用戶訪問網(wǎng)站的響應(yīng)速度。有別于鏡像,它比鏡像更智能,可以這樣一個(gè)比喻:CDN = 鏡像(Mirror) + 緩存(Cache) + 整體負(fù)載均衡(GSLB)。因而,CDN可以明顯提高Internet中信息流動(dòng)的效率。
目前CDN都以緩存網(wǎng)站中的靜態(tài)數(shù)據(jù)為主,如CSS、JS、圖片和靜態(tài)頁面等數(shù)據(jù)。用戶從主站服務(wù)器請求到動(dòng)態(tài)內(nèi)容后再從CDN上下載這些靜態(tài)數(shù)據(jù),從而加速網(wǎng)頁數(shù)據(jù)內(nèi)容的下載速度,如淘寶有90%以上的數(shù)據(jù)都是由CDN來提供的。
CDN 架構(gòu)
通常的CDN架構(gòu)如下圖所示:
如圖,一個(gè)用戶訪問某個(gè)靜態(tài)文件(如CSS文件),這個(gè)靜態(tài)文件的域名假定是 cdn.taobao.com,那么首先要向Local DNS服務(wù)器發(fā)起請求,一般經(jīng)過迭代器解析后回到這個(gè)域名的注冊服務(wù)器去解析,一般每個(gè)公司都會有一個(gè)DNS解析服務(wù)器。這時(shí)這個(gè)DNS解析服務(wù)器通常會把它重新CNAME解析到另一個(gè)域名,而這個(gè)域名最終會執(zhí)行CDN全局中的DNS負(fù)載均衡服務(wù)器,再由這個(gè)GTM來最終分配時(shí)哪個(gè)地方的訪問用戶,返回給離這個(gè)訪問用戶最近的CDN節(jié)點(diǎn)。
拿到DNS解析結(jié)果后,用戶就直接去這個(gè)CDN節(jié)點(diǎn)訪問這個(gè)靜態(tài)文件了,如果這個(gè)節(jié)點(diǎn)中所請求的文件不存在,就會回到源站與獲取這個(gè)文件,然后再返給用戶。
負(fù)載均衡
負(fù)載均衡(Load Balance)就是對工作任務(wù)進(jìn)行平衡、分?jǐn)偟蕉鄠€(gè)操作單元上執(zhí)行,如圖片服務(wù)器、應(yīng)用服務(wù)器等,共同完成工作任務(wù)。它可以提高服務(wù)器響應(yīng)速度及利用效率,避免軟件或硬件模塊出現(xiàn)單點(diǎn)失效,解決網(wǎng)絡(luò)擁塞問題,實(shí)現(xiàn)地理位置無關(guān)性,為用戶提供較一致的訪問質(zhì)量。
通常由三種負(fù)載均衡架構(gòu),分別是鏈路負(fù)載均衡、集群負(fù)載均衡和操作系統(tǒng)負(fù)載均衡
鏈路負(fù)載均衡
所謂鏈路負(fù)載均衡也就是通過DNS解析成不同的IP,然后用戶根據(jù)這個(gè)IP來訪問不同的目標(biāo)服務(wù)器。負(fù)載均衡是由DNS的解析來完成的,用戶最終訪問哪個(gè)Web Server是由DNS Server來控制的,在這里就是由Global DNS Server來動(dòng)態(tài)解析域名服務(wù)。這種DNS解析的優(yōu)點(diǎn)是用戶會直接訪問目標(biāo)服務(wù)器,而不需要經(jīng)過其他的代理服務(wù)器,通常訪問速度會更快。但是也有缺點(diǎn),由于DNS在用戶本地和Local DNS Server都有緩存,一旦某臺Web Server掛掉,那么很難及時(shí)更新用戶的域名解析結(jié)構(gòu)。如果用戶的域名沒有及時(shí)更新,那么用戶將無法訪問這個(gè)域名,帶來的后果非常嚴(yán)重。
集群負(fù)載均衡
集群負(fù)載均衡是另外一種常見的負(fù)載均衡方式,它一般分為硬件負(fù)載均衡和軟件負(fù)載均衡。
硬件負(fù)載均衡一般使用一臺專門硬件設(shè)備來轉(zhuǎn)發(fā)請求,如圖所示,硬件負(fù)載均衡的關(guān)鍵就是這臺價(jià)格非常昂貴的設(shè)備,如F5,通常為了安全需要一主一備。它的優(yōu)點(diǎn)很顯然就是性能非常好,缺點(diǎn)就是非常貴,一般公司是用不起的,還有就是當(dāng)訪問量陡然增大超出服務(wù)極限時(shí),不能進(jìn)行動(dòng)態(tài)擴(kuò)容。
軟件負(fù)載均衡是使用最普遍的一種負(fù)載方式,它的特點(diǎn)是使用成本非常低,直接使用廉價(jià)的PC就可以搭建。缺點(diǎn)就是一般一次訪問請求要經(jīng)過多次代理服務(wù)器,會增加網(wǎng)絡(luò)延時(shí)。
操作系統(tǒng)負(fù)載均衡
利用操作系統(tǒng)級別的軟中斷或者硬件中斷來達(dá)到負(fù)載均衡,如可以設(shè)置多隊(duì)列網(wǎng)卡等來實(shí)現(xiàn)。
這幾種負(fù)載均衡方式不僅在CDN的集群中能使用,而且在Web服務(wù)或者分布式數(shù)據(jù)集群中同樣也能使用,但是在這些地方后兩種使用得要多一點(diǎn)。
溫馨提示:
以上信息僅作參考,客戶保留所有信息(文字,圖片,視頻,以及其它多媒體)等內(nèi)容修改的權(quán)利。最新的內(nèi)容,以企業(yè)官方為準(zhǔn)!