Ping 兩臺服務器,服務器 A 的表現為:兩三秒才出一條 Ping 的信息,但是 Ping 值低;服務器 B 表現為:不到一秒就能出一條 Ping 的信息,但是 Ping 值比A 高。兩臺都不丟包。請問實際使用的話哪臺線路會比較快呢?

當然是前者,因為前者Ping的RTT < 后者Ping 的RTT

RTT = Round Trip Time。通俗地說,就是從Ping包(ICMP Request)離開你的主機Ping程序開始讀秒計時,到Ping包的回應包(ICMP Reply)被Ping程序接收時刻讀秒結束。讀秒器顯示的時間差,即為RTT

一般來說,RTT越小,說明服務器距離本機的物理距離越近。但是這并不是絕對的,為了證明哪臺服務器距離近,需要多次long term采樣,將每次采樣的的最小RTT取平均值,誰小可能說明誰近。

以上的結論并不絕對,僅僅是一個參考值。因為影響RTT值的大小,不僅和物理距離大小有關,還和服務器這條end-to-end路徑網絡擁堵有關,因為一旦擁堵,Ping包會在buffer queue等待時間大小不等,相當于變相增加傳輸時間。

既然前者RTT小,為何前者需要花2-3秒才打印輸出?而后者RTT大,為何1秒不多就打印輸出?

Ping 服務器的IP地址

題主采用Ping 服務器的IP地址,Ping包的回應接收到之后,RTT時間已經計算好了,卻扭扭捏捏沒有立即打印。在干嘛呢?

原來Ping程序會嘗試將服務器的IP地址反向解析成域名,使用GetHostnamebyAddress()這個接口函數,無論Succeeded還是Failed:

前者的Query time latency > 后者的Query time latency

Failed的情況下,會嘗試多次重傳。前者Succeeded的情況可能是在DNS Cache服務器沒有,需要到root服務器一級級查下來,用時大。而后者則在DNS Cache服務器查詢成功,立馬返回,無需多次往返跑。

無論Succeeded還是Failed,影響打印輸出的兩個元素:RTT + Query time latency

很顯然 前者的RTT + Query time latency >后者的RTT + Query time latency

按照上文的意思,第一個Ping包反向DNS解析如果成功了,會本地緩存,那么第二個Ping包不應該需要2-3秒才打印輸出,直接使用本地緩存,立馬就可以打印了,不是嗎?

Ping程序一根筋,不使用緩存,每次Ping包都使用GetHostnameByAddress()接口函數查詢。

在查詢失敗的情況下,壓根沒有本地緩存。每次都需要經歷相同的Query 超時時間。

Ping 服務器的域名

Ping程序會首先使用GetAddressByHostanme()將域名解析成IP地址,前者的

前者的Query time latency > 后者的Query time latency

其它部分和第一種情況完全相似,故省略。

既然前者服務器的DNS時間耗時大,RTT小,選擇它會不會整體響應慢呢?

對于TCP-based瀏覽器等應用,會優先使用本地DNS Cache,除了第一次可能響應慢一些。接下來就直接使用DNS Cache,整體響應、有效傳輸速率會更高一些。

對于TCP-based程序,最大傳輸速率= Advertised Window/RTT

Advertised Window相同的情況下,誰的RTT小,誰的傳輸速率大。