实际中 ping -w 超时的最小值
The minimum value for ping -w timeout in practice
我正在创建一个网络扫描仪批处理脚本,它基本上可以 ping 192.168。0.x x 从 0 到 255。
我面临的主要问题之一是完成扫描需要多长时间,因此我决定使用 ping 的 -w 选项更改超时长度。
@echo off
title Net Scan
for /f "tokens=1-2 delims=:" %%a in ('ipconfig^|find "IPv4"') do set ip=%%b
set ip=%ip:~1,-3%
for /l %%i in (0,1,255) do ping -n 1 -w 250 %ip%%%i | FIND "TTL="
pause
问题是任何低于 ~500 毫秒标记的 -w 值都不会缩短超时时间,这让我相信实际上 ping 的超时值有一个下限。
我还没有在网上找到任何关于这个的文章,“ping /?”没有回答我的问题
这是 windows 系统上 PING 的一个众所周知的问题。
当运行PING只有1次迭代时它会表现出意外,甚至在第一次超时不到1秒时ping,当超时设置为1秒时,这比延迟更奇怪添加,但并不少见(见下文我捕获了一个这样的例子,他很疯狂。)。
默认的超时时间也没有说清楚,是3秒。
您可以测试 ping 并看到它在 1 ping 设置为小于 2 秒的任何值时表现异常,但真正的问题似乎是由于实例化的开销,它可能比预期值高出大约 500 毫秒ping 命令和调用 TCP/IP 堆栈等
我曾经使用过系统,我在一个端口 agg 上设置了 10g NIC 到一个 nexus 交换机,将大部分 TCP/IP 工作卸载到物理卡上,其中指定给 ping 的值几乎没有任何超时问题。
但是我发现将 PING
命令包装在 For /F 循环中实际上会显着减少执行 ping 所需的时间,从而使它更有可能。
唯一的其他选择是生成许多并行命令 windows,将结果回显到文件中,然后读取它,这样仍然更快。
您可以通过 运行 在 CLI 上进行测试:
echo=%time%&ping -n 1 10.180.7.10>NUL&CALL echo=^%time^%
请注意,Ping 在 -n 2
及以上,或 2000 MS 超时或以上时表现得更加一致。
超时之间的默认值为 1 秒,波动为 x 毫秒,通常波动要小得多,约为 100 - 200 毫秒。
以下是我拥有的 VM 中的一些示例:
樱桃采摘:
C:\Windows\system32>ECHO=!TIME!&Ping -n 1 -l 1 -4 -w 10 10.180.7.10 >NUL&echo=!time!
0:19:35.16
0:19:35.45
(300 MS per ping)
C:\Windows\system32>ECHO=!TIME!&Ping -n 1 -l 1 -4 -w 1000 10.180.7.10 >NUL&echo=!time!
0:21:49.29
0:21:49.95
(660 MS per ping)
C:\Windows\system32>ECHO=!TIME!&Ping -n 1 -l 1 -4 -w 1000 10.180.7.10 >NUL&echo=!time!
0:22:41.45
0:22:42.45
(1000 MS per Ping)
C:\Windows\system32>ECHO=!TIME!&Ping -n 2 -l 1 -4 -w 1 10.180.7.10 >NUL&echo=!time!
0:19:57.54
0:19:59.45
(1910 MS - AKA: 955 MS per Ping)
C:\Windows\system32>ECHO=!TIME!&Ping -n 10 -l 1 -4 -w 10 10.180.7.10 >NUL&echo=!time!
0:18:33.11
0:18:46.96
(13850 MS - AKA: 1385 MS per Ping)
C:\Windows\system32>ECHO=!TIME!&Ping -n 10 -l 1 -4 -w 1 10.180.7.1 >NUL&echo=!time!
0:20:33.93
0:20:42.99
(9060 MS - AKA: 906 MS per ping)
更大的集合:
C:\Windows\system32>cmd /v
Microsoft Windows [Version 10.0.14393]
(c) 2016 Microsoft Corporation. All rights reserved.
C:\Windows\system32>ECHO=!TIME!&Ping -n 10 -l 1 -4 -w 10 10.180.7.10 >NUL&echo=!time!
0:18:33.11
0:18:46.96
C:\Windows\system32>ECHO=!TIME!&Ping -n 10 -l 1 -4 -w 10 10.180.7.10 >NUL&echo=!time!
0:19:12.39
0:19:25.95
C:\Windows\system32>ECHO=!TIME!&Ping -n 1 -l 1 -4 -w 10 10.180.7.10 >NUL&echo=!time!
0:19:35.16
0:19:35.45
C:\Windows\system32>ECHO=!TIME!&Ping -n 1 -l 1 -4 -w 1 10.180.7.10 >NUL&echo=!time!
0:19:43.61
0:19:43.95
C:\Windows\system32>ECHO=!TIME!&Ping -n 2 -l 1 -4 -w 1 10.180.7.10 >NUL&echo=!time!
0:19:57.54
0:19:59.45
C:\Windows\system32>ECHO=!TIME!&Ping -n 2 -l 1 -4 -w 1 10.180.7.1 >NUL&echo=!time!
0:20:14.24
0:20:15.29
C:\Windows\system32>ECHO=!TIME!&Ping -n 10 -l 1 -4 -w 1 10.180.7.1 >NUL&echo=!time!
0:20:33.93
0:20:42.99
C:\Windows\system32>ECHO=!TIME!&Ping -n 1 -l 1 -4 -w 1 10.180.7.1 >NUL&echo=!time!
0:20:57.54
0:20:57.60
C:\Windows\system32>ECHO=!TIME!&Ping -n 1 -l 1 -4 -w 1 10.180.7.10 >NUL&echo=!time!
0:21:08.76
0:21:08.95
C:\Windows\system32>ECHO=!TIME!&Ping -n 1 -l 1 -4 -w 100 10.180.7.10 >NUL&echo=!time!
0:21:43.01
0:21:43.45
C:\Windows\system32>ECHO=!TIME!&Ping -n 1 -l 1 -4 -w 1000 10.180.7.10 >NUL&echo=!time!
0:21:49.29
0:21:49.95
C:\Windows\system32>ECHO=!TIME!&Ping -n 1 -l 1 -4 -w 2000 10.180.7.10 >NUL&echo=!time!
0:22:22.54
0:22:24.45
C:\Windows\system32>ECHO=!TIME!&Ping -n 1 -l 1 -4 -w 2000 10.180.7.10 >NUL&echo=!time!
0:22:34.04
0:22:35.95
C:\Windows\system32>ECHO=!TIME!&Ping -n 1 -l 1 -4 -w 1000 10.180.7.10 >NUL&echo=!time!
0:22:41.45
0:22:42.45
C:\Windows\system32>ECHO=!TIME!&Ping -n 1 -l 1 -4 -w 500 10.180.7.10 >NUL&echo=!time!
0:22:53.92
0:22:54.45
C:\Windows\system32>ECHO=!TIME!&Ping -n 1 -l 1 -4 -w 100 10.180.7.10 >NUL&echo=!time!
0:23:01.53
0:23:01.95
C:\Windows\system32>ECHO=!TIME!&Ping -n 1 -l 1 -4 -w 100 10.180.7.10 >NUL&echo=!time!
0:23:05.81
0:23:05.95
C:\Windows\system32>ECHO=!TIME!&Ping -n 1 -l 1 -4 -w 100 10.180.7.10 >NUL&echo=!time!
0:23:08.98
0:23:09.45
C:\Windows\system32>ECHO=!TIME!&Ping -n 1 -l 1 -4 -w 100 10.180.7.10 >NUL&echo=!time!
0:23:12.93
0:23:13.45
C:\Windows\system32>ECHO=!TIME!&Ping -n 1 -l 1 -4 -w 100 10.180.7.10 >NUL&echo=!time!
0:23:19.37
0:23:19.45
C:\Windows\system32>ECHO=!TIME!&Ping -n 1 -l 1 -4 -w 2300 10.180.7.10 >NUL&echo=!time!
0:43:17.04
0:43:18.95
更快的选择
一个更快的替代方法是将 Ping
包装在 For /F
循环中
@ECHO OFF
FOR /f "tokens=2 delims=:" %%a in ('
ipconfig^|find "IPv4"
') do (
FOR /f "tokens=1-3 delims=. " %%A in ("%%a") do (
ECHO="%%a"_"%%b" ECHO="%%A"_"%%B"_"%%C"
FOR /l %%L in (0,1,255) DO (
FOR /F "Tokens=*" %%l IN ('
ping -n 1 -w 100 %%A.%%B.%%C.%%L
^| FIND /I /V "Pinging "
^| FIND /I /V "Ping Statistics FOR"
^| FIND /I /V "Packets: "
^| FIND /I /V "Approximate round trip "
^| FIND /I /V "Minimum = "
') DO (
CALL ECHO. ^%%TIME^%% - %%A.%%B.%%C.%%L -- %%l
)
)
)
)
ping 大量地址的另一种更快的替代方法是并行执行 ping 并输出到文件,然后键入内容
@ECHO OFF
FOR /f "tokens=2 delims=:" %%a in ('
ipconfig^|find "IPv4"
') do (
FOR /f "tokens=1-3 delims=. " %%A in ("%%a") do (
ECHO="%%a"_"%%b" ECHO="%%A"_"%%B"_"%%C"
FOR /l %%L in (0,1,255) DO (
START CMD /C "ping -n 1 -w 100 %%A.%%B.%%C.%%L >>%%A.%%B.%%C.%%L_Ping.log"
)
)
)
timeout 10
for /R %%_ IN (*_Ping.log) DO (
FOR /F "Tokens=*" %%l IN ('
TYPE "%%~f_" | FIND /I /V "Pinging " | FIND /I /V "Ping Statistics FOR" | FIND /I /V "Packets: " | FIND /I /V "Approximate round trip " | FIND /I /V "Minimum = "
') DO (
FOR /F "Tokens=1 delims=_" %%# IN ("%%~n_") DO (
CALL ECHO. %%TIME%% - %%# -- %%l
)
)
)
我正在创建一个网络扫描仪批处理脚本,它基本上可以 ping 192.168。0.x x 从 0 到 255。
我面临的主要问题之一是完成扫描需要多长时间,因此我决定使用 ping 的 -w 选项更改超时长度。
@echo off
title Net Scan
for /f "tokens=1-2 delims=:" %%a in ('ipconfig^|find "IPv4"') do set ip=%%b
set ip=%ip:~1,-3%
for /l %%i in (0,1,255) do ping -n 1 -w 250 %ip%%%i | FIND "TTL="
pause
问题是任何低于 ~500 毫秒标记的 -w 值都不会缩短超时时间,这让我相信实际上 ping 的超时值有一个下限。 我还没有在网上找到任何关于这个的文章,“ping /?”没有回答我的问题
这是 windows 系统上 PING 的一个众所周知的问题。
当运行PING只有1次迭代时它会表现出意外,甚至在第一次超时不到1秒时ping,当超时设置为1秒时,这比延迟更奇怪添加,但并不少见(见下文我捕获了一个这样的例子,他很疯狂。)。
默认的超时时间也没有说清楚,是3秒。
您可以测试 ping 并看到它在 1 ping 设置为小于 2 秒的任何值时表现异常,但真正的问题似乎是由于实例化的开销,它可能比预期值高出大约 500 毫秒ping 命令和调用 TCP/IP 堆栈等
我曾经使用过系统,我在一个端口 agg 上设置了 10g NIC 到一个 nexus 交换机,将大部分 TCP/IP 工作卸载到物理卡上,其中指定给 ping 的值几乎没有任何超时问题。
但是我发现将 PING
命令包装在 For /F 循环中实际上会显着减少执行 ping 所需的时间,从而使它更有可能。
唯一的其他选择是生成许多并行命令 windows,将结果回显到文件中,然后读取它,这样仍然更快。
您可以通过 运行 在 CLI 上进行测试:
echo=%time%&ping -n 1 10.180.7.10>NUL&CALL echo=^%time^%
请注意,Ping 在 -n 2
及以上,或 2000 MS 超时或以上时表现得更加一致。
超时之间的默认值为 1 秒,波动为 x 毫秒,通常波动要小得多,约为 100 - 200 毫秒。
以下是我拥有的 VM 中的一些示例:
樱桃采摘:
C:\Windows\system32>ECHO=!TIME!&Ping -n 1 -l 1 -4 -w 10 10.180.7.10 >NUL&echo=!time!
0:19:35.16
0:19:35.45
(300 MS per ping)
C:\Windows\system32>ECHO=!TIME!&Ping -n 1 -l 1 -4 -w 1000 10.180.7.10 >NUL&echo=!time!
0:21:49.29
0:21:49.95
(660 MS per ping)
C:\Windows\system32>ECHO=!TIME!&Ping -n 1 -l 1 -4 -w 1000 10.180.7.10 >NUL&echo=!time!
0:22:41.45
0:22:42.45
(1000 MS per Ping)
C:\Windows\system32>ECHO=!TIME!&Ping -n 2 -l 1 -4 -w 1 10.180.7.10 >NUL&echo=!time!
0:19:57.54
0:19:59.45
(1910 MS - AKA: 955 MS per Ping)
C:\Windows\system32>ECHO=!TIME!&Ping -n 10 -l 1 -4 -w 10 10.180.7.10 >NUL&echo=!time!
0:18:33.11
0:18:46.96
(13850 MS - AKA: 1385 MS per Ping)
C:\Windows\system32>ECHO=!TIME!&Ping -n 10 -l 1 -4 -w 1 10.180.7.1 >NUL&echo=!time!
0:20:33.93
0:20:42.99
(9060 MS - AKA: 906 MS per ping)
更大的集合:
C:\Windows\system32>cmd /v
Microsoft Windows [Version 10.0.14393]
(c) 2016 Microsoft Corporation. All rights reserved.
C:\Windows\system32>ECHO=!TIME!&Ping -n 10 -l 1 -4 -w 10 10.180.7.10 >NUL&echo=!time!
0:18:33.11
0:18:46.96
C:\Windows\system32>ECHO=!TIME!&Ping -n 10 -l 1 -4 -w 10 10.180.7.10 >NUL&echo=!time!
0:19:12.39
0:19:25.95
C:\Windows\system32>ECHO=!TIME!&Ping -n 1 -l 1 -4 -w 10 10.180.7.10 >NUL&echo=!time!
0:19:35.16
0:19:35.45
C:\Windows\system32>ECHO=!TIME!&Ping -n 1 -l 1 -4 -w 1 10.180.7.10 >NUL&echo=!time!
0:19:43.61
0:19:43.95
C:\Windows\system32>ECHO=!TIME!&Ping -n 2 -l 1 -4 -w 1 10.180.7.10 >NUL&echo=!time!
0:19:57.54
0:19:59.45
C:\Windows\system32>ECHO=!TIME!&Ping -n 2 -l 1 -4 -w 1 10.180.7.1 >NUL&echo=!time!
0:20:14.24
0:20:15.29
C:\Windows\system32>ECHO=!TIME!&Ping -n 10 -l 1 -4 -w 1 10.180.7.1 >NUL&echo=!time!
0:20:33.93
0:20:42.99
C:\Windows\system32>ECHO=!TIME!&Ping -n 1 -l 1 -4 -w 1 10.180.7.1 >NUL&echo=!time!
0:20:57.54
0:20:57.60
C:\Windows\system32>ECHO=!TIME!&Ping -n 1 -l 1 -4 -w 1 10.180.7.10 >NUL&echo=!time!
0:21:08.76
0:21:08.95
C:\Windows\system32>ECHO=!TIME!&Ping -n 1 -l 1 -4 -w 100 10.180.7.10 >NUL&echo=!time!
0:21:43.01
0:21:43.45
C:\Windows\system32>ECHO=!TIME!&Ping -n 1 -l 1 -4 -w 1000 10.180.7.10 >NUL&echo=!time!
0:21:49.29
0:21:49.95
C:\Windows\system32>ECHO=!TIME!&Ping -n 1 -l 1 -4 -w 2000 10.180.7.10 >NUL&echo=!time!
0:22:22.54
0:22:24.45
C:\Windows\system32>ECHO=!TIME!&Ping -n 1 -l 1 -4 -w 2000 10.180.7.10 >NUL&echo=!time!
0:22:34.04
0:22:35.95
C:\Windows\system32>ECHO=!TIME!&Ping -n 1 -l 1 -4 -w 1000 10.180.7.10 >NUL&echo=!time!
0:22:41.45
0:22:42.45
C:\Windows\system32>ECHO=!TIME!&Ping -n 1 -l 1 -4 -w 500 10.180.7.10 >NUL&echo=!time!
0:22:53.92
0:22:54.45
C:\Windows\system32>ECHO=!TIME!&Ping -n 1 -l 1 -4 -w 100 10.180.7.10 >NUL&echo=!time!
0:23:01.53
0:23:01.95
C:\Windows\system32>ECHO=!TIME!&Ping -n 1 -l 1 -4 -w 100 10.180.7.10 >NUL&echo=!time!
0:23:05.81
0:23:05.95
C:\Windows\system32>ECHO=!TIME!&Ping -n 1 -l 1 -4 -w 100 10.180.7.10 >NUL&echo=!time!
0:23:08.98
0:23:09.45
C:\Windows\system32>ECHO=!TIME!&Ping -n 1 -l 1 -4 -w 100 10.180.7.10 >NUL&echo=!time!
0:23:12.93
0:23:13.45
C:\Windows\system32>ECHO=!TIME!&Ping -n 1 -l 1 -4 -w 100 10.180.7.10 >NUL&echo=!time!
0:23:19.37
0:23:19.45
C:\Windows\system32>ECHO=!TIME!&Ping -n 1 -l 1 -4 -w 2300 10.180.7.10 >NUL&echo=!time!
0:43:17.04
0:43:18.95
更快的选择
一个更快的替代方法是将 Ping
包装在 For /F
循环中
@ECHO OFF
FOR /f "tokens=2 delims=:" %%a in ('
ipconfig^|find "IPv4"
') do (
FOR /f "tokens=1-3 delims=. " %%A in ("%%a") do (
ECHO="%%a"_"%%b" ECHO="%%A"_"%%B"_"%%C"
FOR /l %%L in (0,1,255) DO (
FOR /F "Tokens=*" %%l IN ('
ping -n 1 -w 100 %%A.%%B.%%C.%%L
^| FIND /I /V "Pinging "
^| FIND /I /V "Ping Statistics FOR"
^| FIND /I /V "Packets: "
^| FIND /I /V "Approximate round trip "
^| FIND /I /V "Minimum = "
') DO (
CALL ECHO. ^%%TIME^%% - %%A.%%B.%%C.%%L -- %%l
)
)
)
)
ping 大量地址的另一种更快的替代方法是并行执行 ping 并输出到文件,然后键入内容
@ECHO OFF
FOR /f "tokens=2 delims=:" %%a in ('
ipconfig^|find "IPv4"
') do (
FOR /f "tokens=1-3 delims=. " %%A in ("%%a") do (
ECHO="%%a"_"%%b" ECHO="%%A"_"%%B"_"%%C"
FOR /l %%L in (0,1,255) DO (
START CMD /C "ping -n 1 -w 100 %%A.%%B.%%C.%%L >>%%A.%%B.%%C.%%L_Ping.log"
)
)
)
timeout 10
for /R %%_ IN (*_Ping.log) DO (
FOR /F "Tokens=*" %%l IN ('
TYPE "%%~f_" | FIND /I /V "Pinging " | FIND /I /V "Ping Statistics FOR" | FIND /I /V "Packets: " | FIND /I /V "Approximate round trip " | FIND /I /V "Minimum = "
') DO (
FOR /F "Tokens=1 delims=_" %%# IN ("%%~n_") DO (
CALL ECHO. %%TIME%% - %%# -- %%l
)
)
)