如何从命令行监视Windows上的网络流量

时间:2010-01-31 10:33:11

标签: command-line network-programming monitoring

如何从命令行监控Windows上的网络流量;特别是下载/上传速度和上传/下载的数据量?这样做有脚本/批处理吗?

4 个答案:

答案 0 :(得分:7)

虽然tshark非常强大,但如果你想要有细粒度的统计数据(根据主机,协议......),它的主要缺点是在运行时收集统计数据。因此,它只会报告“即时”统计信息,但不会报告常规时间点的投票流量,以便了解您的网络流量在一天,一周内的变化情况......

此外,当tshark使数据包捕获时,会产生一些开销。

因此,根据您的需要,您可能对MS Windows netnetstat命令感兴趣(netstat可以选择按协议报告统计信息)。就网络流量统计而言,'net statistics [Server|workstation]''netstat [-e|-s]'是Linux等效的Linux 'ifconfig'(或'cat /proc/net/dev',如果您愿意的话)。

请注意,正如ifconfig所做的那样,netnetstat仅报告自界面启动以来的数据量。

为了获得流量速率,您必须为这些命令调用时间戳并自行进行计算。

AFAIK,这两个命令都附带了所有最新的MS Windows版本。

答案 1 :(得分:4)

您可以将tshark与-z <statistics>参数一起使用。只需搜索Wireshark即可。它是开源和多平台。

答案 2 :(得分:4)

Windows中的

typeperf应该可以获取数据。

typeperf "\Network Interface(*)\....
typeperf -q "Network Interface" will list all the object
\Network Interface(*)\Bytes Total/sec
\Network Interface(*)\Packets/sec
\Network Interface(*)\Packets Received/sec
\Network Interface(*)\Packets Sent/sec
\Network Interface(*)\Current Bandwidth
\Network Interface(*)\Bytes Received/sec
\Network Interface(*)\Packets Received Unicast/sec
\Network Interface(*)\Packets Received Non-Unicast/sec
\Network Interface(*)\Packets Received Discarded
\Network Interface(*)\Packets Received Errors
\Network Interface(*)\Packets Received Unknown
\Network Interface(*)\Bytes Sent/sec
\Network Interface(*)\Packets Sent Unicast/sec
\Network Interface(*)\Packets Sent Non-Unicast/sec
\Network Interface(*)\Packets Outbound Discarded
\Network Interface(*)\Packets Outbound Errors
\Network Interface(*)\Output Queue Length
\Network Interface(*)\Offloaded Connections

答案 3 :(得分:1)

我想给你一个更简单的解决方案,然后我用我之前的答案编写一个新的Windows批处理脚本,每10秒迭代一次。它监视下载并在控制台中上传带宽/速度,并记录在.csv文件中传输的大量字节。

@ECHO off
SETLOCAL ENABLEDELAYEDEXPANSION

set TAB=    
echo Timestamp%TAB%Down bytes%TAB%Up bytes%TAB%Down speed%TAB%Up speed

:: Store console command result
:looptask
SET count=1
FOR /F "tokens=* USEBACKQ" %%F IN (`netstat -e`) DO (
  SET string!count!=%%F
  SET /a count=!count!+1
)
:: Bytes transfered line is string3

:: Get rid of the whitespaces 
:loopreplace
if defined string3 (
  set "new=!string3:  = !"
  if "!new!" neq "!string3!" (
    set "string3=!new!"
    goto :loopreplace
  )
)
if defined string3 if "!string3:~0,1!" equ " " set "string3=!string3:~1!"
if defined string3 if "!string3:~-1!" equ " " set "string3=!string3:~0,-1!"

:: Extracting bytes downloaded and uploaded
set line=%string3:~6%
FOR /F "tokens=1,2 delims= " %%A IN ("%line%") DO (
  set dbytes=%%~A
  set ubytes=%%~B
)

:: Midnight epoch
for /F "usebackq tokens=1,2 delims==" %%i in (`wmic os get LocalDateTime /VALUE 2^>NUL`) do if '.%%i.'=='.LocalDateTime.' set ldt=%%j
set time=%ldt:~8,2%:%ldt:~10,2%:%ldt:~12,2%
FOR /F "tokens=* delims=0" %%A IN ("%ldt:~8,2%") DO SET /A hs=%%A+0
FOR /F "tokens=* delims=0" %%A IN ("%ldt:~10,2%") DO SET /A min=%%A+0
FOR /F "tokens=* delims=0" %%A IN ("%ldt:~12,2%") DO SET /A sec=%%A+0
set /a epoch=%hs%*3600+%min%*60+%sec%

:: Calc speeds
if not defined LOOPCOMPLETE (
    echo %time%%TAB%%dbytes%%TAB%%ubytes%%TAB%0.00 KB/s%TAB%0.00 KB/s
    goto :skip
)
:: Read .CSV file last line values
for /f %%i in ('find /v /c "" ^< bwlog.csv') do set /a lines=%%i
set /a lastLine=%lines% - 1
SET count=1
FOR /F "tokens=* USEBACKQ" %%F IN (`more /e +%lastLine% bwlog.csv`) DO (
  SET string!count!=%%F
  SET /a count=!count!+1
)
FOR /F "tokens=1,2,3 delims=," %%A IN ("%string1%") DO (
  set lasttime=%%~A
  set lastdown=%%~B
  set lastup=%%~C
)
if %epoch% == %lasttime% (  
    goto :skip
)
set /a dspeed=(dbytes-lastdown)/(epoch-lasttime)/10
set ddec=%dspeed:~-2%
set /a dspeed=(dbytes-lastdown)/(epoch-lasttime)/1000
set /a uspeed=(ubytes-lastup)/(epoch-lasttime)/10
set udec=%dspeed:~-2%
set /a uspeed=(ubytes-lastup)/(epoch-lasttime)/1000
echo %time%%TAB%%dbytes%%TAB%%ubytes%%TAB%%dspeed%.%ddec% KB/s%TAB%%uspeed%.%udec% KB/s
:skip

:: Append the .CSV file 
echo %epoch%,%dbytes%,%ubytes% >> "bwlog.csv"

:: Do every 10 seconds
set LOOPCOMPLETE=1
timeout /t 10 /nobreak >nul
goto :looptask

ENDLOCAL

PS:Windows限制是计数器每4GB转移一次并在午夜重置。

使用任务scheduller和XAMPP的旧解决方案:

我必须根据您的情况监控并记录下载的数据量,并发现使用 Windows任务scheduller 运行脚本比寻找免费更快将通常的图形信息转储到文件中的软件。也许我自制的剧本适合你。

我使用XAMPP for Windows启动了本地Apache / PHP服务器,并从命令行运行此脚本。例如:

"C:\xampp\php\php.exe -f C:\xampp\htdocs\bwlog.php"

bwlog.php脚本使用@phep answer建议的Windows命令netstat -e。您可以使用记事本创建脚本文件,代码为:

<?php
//Task to schedule "C:\xampp\php\php.exe -f C:\xampp\htdocs\bwlog.php"
//Store console command result
$netstat=shell_exec("netstat -e");
//Start of the bytes transfered line
$line=substr($netstat,strpos($netstat,"Bytes"));    
//End of the line
$line=substr($line,0,strpos($line,"\n"));   
//Get rid of the whitespaces 
$bytes=preg_replace('/\s+/', ' ',$line);    
//Extracting only bytes downloaded
$bytes=substr($bytes,$start=strpos($bytes,' ')+1,strrpos($bytes,' ')-$start);
//Append the .CSV file  
file_put_contents('C:\xampp\htdocs\bwlog.csv',PHP_EOL.time().', '.$bytes,FILE_APPEND);
?>

然后我在电子表格软件中处理 .csv 来计算下载速度(带宽),使用2个字节值之间的差异超过2个匹配之间的差异时间值(字节/秒)。

随意请求修复以记录上传的字节。希望它有用。