輸入URL之後都發生了什麼

輸入URL之後都發生了什麼

這個標題印象中已經有很多討論了。也來說說這個話題。

從頭開始,當你的電腦使用網線連接到網絡的時候,我們都知道,這個時候你的電腦會獲取一個IP,這個IP就是你的唯一標識了。好了繼續,你在瀏覽器中敲入了http://www.sina.com,開始你的網絡之旅。那麼這個時候問題來了,我們都知道你這個數據是從哪裏的機器來的呢?比如sina的提供這個服務的機器也有個IP,那麼你敲入的www.sina.com怎麼會定位到sina提供機器的IP呢?這裏就是DNS概念了。

DNS

好了,這裏其實最需要的就是域名與IP的對應關係,由於世界上的服務太多了,每個服務都有需要有一個域名和ip的映射,這個量太大了。所以我們將域名按照小數點進行劃分。sina.com,最後一個小數點後面的叫做頂級域名,順次叫做二級域名,三級域名。域名服務商也不是一家,有很多家,大致也是樹形結構,其中管理頂級域名的公司全世界只有13家,其中唯一的一臺主服務器在美國,其他的從域名服務器分別在美國,瑞典,荷蘭和日本。

.com:表示商業機構
.net:表示網絡服務機構
.org:表示非營利性組織
.gov:表示政府機構
.edu:表示教育機構

我們可以使用dig +trace命令來獲取每次域名請求的情況

[yejianfeng@iZ23u681ae1Z ~]$ dig www.126.com +trace

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.23.rc1.el6_5.1 <<>> www.126.com +trace
;; global options: +cmd
.           255442  IN  NS  g.root-servers.net.
.           255442  IN  NS  f.root-servers.net.
.           255442  IN  NS  i.root-servers.net.
.           255442  IN  NS  e.root-servers.net.
.           255442  IN  NS  d.root-servers.net.
.           255442  IN  NS  m.root-servers.net.
.           255442  IN  NS  j.root-servers.net.
.           255442  IN  NS  a.root-servers.net.
.           255442  IN  NS  k.root-servers.net.
.           255442  IN  NS  l.root-servers.net.
.           255442  IN  NS  c.root-servers.net.
.           255442  IN  NS  b.root-servers.net.
.           255442  IN  NS  h.root-servers.net.
;; Received 496 bytes from 10.202.72.116#53(10.202.72.116) in 2 ms

com.            172800  IN  NS  k.gtld-servers.net.
com.            172800  IN  NS  b.gtld-servers.net.
com.            172800  IN  NS  h.gtld-servers.net.
com.            172800  IN  NS  f.gtld-servers.net.
com.            172800  IN  NS  d.gtld-servers.net.
com.            172800  IN  NS  g.gtld-servers.net.
com.            172800  IN  NS  c.gtld-servers.net.
com.            172800  IN  NS  m.gtld-servers.net.
com.            172800  IN  NS  j.gtld-servers.net.
com.            172800  IN  NS  a.gtld-servers.net.
com.            172800  IN  NS  i.gtld-servers.net.
com.            172800  IN  NS  e.gtld-servers.net.
com.            172800  IN  NS  l.gtld-servers.net.
;; Received 501 bytes from 192.5.5.241#53(192.5.5.241) in 33 ms

126.com.        172800  IN  NS  ns2.nease.net.
126.com.        172800  IN  NS  ns3.nease.net.
126.com.        172800  IN  NS  ns4.nease.net.
126.com.        172800  IN  NS  ns5.nease.net.
126.com.        172800  IN  NS  ns6.nease.net.
126.com.        172800  IN  NS  ns7.nease.net.
126.com.        172800  IN  NS  ns1.nease.net.
126.com.        172800  IN  NS  ns8.nease.net.
;; Received 342 bytes from 192.41.162.30#53(192.41.162.30) in 275 ms

www.126.com.        18000   IN  CNAME   mcache.mail.163.com.
mcache.mail.163.com.    18000   IN  CNAME   email.163.com.lxdns.com.
;; Received 93 bytes from 61.135.255.140#53(61.135.255.140) in 29 ms

上面就是說我們請求了5次才尋找出準確的提供服務的機器。

那麼問題來了,這13臺根域名服務器如果掛了,怎麼辦?比如2014年1月21日出現過頂級域名服務出錯的情況,導致了域名服務器錯誤的情況。那麼這種情況,只能說是世界崩潰了。你百度不了,google不了,網絡就請求不了了。一出這種問題,很多流傳的方法都是直接綁定DNS服務器到8.8.8.8,這個是google的服務器。

再說一個DNS的案例,13個頂級的域名服務商在解析了頂級域名之後,會把其他對應的域名解析防盜

好了,這裏有個優化的點了,我一般瀏覽網站的時候都是連續請求一個網站的幾個頁面,每次都去域名服務商那邊查詢這個域名的服務IP,這本身就是腦殘的事情。對於這種腦殘的事情,程序員肯定是不會做的,所以在本機和瀏覽器保存域名和IP的查詢。好了,現在所有瀏覽器一起討論的方法就是請求先去瀏覽器DNS緩存中查找,比如chrome中可以使用

chrome://net-internals/#dns

進行緩存查詢。

然後是本機的DNS緩存,本地的DNS緩存在windows可以通過ipconfig /displaydns進行查找。本地還有一個可以讓人工干預DNS解析的地方,就是hosts文件,有個很好用的工具SwitchHosts可以來進行hosts文件設置。

路由

好了,知道了對方提供服務的機器地址了,但是不幸的事情發生了,它是在上海的,我是在北京的,我們兩個之間並沒有直接的電線進行連接。那麼怎麼辦呢?程序員也想到了一個辦法,驛站。在互聯網中間建立很多站點,這些站點提供的一種服務叫轉接服務。比如我想要連接到www.126.com所在的服務器怎麼辦呢?我可能要中間跳轉10-20次才能到達它的服務器。第一次調轉到北京燕郊,第二次跳轉到河北,...使用traceroute就可以查看你到達一個ip中間跳轉了幾次。

那麼是誰那麼好心建立這些驛站呢?就是運營商。中國現在有6大運營商:中國移動,中國聯通,中國電信,中國網通,中國鐵通和中國衛通。然後長城寬帶據說厚勁勃發,要做第七大運營商。當然這個網絡肯定不是讓大家免費用的,這裏大家就知道了,我們平時交的網費是花在哪裏了。

好了,運營商的厲害之處就知道了吧,如果有運營商使壞,你本來從北京傳遞消息“我愛你”給上海的一臺機器,但是運營商路由傳遞的過程中把這個信息改成了“分手吧”。好了,這下你哭都沒法子了。這個就叫做運營商劫持。現在有的運營商劫持不會很暴露,但是加個廣告,加個js還是很有可能的。

TCP握手

好了,我們現在找到了提供服務的機器了,我們想要從這個機器上獲得一個頁面。機器的行爲和人的行爲很像。對於人來說,A要和B握手,A先伸出手,B也伸出手迴應,你好,我是B,然後A再回應,你好,我是A。這樣一個握手認識的環節就完成了。

在互聯網中,也是這樣的一個三次握手的順序。A要和B服務進行交互,要經過三次握手的環節。A發送一個請求給B,B迴應了一個請求,然後A再發送一個確認請求給B。這樣兩個人的信任關係就搭建完成了。

好了,這裏插入說一種攻擊方式。如果我現在有很多小弟,然後我讓這些小弟都輪番和你進行第一次握手,就是那次伸手環節。但是等你伸手之後,我不對你進行迴應,你就會傻傻在那邊等待我的迴應。這種攻擊就叫做SYN FLOOD攻擊。

搭建完成之後兩邊就進行了數據交互。這裏數據交互的部分我們等會再說。數據交互完之後,這裏就有一個結束交互的環節了。

再想想戀人是如何如何分手呢?兩個戀人決定要分開了,A和B說,我已經不愛你了,B和A說,好,我也已經不愛你了。然後由於A和B都已經確定我們互相不愛了,B就乾脆的說,我們分手吧,A也非常乾脆地說,分手吧。然後兩人就分手了。

這個過程術語叫做四次揮手環節。A和B是雙工的,雙工的意思就是A和B都有接收信道和發送信道。A發送結束信號給B,並且把自己的發送信道設置爲待關閉狀態,B收到A的結束信號之後,先發送一個信號給A,我也可以結束了,並且自己關閉了發送信道。然後再發送一個信號給A,告訴A我最後接收到你的確認之後就把接收信道關閉了。A收到這個確認信號之後,最後發送了一個信號,關閉吧,然後把自己的接收信號給關閉了,也把自己的發送信號給徹底關閉了。B收到這個信號之後,就最後把自己的發送和接收信道就關閉了。

交互消息內容

好了,現在回到雙方交互的時候,進行數據傳遞。首先,A要的其實不是數據,而是一個有圖片,有字體的頁面,B能給的是一個數據。這裏就有一個問題了,如何使用數據來描述一個頁面呢?這裏就需要有一個描述頁面的語言。就叫做HTML。

如果給你一個頁面,讓你描述它。你一定會這麼描述,整個頁面分爲上下兩個部分,上面部分10釐米,下面部分100釐米,上面的部分底色爲藍色,又分爲幾個標題。我要說,你真聰明。實際上我們的頁面切圖也就是這麼切圖的。不過我們的語言不是這樣平白的語言,而是用HTML語言。

<div style="heigh:10px" >
    <div style="width:10px;float:left" ></div>
    <div style="width:10px;float:left" ></div>
    <div style="width:10px;float:left" ></div>
</div>
<div style="heigh:100px"></div>

這HTML語言是1982年之後就創建的。在逐步發展演變過程中成爲了國際的標準,現在所有的瀏覽器都支持這個語言。HTML現在由一個國際組織萬維網聯盟(W3C)來進行維護。

HTML現在的發展歷程已經到了HTML5。HTML1.0, HTML2.0, HTML3.0,HTML4.0,也都是有的,現在最新的是HTML5,2014年10月完成標準制定。在這個之前,HTML5的草案其實已經發布很久了,但是各個瀏覽器對於它的支持也都不一致,等到5.0正式發佈之後,現在瀏覽器對於HTML5的支持已經很強大了。

好了,一般來說,客戶端獲取到了HTML,這個過程就完成了。但是現在角度換到服務端。如果像新聞一樣,所有人看到的東西都一樣,那麼就很簡單了,我把一個HTML文件放在服務器端,你過來拿就行了。但是偏偏現在同樣一個新聞,不同的人看到的東西是不同的。這兩種情況就叫做“靜態頁面”和“動態頁面”。動態頁面需要完成一定的業務邏輯才能返回一個HTML頁面。那麼這個時候服務端就需要寫一些邏輯,於是就有了寫這些邏輯的語言了。現在我們大多數使用的語言有PHP,JAVA,PYTHON等。各種語言有各種語言的優勢,但是總的目的就是爲了生成動態頁面。

AJAX

好了,我們換回瀏覽器角度,我們獲取到HTML之後,然後根據HTML的語意,進行渲染,描繪出我們需要的頁面樣式。

但是,這種頁面是“死”的。意思是什麼。這種頁面我想要在文本中輸入一個字,然後文本提示我,還可以輸入幾個字。這個功能就需要頁面有一個功能“如果用戶輸入了一個字,計算距離20個字還有多少字,修改提示文本”。這個邏輯就需要腳本語言來做,這個就是JavaScript。最早javascript是由一家國外公司netscape進行設計的,後來逐步成爲了一種國際標準。現在所有的瀏覽器都支持javascript語言了。

實際使用中,我們常常會碰到一種需求,我們希望我點擊一個按鈕,這個按鈕不要跳轉到另外一個頁面,而是直接在這個頁面內和服務端做操作,做完操作之後,修改當前頁面的一個元素或者內容。這樣我們的執行效率就會提高了。這種邏輯,我們專門給它一個名詞“AJAX”,由javascript對服務器端發起一個網絡請求,比如請求修改用戶名稱,然後服務器返回說修改成功了,然後客戶端就進行頁面元素的修改。

文章轉自:http://www.cnblogs.com/yjf512/p/4571705.html   原作者:葉劍鋒

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章