ping-w超时的最小值



Im正在创建一个网络扫描程序批处理脚本,该脚本基本上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的一个众所周知的问题。

当只用1次迭代运行PING时,它可能会出现意外行为,甚至在第一次超时时,当超时设置为1秒时,在不到1秒的情况下进行PING,这比添加的延迟更奇怪,但并不罕见(见下文,我捕捉到了一个这样的例子,它很疯狂。(

默认超时也没有明确说明,但为3秒。

你可以测试ping,并看到它在不到2秒的任何值上设置1个ping时表现得很疯狂,但实际上问题似乎是,由于实例化ping命令和调用TCP/IP堆栈等方面的开销,它可能会比预期值高出约500毫秒。

我使用过我在端口agg到nexus交换机上设置的10g NIC的系统,该交换机将大部分TCP/IP工作卸载到物理卡上,在物理卡上为ping指定的值几乎没有任何超时问题。

然而,我发现将PING命令封装在For/F循环中实际上会显著减少执行ping所需的时间,使其更有可能执行

唯一的其他选择是生成许多并行命令窗口,将结果回显到文件中,然后读取它,这仍然更快。

您可以通过运行以下命令在CLI上进行测试:

echo=%time%&ping -n 1 10.180.7.10>NUL&CALL echo=^%time^%

请注意,Ping在-n 2及以上,或在2000 MS timout或以上时表现得更加一致。

默认情况下,通量为x毫秒的超时间隔为1秒,通常通量要小得多,约为100-200毫秒。


以下是我拥有的VM的一些示例:

樱桃采摘:

C:Windowssystem32>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:Windowssystem32>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:Windowssystem32>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:Windowssystem32>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:Windowssystem32>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:Windowssystem32>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:Windowssystem32>cmd /v
Microsoft Windows [Version 10.0.14393]
(c) 2016 Microsoft Corporation. All rights reserved.
C:Windowssystem32>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:Windowssystem32>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:Windowssystem32>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:Windowssystem32>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:Windowssystem32>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:Windowssystem32>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:Windowssystem32>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:Windowssystem32>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:Windowssystem32>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:Windowssystem32>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:Windowssystem32>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:Windowssystem32>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:Windowssystem32>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:Windowssystem32>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:Windowssystem32>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:Windowssystem32>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:Windowssystem32>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:Windowssystem32>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:Windowssystem32>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:Windowssystem32>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:Windowssystem32>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
)
)
)

最新更新