這是從我開始經營 RP 主機 以來,被問及的最多的一個問題。
本文將以診斷「爲何我沒法訪問一個網站」的方式,講述 Web 服務的大體工做流程。html
一般來說,所謂訪問一個網站,咱們輸入給瀏覽器的是相似於這樣的一個地址:nginx
http://jysperm.me/note/1519
用術語來說,這是一個 URI, 一個 URI 有兩個部分,一是協議,二是定位符。
好比『mailto:jysperm@gmail.com』這是一個郵箱的標識符,其中『mailto』是協議,『jysperm@gmail.com』是定位符。
再好比『urn:isbn:9787115281487』這是一本書(HTTP 權威指南)的標識符。git
用來表示網頁的 URI 有一個比較特殊的名字叫 URL, 它大體分紅這幾個部分:github
除此以外還可能會有相似於『?id=1519』的查詢字符串。瀏覽器
這樣的一個 URL, 即可以定位到一個網頁。安全
首先咱們要找到爲咱們提供服務的服務器,即 URL 中的主機名,在這裏是 jysperm.me.服務器
TCP/IP 網絡中經過 IP 地址來惟一地定位一臺主機,更確切地說,每一塊網卡,會有一個惟一的 IP 地址。
IP 地址形如 117.121.25.186, 它自己是存在必定結構性的,好比 117.121.25.186 和 117.121.25.187,就有很是大的可能性二者的物理距離很近。
這樣的結構性方便於計算機之間互相聯絡,但不便於人類記憶,因而咱們用由字母組成的域名來表示主機。網絡
咱們經過一個叫 DNS 的系統,來將域名翻譯成 IP 地址,DNS 系統自己說簡單也簡單,說複雜也複雜,在這裏咱們只講述如何使用,而不研究其原理。curl
若是瀏覽器給你的提示是相似於『沒法找到 jysperm.me』或者『沒法鏈接到 jysperm.me』,那麼有很大可能性是 DNS 查找失敗或者出錯。
咱們可使用 nslookup 這個命令來手動進行 DNS 查詢工具
> nslookup jysperm.me Server: 8.8.8.8 Address: 8.8.8.8#53 Non-authoritative answer: Name: jysperm.me Address: 117.121.25.186
能夠看到,咱們向 8.8.8.8(Google 的免費公衆 DNS), 查詢 jysperm.me 這個域名,它返回給咱們的結果是 117.121.25.186.
這裏是 8.8.8.8 是系統的默認 DNS 服務器,咱們還能夠本身來指定 DNS 查詢服務器:
> nslookup jysperm.me 114.114.114.114 Server: 114.114.114.114 Address: 114.114.114.114#53 Non-authoritative answer: Name: jysperm.me Address: 117.121.25.186
這裏使用了國內的 114.114.114.114 進行查詢,返回的結果是同樣的。
在某些網絡封鎖比較嚴重的國家,DNS 查詢的結果可能會被篡改,由於 DNS 自己幾乎沒有任何安全措施,因此查詢到的結果可能並非可靠的。
知道了服務器的 IP 地址,下一步是創建 TCP 鏈接。這一步最常遇到的問題有:
首先 IP 層面,要向一臺主機發送數據,這個主機必須是『可達的』,換句話說就是對方必須在線。
最簡單的,咱們能夠用 ping 命令驗證一個主機是否在線:
$ ping 117.121.25.186 PING 117.121.25.186 (117.121.25.186): 56 data bytes 64 bytes from 117.121.25.186: icmp_seq=0 ttl=128 time=138.651 ms 64 bytes from 117.121.25.186: icmp_seq=1 ttl=128 time=71.345 ms 64 bytes from 117.121.25.186: icmp_seq=2 ttl=128 time=286.960 ms
ping 使用的是 ICMP ECHO 指令,就比如你跟對方打招呼,問它是否在線,若是對方迴應了,就說明它在線。可是,並不是全部服務器都會迴應 ICMP ECHO.
若是發現 ping 命令沒有迴應,相似於下面的狀況:
> ping 59.24.3.173 PING 59.24.3.173 (59.24.3.173): 56 data bytes Request timeout for icmp_seq 0 Request timeout for icmp_seq 1 Request timeout for icmp_seq 2
那麼就說明你和服務器直接沒有創建連通的鏈接,可是,鏈接是在那裏斷開的呢?這時咱們能夠用 traceroute 來探測數據包所走過的路徑:
> traceroute www.qq.com traceroute to www.qq.com (180.96.86.192), 64 hops max, 52 byte packets 1 * * * 2 100.64.0.1 (100.64.0.1) 10.224 ms 5.379 ms 6.794 ms 3 218.4.12.229 (218.4.12.229) 8.342 ms 6.817 ms 8.169 ms 4 218.94.165.2 (218.94.165.2) 8.128 ms 8.259 ms 7.173 ms 5 61.155.133.121 (61.155.133.121) 11.152 ms 9.288 ms 9.990 ms 6 202.102.69.254 (202.102.69.254) 11.464 ms 12.463 ms 11.027 ms 7 180.96.51.94 (180.96.51.94) 13.674 ms 13.192 ms 12.364 ms 8 180.96.48.202 (180.96.48.202) 13.564 ms 11.213 ms 13.945 ms 9 * * *
traceroute 依賴於 ICMP, 並不是全部服務器都開啓了 ICMP, 所以會有一些路徑點被顯示爲星號。
咱們再來看另外一個不可達的例子:
> traceroute twitter.com traceroute to twitter.com (59.24.3.173), 64 hops max, 52 byte packets 1 * * * 2 100.64.0.1 (100.64.0.1) 4.694 ms 4.502 ms 8.044 ms 3 218.4.12.237 (218.4.12.237) 8.874 ms 5.177 ms 8.133 ms 4 218.4.13.49 (218.4.13.49) 15.205 ms 11.400 ms 12.011 ms 5 202.97.55.41 (202.97.55.41) 14.011 ms 15.794 ms 16.518 ms 6 202.97.50.254 (202.97.50.254) 12.207 ms 12.614 ms 13.165 ms 7 202.97.35.78 (202.97.35.78) 12.246 ms 202.97.35.22 (202.97.35.22) 13.337 ms 202.97.34.126 (202.97.34.126) 13.701 ms 8 202.97.60.33 (202.97.60.33) 58.292 ms 12.432 ms 18.093 ms 12 * * *
能夠看到,最後一個能夠追蹤到的路徑點是 202.97.60.33, 經過一些 IP 庫能夠查到,這個地址屬於「廣東省廣州市 互聯網交換中心」,能夠打個電話問問他們那邊出了什麼狀況。
訪問一個網頁會發起不止一個請求,除了網頁自己還會加載一些例如樣式,圖片,腳本之類的資源,甚至不少時候還會加載來自其餘網站的資源,經過 Chrome 的開發人員工具中的「Network」選項卡,能夠看到加載一個頁面所發起的全部請求。
這是一個正常的網站, 全部的資源都加載成功了:
再看下面這張圖,其中一個資源沒有加載完成,致使整個頁面都沒法完成,這時咱們就能夠經過上面的方法單獨排查這一個請求。
經過瀏覽器來檢查一個資源究竟能不能下載在一些複雜狀況下並不可靠,由於瀏覽器會爲你的請求加上大量的參數,並且在獲得資源後,還會進行渲染。
所以爲了「純粹」地下載一個資源,咱們能夠用 curl:
> curl http://pomotodo.com -I HTTP/1.1 302 Moved Temporarily Server: nginx Date: Fri, 01 Aug 2014 03:51:35 GMT Content-Type: text/html Content-Length: 154 Connection: keep-alive Location: https://pomotodo.com/
能夠看到 http://pomotodo.com 並不是像咱們看到的那樣顯示了一個頁面,而是發起了一個到 SSL 版本地址的重定向,SSL 能夠保證傳輸的私密性,目前國內只有很小一部分有節操的網站在使用。
等到全部資源都加載完了,可是頁面仍是沒有內容,或者亂七八糟怎麼辦?
在正確地獲得全部資源後,瀏覽器會執行網站提供的腳本,來對資源進行加工,以便像網站製做者指望的那樣來展示頁面。
在這個過程當中,腳本須要使用瀏覽器提供的 API 來進行渲染,而不一樣的瀏覽器所支持的 API 是有差別的,所以一些製做不是很精良的網站會在不一樣的瀏覽器中呈現不一樣的效果,甚至直接出錯。
在此建議你們選擇一個現代而強大的瀏覽器,好比 Chrome, 這樣能夠保證瀏覽器支持網頁所須要的功能。