Skip to content
Network7 min readPublished: August 14, 2026

How to Audit Per-Process Network Bandwidth on Windows and Linux

Learn how to identify which applications, services, and background daemons are consuming upload and download bandwidth using native CLI tools and lightweight network inspection.

Written by Elena Rostova · Network Security & Protocols Engineer
Share:𝕏RedditLinkedIn

The Quick Diagnostic

When your internet connection stutters, ping spikes in gaming, or upload bandwidth is maxed out, you need to identify the exact Process ID (PID) responsible.

Quick Commands: * **Windows (PowerShell)**:

powershell
Get-NetTCPConnection | Where-Object State -eq "Established" | Select-Object LocalAddress, LocalPort, RemoteAddress, RemotePort, OwningProcess | Sort-Object OwningProcess
  • Linux (CLI):
bash
sudo ss -tupn state established
  • Focused GUI: Use NetSniffer for instant per-process throughput graphs without launching heavy packet capture suites.

---

Method 1: Windows Resource Monitor (Built-in GUI)

Resource Monitor (resmon.exe) is Windows' built-in diagnostic tool for tracking active socket throughput.

  1. Press Ctrl + Shift + Esc $\rightarrow$ Performance tab $\rightarrow$ click Open Resource Monitor (or run resmon.exe).
  2. Select the Network tab.
  3. Review the top pane: Processes with Network Activity:
  4. * Send (B/sec): Current upload rate.
  5. * Receive (B/sec): Current download rate.
  6. * Total (B/sec): Combined socket throughput.
  7. Check the box next to any process to filter the lower pane (Network Activity) to inspect its destination IP addresses and ports.

---

Method 2: Inspecting Sockets via PowerShell

To correlate established connections with actual process names in a single script:

powershell
Get-NetTCPConnection -State Established |
  ForEach-Object {
    $proc = Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue
    [PSCustomObject]@{
      ProcessName = $proc.ProcessName
      PID         = $_.OwningProcess
      RemoteIP    = $_.RemoteAddress
      RemotePort  = $_.RemotePort
    }
  } | Format-Table -AutoSize

This returns an actionable table showing every process currently holding an open TCP socket.

---

Method 3: Linux CLI Diagnostics (nethogs & ss)

On Linux systems, socket ownership is maintained in /proc/net/ and kernel socket tables.

1. `nethogs` (Per-Process Bandwidth Breakdown) If installed (`sudo apt install nethogs` or `sudo dnf install nethogs`):

bash
sudo nethogs eth0

This displays an interactive terminal UI ranking processes by sent and received KB/s.

2. Native `ss` (Zero Dependency)

bash
sudo ss -tunp

Flags explained: * -t: TCP sockets * -u: UDP sockets * -n: Numeric ports/IPs (avoids DNS resolution delays) * -p: Show process name and PID

---

The Problem with Heavy Network Suites

Many packet sniffers and firewall managers install custom NDIS filter drivers, inject packet hooks into every network packet, and consume hundreds of megabytes of RAM.

NetSniffer takes a clean, local-first approach: * Interrogates the OS TCP/IP stack via native kernel APIs (GetExtendedTcpTable on Windows, netlink on Linux). * Zero packet injection, zero background services. * Shows process name, bandwidth rate, remote IP, and geographic routing in an instant, bloat-free window.

Frequently Asked Technical Questions

Open Resource Monitor by pressing `Win + R`, typing `resmon.exe`, and navigating to the `Network` tab. Expand `Processes with Network Activity` and sort by `Total (B/sec)` to see real-time transfer rates per executable.

Elena Rostova

Network Security & Protocols Engineer

GitHub

Focuses on local packet capture, socket lifecycle analysis, telemetry auditing, and privacy-preserving networking tools.

Focus:Socket InspectionPacket InspectionDNS DiagnosticsApplication Telemetry Auditing

Related Systems Guides

View all guides →