实际中 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
    )
  )
)