介紹
ping的工作原理很簡(jiǎn)單,一臺(tái)網(wǎng)絡(luò)設(shè)備發(fā)送請(qǐng)求等待另一網(wǎng)絡(luò)設(shè)備的回復(fù),并記錄下發(fā)送時(shí)間。接收到回復(fù)之后,就可以計(jì)算報(bào)文傳輸時(shí)間了。只要接收到回復(fù)就表示連接是正常的。耗費(fèi)的時(shí)間喻示了路徑長(zhǎng)度。重復(fù)請(qǐng)求響應(yīng)的一致性也表明了連接質(zhì)量的可靠性。因此,ping回答了兩個(gè)基本的問(wèn)題:是否有連接?連接的質(zhì)量如何?本文主要討論這兩個(gè)問(wèn)題。
更多信息
正常的ping操作主要是兩個(gè)特定的ICMP消息,ECHO_REQUEST和ECHO_REPLY。理論上,所有TCP/IP網(wǎng)絡(luò)設(shè)備都應(yīng)當(dāng)通過(guò)返回報(bào)文來(lái)響應(yīng)ECHO_REQUEST,但實(shí)際上并不總是如此。
ping的解析:
大多數(shù)操作系統(tǒng)版本,會(huì)一直發(fā)送ECHO_REQUESTs,直到中斷為止。例如:
bsd1# ping www.bay.com
PING www.bay.com (204.80.244.66): 56 data bytes
64 bytes from 204.80.244.66: icmp_seq=0 ttl=112 time=180.974 ms
64 bytes from 204.80.244.66: icmp_seq=1 ttl=112 time=189.810 ms
64 bytes from 204.80.244.66: icmp_seq=2 ttl=112 time=167.653 ms
^C
--- www.bay.com ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max/stddev = 167.653/179.479/189.810/9.107 ms
bsd1#
這一過(guò)程被Ctrl-C中斷,此時(shí)打印出匯總統(tǒng)計(jì)。
上述結(jié)果中,針對(duì)每一個(gè)報(bào)文的回復(fù)給出了報(bào)文大小,來(lái)源,ICMP sequence number,TTL值,以及往返時(shí)間。其中,sequence number和往返時(shí)間對(duì)于評(píng)估基本連接狀況來(lái)說(shuō)是最有用的信息。
當(dāng)發(fā)送一個(gè)ECHO_REQUEST時(shí),將發(fā)送時(shí)間記錄在報(bào)文里,并復(fù)制到遠(yuǎn)端主機(jī)相應(yīng)的ECHO_REPLY報(bào)文中。當(dāng)接收到ECHO_REPLY時(shí),通過(guò)比較當(dāng)前時(shí)間與報(bào)文時(shí)間計(jì)算出耗費(fèi)時(shí)間。如果沒(méi)有收到符合該sequence number的報(bào)文,則認(rèn)為該報(bào)文丟失。耗費(fèi)時(shí)間長(zhǎng)短以及變化范圍取決于中間鏈路數(shù)量,速度,以及鏈路擁塞情況。
什么值是合理的呢?這一值高度取決于網(wǎng)絡(luò)以及網(wǎng)絡(luò)質(zhì)量。如果是在LAN網(wǎng)絡(luò)環(huán)境下,響應(yīng)時(shí)間還是很快的,通常在十幾毫秒范圍之內(nèi)。如果連接到外網(wǎng)則該值會(huì)顯著增加。如果是遠(yuǎn)程站點(diǎn),可能會(huì)耗時(shí)上百毫秒。
你也可以用ping來(lái)粗略計(jì)算連接的吞吐量。在外網(wǎng)上發(fā)送兩個(gè)不同大小的報(bào)文,通過(guò)-s選項(xiàng)來(lái)完成。時(shí)間長(zhǎng)度的差別會(huì)反映大報(bào)文中額外數(shù)據(jù)所耗費(fèi)的時(shí)間。例如,假設(shè)ping 100字節(jié)耗費(fèi)30ms而ping 1100字節(jié)耗費(fèi)60ms,因此,往返額外花費(fèi)30ms單程額外花費(fèi)15ms,多發(fā)送1000字節(jié)或8000比特。吞吐量近似為每15ms 8000比特或540,000bps。兩個(gè)測(cè)量值之間的差異用來(lái)扣除開(kāi)銷(xiāo)。當(dāng)然這一估算是非常粗略的,沒(méi)有考慮到路徑上其他數(shù)據(jù)流的情況,也沒(méi)有考慮路徑上所有鏈路的情況。
TTL貌似可以估算一條路徑上的跳數(shù),但是這有一些問(wèn)題。當(dāng)發(fā)送報(bào)文時(shí),TTL字段先被初始化接著經(jīng)過(guò)路徑上每個(gè)路由器都要遞減。如果達(dá)到0,報(bào)文就被丟棄了。從而對(duì)所有報(bào)文生命周期有一定限制。因而在路由回環(huán)的過(guò)程中,報(bào)文不會(huì)無(wú)期限存在于網(wǎng)絡(luò)上。不幸的是,TTL字段可能會(huì),也可能不會(huì)被遠(yuǎn)端設(shè)備重置,如果重置,也沒(méi)有一致性。因此,要使用TTL字段估算路徑中的跳數(shù)需要知道詳細(xì)的系統(tǒng)信息。
通常一串穩(wěn)定的回復(fù)意味著健康的連接。如果報(bào)文丟失或丟棄,可以在sequence number中看到跳數(shù),以及丟失報(bào)文的編號(hào)。偶爾丟失一個(gè)報(bào)文不表示真的有什么問(wèn)題。特別是跨越多臺(tái)路由器或擁塞網(wǎng)絡(luò)時(shí)。一個(gè)序列中的一個(gè)報(bào)文丟失或耗費(fèi)明顯更長(zhǎng)時(shí)間是很正常的,這是因?yàn)槁窂街懈鳁l鏈路需對(duì)第一個(gè)報(bào)文做ARP解析。在ARP數(shù)據(jù)保存之后,后續(xù)報(bào)文就不會(huì)有這種開(kāi)銷(xiāo)。但是,如果丟失報(bào)文比例較大,則有可能路徑上有問(wèn)題。
某些情況下會(huì)收到ICMP錯(cuò)誤消息。通常來(lái)自路由器,這里面包含很有用的信息。例如,下例中,設(shè)備嘗試訪問(wèn)一個(gè)不存在的網(wǎng)絡(luò)上的設(shè)備:
bsd1# ping 172.16.4.1
PING 172.16.4.1 (172.16.4.1): 56 data bytes
36 bytes from 172.16.2.1: Destination Host Unreachable
Vr HL TOS Len ID Flg off TTL Pro cks Src Dst
4 5 00 5400 5031 0 0000 fe 01 0e49 172.16.2.13 172.16.4.1
36 bytes from 172.16.2.1: Destination Host Unreachable
Vr HL TOS Len ID Flg off TTL Pro cks Src Dst
4 5 00 5400 5034 0 0000 fe 01 0e46 172.16.2.13 172.16.4.1
^C
--- 172.16.4.1 ping statistics ---
2 packets transmitted, 0 packets received, 100% packet loss
由于路由器沒(méi)有到達(dá)該網(wǎng)絡(luò)的路徑,所以返回ICMP DESTINATION_HOST_UNREACHABLE信息。通常如果問(wèn)題發(fā)生在運(yùn)行ping命令的設(shè)備上,則會(huì)收到Destination Host Unreachable告警或 Destination Network Unreachable告警。如果問(wèn)題發(fā)生在轉(zhuǎn)發(fā)報(bào)文的設(shè)備上,則只會(huì)收到一條Destination Host Unreachable。
下例中,嘗試向一臺(tái)已配置拒絕從源設(shè)備接收數(shù)據(jù)流的路由器發(fā)送數(shù)據(jù):
bsd1# ping 172.16.3.10
PING 172.16.3.10 (172.16.3.10): 56 data bytes
36 bytes from 172.16.2.1: Communication prohibited by filter
Vr HL TOS Len ID Flg off TTL Pro cks Src Dst
4 5 00 5400 5618 0 0000 ff 01 0859 172.16.2.13 172.16.3.10
36 bytes from 172.16.2.1: Communication prohibited by filter
Vr HL TOS Len ID Flg off TTL Pro cks Src Dst
4 5 00 5400 561b 0 0000 ff 01 0856 172.16.2.13 172.16.3.10
^C
--- 172.16.3.10 ping statistics ---
2 packets transmitted, 0 packets received, 100% packet loss
被過(guò)濾條件阻止的告警信息表明報(bào)文被丟棄。但也有可能過(guò)濾條件不顯示該告警。
下例中,
bsd1# ping 172.16.3.10
PING 172.16.3.10 (172.16.3.10): 56 data bytes
^C
--- 172.16.3.10 ping statistics ---
6 packets transmitted, 0 packets received, 100% packet loss
路由器上使用同樣的過(guò)濾條件,但應(yīng)用于離開(kāi)網(wǎng)絡(luò)的數(shù)據(jù)流,而不作用于inbound數(shù)據(jù)流。因此,沒(méi)有消息發(fā)送。這時(shí),ping就無(wú)法告訴你為什么報(bào)文沒(méi)有收到回復(fù)。
ping的選項(xiàng):
一些選項(xiàng)控制發(fā)送報(bào)文的速率和數(shù)量,-c選項(xiàng)允許用戶(hù)指定發(fā)送報(bào)文的數(shù)量。例如,ping –c10會(huì)發(fā)送10個(gè)報(bào)文然后停止。這一命令在腳本中很有用處。
命令-f和-l用于將報(bào)文泛洪到網(wǎng)絡(luò)上。-f選項(xiàng)表明報(bào)文發(fā)送速率與接收主機(jī)能夠處理速率相同。這一參數(shù)可用于鏈路壓力測(cè)試或接口性能比較。
-l選項(xiàng)用于計(jì)數(shù),盡可能快的發(fā)送該數(shù)量報(bào)文,然后恢復(fù)正常。該命令用于測(cè)試處理泛洪的能力,需要root權(quán)限執(zhí)行。
-i選項(xiàng)用于用戶(hù)在兩個(gè)連續(xù)報(bào)文之間指定等待秒數(shù)。該命令對(duì)于將報(bào)文間隔開(kāi)或用在腳本中非常有用。正常情況下,偶然的ping包對(duì)數(shù)據(jù)流的影響是很小的。但重復(fù)報(bào)文或報(bào)文泛洪影響就很大了。因此,使用以上選項(xiàng)時(shí)需謹(jǐn)慎。
-n選項(xiàng)將輸出限制為數(shù)字形式,這在碰見(jiàn)DNS問(wèn)題時(shí)很有用。-v顯示更詳盡輸出,較少輸出為-q和-Q。
-s選項(xiàng)指定發(fā)送數(shù)據(jù)的大小。但如果設(shè)置的太小,小于8,則報(bào)文中就沒(méi)有空間留給時(shí)間戳了。設(shè)置報(bào)文大小能診斷有路徑MTU(Maximum Transmission Unit)設(shè)置或分段而導(dǎo)致的問(wèn)題。如果不使用該選項(xiàng),ping默認(rèn)是64字節(jié)。






