從瀏覽器地址欄輸入網(wǎng)址,到網(wǎng)頁徹底打開,中間都發(fā)生了什么?
這是一道經(jīng)典面試題,以前我以為只有我喜歡出這道題,后來在微博上發(fā)現(xiàn)其他技術大牛也出這道題。
這道題其實測試的不是具體特定的技術,而是對整個上網(wǎng)這個概念以及背后流程的理解。
我先說一下我所理解或者說我所期待的大概的答題要點,后面再解釋這道題的目的和意義,實際上所謂上網(wǎng)這個過程分為三個大的區(qū)塊,一塊是客戶端,一塊是網(wǎng)絡傳輸層,一塊是服務端。
從輸入網(wǎng)址開始,這個網(wǎng)址在客戶端就會有一個解析,首先瀏覽器如果有鉤子,可能會直接對這個網(wǎng)址做出判斷和反饋,比如國內大部分第三方瀏覽器(IE瀏覽器基礎上加殼的那種),都會直接把地址輸入關鍵詞后應該跳轉到微軟搜索頁的那個url劫持掉,所以第一步是瀏覽器對url的判斷和劫持,第二步是本地host文件的判斷,在360崛起之前,host文件也是各種木馬和流氓軟件最愛處理修改的文件,不聲不響就把你的hao123給劫持了,而且你幾乎看不出來哪里改了。
那么逃脫本地客戶端的判斷后,這個域名查詢請求會發(fā)到服務商的dns服務器,服務商的dns服務器會檢查緩存,如果不存在你要訪問的這個域名或者緩存狀態(tài)已經(jīng)過期,會訪問根域名服務器,根域名服務器也會先檢查緩存,如果無法直接返回結果,會檢查這個域名是哪個dns服務器負責解析的,然后將請求轉發(fā)過去,獲得這個域名所對應的ip,然后返回給本地服務商的dns,本地服務商的dns就更新緩存,然后把ip返回給客戶端。
當然這里本地dns服務商也可能基于某種目的劫持域名,至于GFW,在這里只能說呵呵吧, 但另一個眾所周知的案例是,如果你的IE地址欄輸入錯關鍵詞,應該默認是跳轉到微軟的搜索頁,假設你用的是原版ie,并且本地沒有裝各種會給ie加插件的工具,那么你的請求應該是微軟搜索頁的,但是在地方電信這塊依然會被劫持掉,改為當?shù)仉娦诺乃阉鹘Y果頁。所以有時候,有些用戶會把自己電腦上網(wǎng)配置的dns修改為更可信賴的公共dns,而不是地方電信的dns。(地方電信的劫持能力當然不止是dns,還包括內容替換,強插。不過這是后面的內容。)
關于解析到ip,復雜點的還可以說說cdn的原理和機制,以及針對不同地區(qū)用戶智能解析的機制。不過這里就不展開了,當然展開了我也未必說的清楚。
到了ip這里,瀏覽器發(fā)出請求,去指定ip獲取指定的文件,這里涉及路由尋址和報文傳輸,當然如果細說我也說不清了,但是至少知道用tracert可以跟蹤路由就好。然后到了指定ip,服務器會在80端口有一個守護進程接受這個請求,細說的話這里還有三次握手的協(xié)議,那么下面就是webserver是怎么工作的,靜態(tài)頁面的處理比較簡單,動態(tài)腳本還需要一個解釋器系統(tǒng)工作,執(zhí)行一段代碼后將返回結果輸出。這里可能又涉及有服務端緩存的,數(shù)據(jù)庫,負載均衡和輪詢等等,也就是可能后面不是一臺主機,而是一個集群。再往下變成架構師專題了,就更不能展開了。
但是到這里沒完,為什么呢,返回的這個內容頁往往又包含了大量的嵌入頁面請求,比如css,比如各種小圖標,小圖片,這又涉及瀏覽器發(fā)出請求,這里也存在一些需要注意的邏輯,比如瀏覽器在發(fā)出請求時,對數(shù)量和排隊的限制。此外,這個內容頁可能還涉及了一些可執(zhí)行代碼,是在瀏覽器上執(zhí)行的,這也對你看到什么有重要的影響。
但是到這里依然還沒完,在到了目標機房,以及數(shù)據(jù)返回你的電腦時,都存在一個在子網(wǎng)被劫持被篡改的風險,ARP欺騙,ARP協(xié)議是什么,為什么你要訪問的內容會被劫持會被篡改。此外,在傳輸中會不會被偵聽,會不會被篡改,上文提過,除了GFW,還有強大的地方電信。
啰嗦這么一堆,可能有人會覺得,我就應聘一個服務端程序員/前端技術/運維工程師,我需要知道這些么?那么問題來了,通常我問這個題目的時候,還會包含一到兩個引申題目。
題目1:如果有個用戶跟你說,你的網(wǎng)站/游戲很卡很慢,你該怎么分析,怎么響應?
題目2:如果有個用戶跟你說,打開你的網(wǎng)站會彈出淫蕩小廣告或殺毒軟件報有木馬,你該怎么分析,怎么響應?
看到這些,相信很多人都會發(fā)現(xiàn),哎呀,這還真是個常見問題啊。而這種常見問題的排查,其實就涉及了如上的每個步驟。卡和慢究竟是客戶端,網(wǎng)絡層還是傳輸層的問題?如何快速排查和定位出問題,以及影響范圍? 這個思考題今天不展開,但是如果沒有上面那個流程的認識,這個題目你肯定不可能給出好的結果。
說一個觀點,全棧工程師為什么現(xiàn)在這么被看重,是因為大部分問題出現(xiàn)的時候,問題并不會告訴你,它是屬于哪個領域的,而需要你來摸索,排查,如果你不具備綜合的視野和開闊的思路,你很可能無法找到問題的關鍵所在。你的能力又怎么體現(xiàn)呢?
其實是不是我們同時需要精通前端,精通網(wǎng)絡協(xié)議,精通服務端,這個的確太難,但是有一個整體框架的思路,再去精通其中一個領域,你的能力和視野就會上一個臺階,至少在排查問題,技術協(xié)同等各個方面會顯得更專業(yè),更有自信。
我剛開始接觸互聯(lián)網(wǎng)的時候,剛開始寫web程序的時候,那真是一竅不通,我寫一個cgi程序,我想讓他運行起來,我都糊里糊涂,不知道這個東西是怎么運行的,我跑一個webserver,設置目錄權限,糊里糊涂,以及最早看著coolfire的一個黑客手冊照貓畫虎去拿別人服務器權限的時候,還是糊里糊涂,很長時間都不知道這玩意到底原理是蝦米。 我總在想,那些年就沒有人跟我講這些,幫我梳理一下,所以當時很多東西做出來,但是不明白其發(fā)生作用的機制,更不明白如何更好的調優(yōu)和細化。
梳理一下這些,其實花不了太多時間和精力,而梳理后對認識問題的提升,是巨大的,對技術協(xié)同意識的提升,也是巨大的。
|
|