1. 程式人生 > >從瀏覽器地址欄輸入網址,到網頁徹底打開,中間都發生了什麽?

從瀏覽器地址欄輸入網址,到網頁徹底打開,中間都發生了什麽?

流氓軟件 打開 軟件 獲取 大量 上一個 負責 一段 動態腳本

從瀏覽器地址欄輸入網址,到網頁徹底打開,中間都發生了什麽?

這是一道經典面試題,以前我以為只有我喜歡出這道題,後來在微博上發現其他技術大牛也出這道題。

這道題其實測試的不是具體特定的技術,而是對整個上網這個概念以及背後流程的理解。

我先說一下我所理解或者說我所期待的大概的答題要點,後面再解釋這道題的目的和意義,實際上所謂上網這個過程分為三個大的區塊,一塊是客戶端,一塊是網絡傳輸層,一塊是服務端。

從輸入網址開始,這個網址在客戶端就會有一個解析,首先瀏覽器如果有鉤子,可能會直接對這個網址做出判斷和反饋,比如國內大部分第三方瀏覽器(IE瀏覽器基礎上加殼的那種),都會直接把地址輸入關鍵詞後應該跳轉到微軟搜索頁的那個url劫持掉,所以第一步是瀏覽器對url的判斷和劫持,第二步是本地host文件的判斷,在360崛起之前,host文件也是各種木馬和流氓軟件最愛處理修改的文件,不聲不響就把你的hao123給劫持了,而且你幾乎看不出來哪裏改了。

那麽逃脫本地客戶端的判斷後,這個域名查詢請求會發到服務商的dns服務器,服務商的dns服務器會檢查緩存,如果不存在你要訪問的這個域名或者緩存狀態已經過期,會訪問根域名服務器,根域名服務器也會先檢查緩存,如果無法直接返回結果,會檢查這個域名是哪個dns服務器負責解析的,然後將請求轉發過去,獲得這個域名所對應的ip,然後返回給本地服務商的dns,本地服務商的dns就更新緩存,然後把ip返回給客戶端。

當然這裏本地dns服務商也可能基於某種目的劫持域名,至於GFW,在這裏只能說呵呵吧, 但另一個眾所周知的案例是,如果你的IE地址欄輸入錯關鍵詞,應該默認是跳轉到微軟的搜索頁,假設你用的是原版ie,並且本地沒有裝各種會給ie加插件的工具,那麽你的請求應該是微軟搜索頁的,但是在地方電信這塊依然會被劫持掉,改為當地電信的搜索結果頁。所以有時候,有些用戶會把自己電腦上網配置的dns修改為更可信賴的公共dns,而不是地方電信的dns。(地方電信的劫持能力當然不止是dns,還包括內容替換,強插。不過這是後面的內容。)

關於解析到ip,復雜點的還可以說說cdn的原理和機制,以及針對不同地區用戶智能解析的機制。不過這裏就不展開了,當然展開了我也未必說的清楚。

到了ip這裏,瀏覽器發出請求,去指定ip獲取指定的文件,這裏涉及路由尋址和報文傳輸,當然如果細說我也說不清了,但是至少知道用tracert可以跟蹤路由就好。然後到了指定ip,服務器會在80端口有一個守護進程接受這個請求,細說的話這裏還有三次握手的協議,那麽下面就是webserver是怎麽工作的,靜態頁面的處理比較簡單,動態腳本還需要一個解釋器系統工作,執行一段代碼後將返回結果輸出。這裏可能又涉及有服務端緩存的,數據庫,負載均衡和輪詢等等,也就是可能後面不是一臺主機,而是一個集群。再往下變成架構師專題了,就更不能展開了。

但是到這裏沒完,為什麽呢,返回的這個內容頁往往又包含了大量的嵌入頁面請求,比如css,比如各種小圖標,小圖片,這又涉及瀏覽器發出請求,這裏也存在一些需要註意的邏輯,比如瀏覽器在發出請求時,對數量和排隊的限制。此外,這個內容頁可能還涉及了一些可執行代碼,是在瀏覽器上執行的,這也對你看到什麽有重要的影響。

但是到這裏依然還沒完,在到了目標機房,以及數據返回你的電腦時,都存在一個在子網被劫持被篡改的風險,ARP欺騙,ARP協議是什麽,為什麽你要訪問的內容會被劫持會被篡改。此外,在傳輸中會不會被偵聽,會不會被篡改,上文提過,除了GFW,還有強大的地方電信。

啰嗦這麽一堆,可能有人會覺得,我就應聘一個服務端程序員/前端技術/運維工程師,我需要知道這些麽?那麽問題來了,通常我問這個題目的時候,還會包含一到兩個引申題目。

題目1:如果有個用戶跟你說,你的網站/遊戲很卡很慢,你該怎麽分析,怎麽響應?

題目2:如果有個用戶跟你說,打開你的網站會彈出淫蕩小廣告或殺毒軟件報有木馬,你該怎麽分析,怎麽響應?

看到這些,相信很多人都會發現,哎呀,這還真是個常見問題啊。而這種常見問題的排查,其實就涉及了如上的每個步驟。卡和慢究竟是客戶端,網絡層還是傳輸層的問題?如何快速排查和定位出問題,以及影響範圍? 這個思考題今天不展開,但是如果沒有上面那個流程的認識,這個題目你肯定不可能給出好的結果。

說一個觀點,全棧工程師為什麽現在這麽被看重,是因為大部分問題出現的時候,問題並不會告訴你,它是屬於哪個領域的,而需要你來摸索,排查,如果你不具備綜合的視野和開闊的思路,你很可能無法找到問題的關鍵所在。你的能力又怎麽體現呢?

其實是不是我們同時需要精通前端,精通網絡協議,精通服務端,這個的確太難,但是有一個整體框架的思路,再去精通其中一個領域,你的能力和視野就會上一個臺階,至少在排查問題,技術協同等各個方面會顯得更專業,更有自信。

我剛開始接觸互聯網的時候,剛開始寫web程序的時候,那真是一竅不通,我寫一個cgi程序,我想讓他運行起來,我都糊裏糊塗,不知道這個東西是怎麽運行的,我跑一個webserver,設置目錄權限,糊裏糊塗,以及最早看著coolfire的一個黑客手冊照貓畫虎去拿別人服務器權限的時候,還是糊裏糊塗,很長時間都不知道這玩意到底原理是蝦米。 我總在想,那些年就沒有人跟我講這些,幫我梳理一下,所以當時很多東西做出來,但是不明白其發生作用的機制,更不明白如何更好的調優和細化。

梳理一下這些,其實花不了太多時間和精力,而梳理後對認識問題的提升,是巨大的,對技術協同意識的提升,也是巨大的。

從瀏覽器地址欄輸入網址,到網頁徹底打開,中間都發生了什麽?