Linux 命令(109)—— ping 命令

1.命令簡介

ping(Packet Internet Groper 命令是因特網包探索器,用於測試網絡連通性,是常用的網絡命令之一。

ping 命令用於向指定的網絡主機發送特殊數據報 IMCP 迴應請求報文(IMCP ECHO_REQUEST),多數網絡設備收到該數據包後會迴應 ICMP 迴應回覆報文 (ICMP Echo-Reply),以此來驗證網絡連接是否正常。

注意:Linux 系統下的 ping 命令與 Windows 系統下的 ping 命令稍有不同。Windows 下運行 ping 命令一般會發出 4 個請求就結束運行該命令;而 Linux 下不會自動終止,此時需要我們按 Ctrl+C 終止或者使用 -c 參數爲 ping 命令指定發送的請求數目。

2.命令格式

ping
ping [OPTIONS] DESTINATION

不跟參數單獨執行 ping 命令將顯示簡短用法。其中參數爲零到多個,目標主機可以是主機 IP 或者域名。

3.選項說明

-4
	只使用 IPv4
-6
	只使用 IPv6
-A
	探測包發送間隔自適應往返時間,這樣網絡中存在的未應答的探測請求一般不會超過一個
-a
  每次發送數據時發出鳴響(Audible)
-B
	不允許 ping 改變包頭的源地址
-b
	允許 ping 一個廣播地址
-c COUNT
  發送 count 個 ECHO_REQUEST 數據包後結束 ping 程序
-D
	在每行前打印時間戳
-d
  使用 socket 的 SO_DEBUG 選項。實際上,Linux 內核不使用這個套接字選項
-F FLOW_LABEL
	僅 IPv6 有效。爲請求包分配一個 20 比特的 flow label。如果 FLOW_LABEL 爲 0,內核會隨機分配
-f
  採用洪泛模式大量且快速地向目標發送數據包。如果發送間隔沒有設置,則默認設置爲 0,並按照報文接受的速度和一百次每秒的速度來發送報文(以最快的爲準)。只有超級用戶能夠將此選項和 -i 0 選項一起使用
-h
	顯示幫助信息
-I INTERFACE
  使用指定的網絡接口地址發送數據包
-i INTERVAL
  每隔 INTERVAL 秒發送一次數據包,默認一秒 ping 一次。只有超級用戶可以將間隔設置爲小於0.2 秒的值
-L
	抑制組播報文回送,只適用於 ping 的目標爲一個組播地址
-l PRELOAD
	在沒有接受到回覆報文之前能發送的最多報文。非超級用戶最多隻能設置爲 3
-M PMTUDISC_OPT
	選擇 Path MTU Discovery 策略模式。PMTUDISC_OPT 取值可以爲 do(不允許分段,甚至不允許在本地分段)、want(找出 PMTU,在如果包太大就在本地分段) 或 dont(不要設置 IP 包首部中的 DF 位,即允許分段)
-m MARK
	使用標記來標記發送的數據包
-n
  只輸出主機 IP 地址,不通過查詢 DNS 獲知 IP 地址對應的主機名,以節省時間
-O
	在發送下一個數據包之前報告未完成的 ICMP Echo 請求
-p PATTERN
  最多指定 16 個字節去填充發送的數據包,這對於診斷網絡中數據依賴問題很有用。例如,-p ff 會將所有的填充數據設置爲 1
-Q TOS
 	用來設置服務質量(Quality of Service )。ICMP 協議有一個 8 bits 的區分服務(Differentiated Services)。低兩位用於分離數據,高 6 位表示區分服務,一般有最小時延、最大吞吐量、最高可靠性、最小代價
-q
  靜態輸出。僅程序啓動和結束時顯示摘要行
-R
  記錄路由過程
-r
  忽略正常的路由表,而直接向主機發送數據包。如果目標主機不再直連的網絡上,則返回異常
-S SNDBUF
		設置套接字的發送緩衝區大小。如果沒有設置,則被設定爲不超過一個報文長度
-s PACKETSIZE
  指定要發送的數據的字節數。默認是 56 字節,與 8 字節的 ICMP 頭部結合剛好是 64 字節的 ICMP 數據包
-T TIMESTAMP_OPTION
	設置 IP 報文的時間戳選項。選項可以是以下三種:
	(1)-T tsonly 只記錄時間戳;
	(2)-T tsandaddr 收集時間戳和 IP 地址;
	(3)-T tsprespec [host1 [host2 [host3[host4]]]] 收集來自預定的網絡地址的時間戳
-t TTL
  設置 IP 包的 TTL 值
-U
	打印完整的用戶對用戶延遲
-V
	顯示版本信息並退出
-v
  詳細模式輸出
-W TIMEOUT
  設置等待 ICMP 響應的超時時間,單位秒
-w DEADLINE
  ping 程序在 DEADLINE 秒後退出,不管發送或接收多少數據包

4.常用示例

(1)顯示 ping 的簡要用法。

ping
Usage: ping [-aAbBdDfhLnOqrRUvV] [-c count] [-i interval] [-I interface]
            [-m mark] [-M pmtudisc_option] [-l preload] [-p pattern] [-Q tos]
            [-s packetsize] [-S sndbuf] [-t ttl] [-T timestamp_option]
            [-w deadline] [-W timeout] [hop1 ...] destination

(2)測試能否 ping 通 IP。

ping 9.134.114.170
PING 9.134.114.170 (9.134.114.170) 56(84) bytes of data.
64 bytes from 9.134.114.170: icmp_seq=1 ttl=64 time=0.033 ms
64 bytes from 9.134.114.170: icmp_seq=2 ttl=64 time=0.040 ms
...

回包正常,表示網絡鏈路通暢。

(3)測試能否 ping 通域名。

ping baidu.com
PING baidu.com (220.181.38.148) 56(84) bytes of data.
64 bytes from 220.181.38.148: icmp_seq=1 ttl=249 time=39.4 ms
64 bytes from 220.181.38.148: icmp_seq=2 ttl=249 time=39.3 ms
...

回包正常,表示網絡鏈路通暢。

(4)每隔 0.5 秒 ping 一次,一共 ping 3 次。

ping -i 0.5 -c 3 baidu.com
PING baidu.com (220.181.38.148) 56(84) bytes of data.
64 bytes from 220.181.38.148: icmp_seq=1 ttl=249 time=39.3 ms
64 bytes from 220.181.38.148: icmp_seq=2 ttl=249 time=39.3 ms
64 bytes from 220.181.38.148: icmp_seq=3 ttl=249 time=39.3 ms

--- baidu.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 39.375/39.390/39.399/0.010 ms

下面簡單地介紹一下 ping 產生的響應內容的含義:

PING baidu.com (220.181.38.148) 56(84) bytes of data.
	表示 ping 目標主機的域名和 IP,以及不帶包頭的包大小和帶包頭的包大小,參考 -s 選項

64 bytes from 220.181.38.148: icmp_seq=1 ttl=249 time=39.3 ms
64 bytes from 220.181.38.148: icmp_seq=2 ttl=249 time=39.3 ms
64 bytes from 220.181.38.148: icmp_seq=3 ttl=249 time=39.3 ms
	icmp_seq:ping 序列,從 1 開始;如果數字不是按順序遞增也就意味着丟包了
	ttl:剩餘的 ttl;見下文的 TTL 解釋
	time: 響應時間,數值越小,通信速度越快

3 packets transmitted, 3 received, 0% packet loss, time 1001ms
	發出去的包數,返回的包數,丟包率,總耗費時間

rtt min/avg/max/mdev = 39.375/39.390/39.399/0.010 ms
	最小/最大/平均響應時間和本機硬件耗費時間

(5)綜合實例,每隔 0.5 秒 ping 一次,一共 ping 3 次,並且設置發送包的大小爲 1024 和 TTL 值爲 255。

ping -i 0.5 -c 3 -s 1024 -t 255 baidu.com
PING baidu.com (39.156.69.79) 1024(1052) bytes of data.
1032 bytes from 39.156.69.79: icmp_seq=1 ttl=249 time=44.8 ms
1032 bytes from 39.156.69.79: icmp_seq=2 ttl=249 time=40.5 ms
1032 bytes from 39.156.69.79: icmp_seq=3 ttl=249 time=40.4 ms

--- baidu.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 40.441/41.927/44.810/2.045 ms

(6)綜合實例,使用 -i 指定發送數據包時間間隔,-c 指定一共發送多少個數據包,-I 指定源地址,-q 直接顯示程序的啓動和最後結果。

ping -i 0.2 -c 3 -I 9.134.114.170 baidu.com -q
PING baidu.com (39.156.69.79) from 9.134.114.170 : 56(84) bytes of data.

--- baidu.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 400ms
rtt min/avg/max/mdev = 40.476/40.541/40.588/0.171 ms

(7)以最快的速度,使用最大的包進行 ping,可用於測試目標主機的承壓能力。

ping -f -s 65507 baidu.com

注意:此用法非常危險,65535(包頭+內容)*100個包每秒=6.25MB,每秒發送 6.25MB 的數據,相當於 50Mbps 的帶寬,完全可能導致目標主機拒絕服務,請謹慎使用。

(8)ping 不通的情況。

ping -c 3 9.9.9.9
PING 9.9.9.9 (9.9.9.9) 56(84) bytes of data.

--- 9.9.9.9 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 1999ms

ping 不通目標主機的常見原因有:

No Answer:原因可能是,對方主機沒工作,雙方網絡配置不正確,路由問題等
Request Time Out:對方主機已關機,路由問題或對端防火牆設置禁止ping
Unknown Host Name:DNS設置問題,或者對方主機不存在
Destination Net Unreachable:雙方沒有建立連接,或對方主機不存在
Bad IP Address:IP 地址不存在或 IP 不能被 DNS 服務器解析
transmit failed,error code:網卡驅動問題
no rout to host:網卡工作不正常
Ping 127.0.0.1 如果ping不通,表明本地機 TCP/IP 協議不能正常工作

5.拓展知識

5.1 TTL

當我們在使用 ping 命令時,返回結果裏會帶一個 TTL 值。這個東西的含義其實就是Time To Live,指的是報文在網絡中能夠存活的限制。以前這個限制方式是設定一個時間(Time To Live中的Time就是這樣來的),當報文在網絡中轉發時,時間超過這個限制,最後一個收到報文的‘路由點’就會把它扔掉,而不繼續轉發。後來把時間限制改爲了跳數限制,就是當報文在網絡中轉發時,每經過一個‘路由點‘,就把預先設定的這個TTL數值減 1,直到最後 TTL=1 時報文就被扔掉,不向下轉發。

路由點:我這裏是指完成路由功能的機器,因爲並不是只有路由器纔可以完成路由轉發功能,比如主機可以配置路由轉發。

所以,回包中的 TTL 表示目標主機返回的報文到達本機後,從它預設的 TTL 值減小到現在的值。

5.2 開啓和禁用 ping 響應

有時爲了保護主機,很多時候我們需要禁止 ICMP 協議,在這種情況下,終端再使用ping命令檢測,服務器不會再做出任何響應。

(1)臨時開啓 ping。

echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all

(2)臨時禁用 ping。

echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all 

(3)永久禁用 ping。在配置文件 /etc/sysctl.conf 中增加如下一行。修改完成後執行sysctl -p使新配置生效

net.ipv4.icmp_echo_ignore_all=1          # 1 表示禁止

(4)永久開啓 ping。在配置文件 /etc/sysctl.conf 中增加如下一行。修改完成後執行 sysctl -p 使新配置生效。

net.ipv4.icmp_echo_ignore_all=0          # 0 表示允許

參考文獻

[1] ping(8) manual
[2] CSDN.ping命令詳解
[3] CSDN.【Linux】一步一步學Linux——ping命令(150)

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