Github 訪問失敗或者緩慢?
為什么會訪問失敗或者速度很慢?
國內網絡訪問 Github 速度過慢的原因有許多,但其中最直接和原因是其 CND 域名遭到 DNS 污染,導致我們無法連接使用 GitHub 的加速服務,因此訪問速度緩慢。
簡單理解:CDN「Content Delivery Network」,即內容分發網絡,依靠部署在各地的邊緣服務器,平衡中心服務器的負荷,就近提供用戶所需內容,提高響應速度和命中率。DNS 污染,是指一些刻意或無意制造出來的數據包,把域名指向不正確的 IP 地址,阻礙了網絡訪問。
我們默認從目標網址的最近 CDN 節點獲取內容,但當節點過遠或 DNS 指向錯誤時,就會操成訪問速度過慢或無法訪問的問題。
訪問慢、無法加載還是無法通訊?
這三種情況是有區別的,含義不一樣:
- 訪問慢:連接延遲高,內容能夠被加載但需要較長的時間。
- 無法加載:瀏覽器無法打開網址。
- 無法通訊:無法進行直接的網絡通訊,包括了上一種情況。
自然導致這三種情況的原因也不盡相同:
- 訪問慢:服務器或 CDN 節點的地理位置相對較遠,難以物理超度。注意這里的表現是延遲高,不一定是每秒傳輸速度慢。
- 無法加載:可能由於長時間的未響應,即訪問慢的情況,導致瀏覽器判定無法加載內容;可能由於網址對應內容不能被直接訪問,即無可訪問內容或無權限訪問。
- 無法通訊:這類情況往往是 IP 解析錯誤,即遭受 DNS 污染;否則就是 IP 服務器出現了內部錯誤。
檢測一下
可以利用兩個工具來判斷不同域名或 IP 地址是上述那種情況。筆者以github.com
為例,實際操作一遍檢測的過程,看看是什么情況:
- 首先利用網絡上的
ping
工具,例如這個,檢測網址、IP 地址的通訊情況。輸入要檢測的網址github.com
,點擊「Ping 檢測」。工具提供的服務是利用自己分布在各地的網絡節點的本機ping
工具,執行對網址的ping
操作,匯總結果,統計響應網址的服務器 IP。 - 檢測結果如下圖示。共計 106 個檢測點,其中接受響應速度最快的節點在加拿大,目標服務器對其響應時間為 14ms;最慢在中國香港,響應時間 243ms。在成功訪問的所有節點中,目標服務器的平均響應時間是 163.5ms。地圖與顏色響應了國內不同省市的訪問時間,紅色說明訪問超時,白色說明沒有參與節點;約偏向綠色則響應時間越短。右側還有一個統計表。這里的情況是:國內節點無法
ping
通github.com
,即無法建立網絡通訊。
- 再往下便是具體的每個節點的響應信息。
網絡上的ping
工具能為我們提供三個重要的信息:首先,如果存在ping
通的節點,那么 IP 服務器沒有宕機;其次,響應 IP 匯總表提供了所有可能的服務器與 CDN 的 IP 地址;最后,具體信息部分可以點擊響應時間排序,我們可以找到響應最快的服務器 IP。
- 接着我們使用自己電腦的
ping
工具來測試網絡。打開終端,輸入ping [ip address]
,替換其中的 IP 地址或域名即可。我們不ping
域名,那樣會ping
向設置的 DNS 解析出來的 IP 地址。我們ping
上一步得到的響應最快的服務器。
ping 140.82.114.4 # 這個IP是響應最快的,來自加拿大
ping 192.30.253.112 # 這個IP也可以響應,來自中國香港
這一步說明,如果我們網絡設置的 DNS 解析出的github.com
的 IP 無法在本機ping
通,我們便不能夠訪問該網址。這也是后面通過修改系統 Hosts 文件來解決訪問失敗問題的原因。
最后我們可以用瀏覽器嘗試直接打開ping
通的 IP 地址。其結果是:140.82.114.4
無法被瀏覽器加載;192.30.253.112
可以加載出 Github 首頁。
檢測結果
上一步操作的結果就是我們判斷三種情況的依據。
- 通過
192.30.253.112
響應的github.com
,屬於「訪問慢」,可以連接但延遲較高;IP 可以被瀏覽器加載。 - 通過
140.82.114.4
響應的github.com
,同樣屬於「訪問慢」;但被瀏覽器直接加載時,屬於「無法加載」,即可以ping
通但無法直接訪問。 - 通過
13.229.188.59
響應的github.com
,屬於「無法通訊」,無法建立鏈接。
域名,網址與 IP 地址
上面提到的這些東西有點亂了,整理一下。
- 「IP 地址」:每個連接到互聯網的主機都會被分配一個 IP 地址,用來唯一標識該主機,節點之間的訪問通過 IP 地址來進行,形如
192.30.253.112
。 - 「域名」:IP 地址使用數字標識,使用時不好記憶書寫,因此在 IP 地址的基礎上又發展出一種符號化的地址方案,來代替數字型的 IP 地址。每一個符號化的地址都與特定的 IP 地址對應。IP 地址相對應的字符型地址,就被稱為域名。形如
github.com
。 - 「網址」:URL「統一資源定位符」,俗稱為網址。瀏覽器地址欄輸入的字符串,服務器上儲存文件的位置。格式為:
<協議>://<域名或IP>:<端口>/<路徑>
。<協議>://<域名或IP>
是必需的,<端口>/<路徑>
有時可省略。形如https://www.github.com
。 - 「DNS」:域名雖然便於人們記憶,但節點之間通過 IP 地址通訊。兩者之間的轉換工作稱為域名解析,域名解析需要由專門的域名解析服務器來完成,即 DNS 服務器。域名的最終指向是 IP 地址。
注意,IP 地址和域名是一對多的關系。一個 IP 可以對應多個不同的域名,但是一個域名只能對應一個 IP 地址。就跟人的名字一樣,你可以有多個名字。但這些名字都是指的你。
然而我們利用網絡工具測試時,發現github.com
有多個響應 IP 服務器。這就是開頭提到的 CDN 服務。多個平行的服務器響應,均勻了中心服務器的負載,使得網絡通訊更加迅速。
現實的情況是,github.com
啟用的 CDN 節點遭到了 DNS 污染,錯誤的 IP 指向,包括錯誤 IP、響應過慢的 IP,都會造成我們訪問 Github 失敗。
方案:修改 Hosts 文件
再總結一下 Github 訪問失敗或者緩慢的原因:本機網絡設置的 DNS 服務器解析 Github 相關域名到遭受污染的 IP 地址,這些 IP 地址要么本身無法訪問,要么節點過遠,從而導致了訪問失敗或者速度緩慢。
那么我們修改的方案可以是:
- 修改本機 Hosts 文件,主動建立域名與 IP 的映射關系,訪問到這些域名時直接使用 Hosts 指定的 IP,繞過 DNS 解析。
- 修改網絡的 DNS 服務器,換到能夠解析出合適 IP 的 DNS 服務器。
顯然第一種方案更加方便。因為 DNS 服務器儲存的映射關系是動態更新的,無法直接控制。直接修改本機 Hosts 文件,鎖定域名對應的 IP,更加有效方便。當然,Hosts 文件的作用就是綁定域名與 IP 的映射關系。
Windows 修改 Hosts 文件
- 打開 cmd,修改 Hosts 文件:
C:\Windows\System32\drivers\etc\hosts
- 刷新網絡 DNS 緩存:
ipconfig /flushdns
當前 IP 值
列出當前使用的 Github 相關域名比較合適的 IP 值。其中的設置可以解決github.com
頭像無法顯示的問題:
#Github xj
52.192.72.89 github.com
54.251.140.56 nodeload.github.com
203.208.39.99 api.github.com
203.208.39.99 github.global.ssl.fastly.net
140.82.113.9 codeload.github.com
185.199.108.133 raw.github.com
185.199.108.153 training.github.com
185.199.108.153 assets-cdn.github.com
185.199.108.153 documentcloud.github.com
185.199.108.154 help.github.com
185.199.108.153 githubstatus.com
185.199.111.133 raw.githubusercontent.com
185.199.108.133 cloud.githubusercontent.com
185.199.108.133 gist.githubusercontent.com
185.199.108.133 marketplace-screenshots.githubusercontent.com
185.199.108.133 repository-images.githubusercontent.com
185.199.108.133 user-images.githubusercontent.com
185.199.108.133 desktop.githubusercontent.com
185.199.108.133 avatars.githubusercontent.com
185.199.108.133 avatars0.githubusercontent.com
185.199.108.133 avatars1.githubusercontent.com
185.199.108.133 avatars2.githubusercontent.com
185.199.108.133 avatars3.githubusercontent.com
185.199.108.133 avatars4.githubusercontent.com
185.199.108.133 avatars5.githubusercontent.com
185.199.108.133 avatars6.githubusercontent.com
185.199.108.133 avatars7.githubusercontent.com
185.199.108.133 avatars8.githubusercontent.com
不一定保證每一項都是正確、有效的,但目前來說實測能夠穩定訪問 Github。