How to Configure TCP Pacing Profiles in Windows 11 Using PowerShell

In standard TCP congestion control implementations, when a sender receives acknowledgments (ACKs) from a destination, it frequently dispatches an entire congestion window’s worth of data in an immediate, contiguous burst of packets. In high-speed local networks and low-latency internet connections, these micro-bursts cause transient queue buildup in intermediate network switches and edge routers. This phenomenon — commonly known as bufferbloat — leads to packet drops, jitter spikes, and sudden latency degradation for concurrent real-time traffic such as VoIP, video conferencing, and competitive gaming.

To eliminate burst-induced packet loss and smooth out transmission queues, modern network protocols implement TCP Pacing. Instead of releasing packets in concentrated bursts upon ACK arrival, the operating system’s network stack spaces outgoing packets evenly across the calculated round-trip time (RTT). Windows 11 provides native TCP pacing management through the PacingProfile attribute in PowerShell’s NetTCPIP module.

Understanding TCP Pacing Architecture and Profile Modes

TCP pacing alters the transmit timing within the Windows kernel transport layer (tcpip.sys) and network interface driver queues. By pacing packet delivery, the sender achieves a consistent, predictable packet flow rate matching the available bottleneck link bandwidth.

In Windows 11, the PacingProfile parameter can be configured with four distinct operational behaviours:

  • Disabled: TCP pacing is completely turned off. Packets are transmitted immediately in bursts as determined by the congestion window and flow control limits.
  • Always: Pacing is continuously enforced across all active TCP connections assigned to the profile. Every outbound packet is scheduled at regular intervals calculated from the current estimated bandwidth and smoothed round-trip time (SRTT).
  • Offload: Pacing calculations and scheduling are delegated to hardware network adapters supporting hardware rate limiting or packet pacing offload (such as modern enterprise 10GbE/25GbE Intel, Mellanox/Nvidia, and Broadcom NICs), freeing CPU cycles.
  • InitialCwnd: Pacing is applied exclusively during the initial connection handshake and slow-start phase (the initial congestion window), preventing packet bursts when establishing new HTTP/HTTPS sessions before reverting to standard delivery.

Inspecting Current TCP Pacing Configurations in PowerShell

To inspect the active TCP pacing profiles across all network templates in Windows 11, open an elevated PowerShell window (Run as Administrator) and execute the Get-NetTCPSetting cmdlet:

Get-NetTCPSetting | Select-Object SettingName, PacingProfile, CongestionProvider, AutoTuningLevelLocal | Format-Table -AutoSize

To inspect the detailed attributes of the default client profile (Internet) and high-speed data centre profile (Datacenter):

Get-NetTCPSetting -SettingName "Internet" | Select-Object SettingName, PacingProfile, MemoryPressureProtection, DelayedAckTimeoutMs

By default on standard consumer Windows 11 installations, PacingProfile is set to InitialCwnd or Disabled depending on the operating system build version and network adapter capabilities.

Configuring TCP Pacing Profiles with Set-NetTCPSetting

You can configure pacing directly across specific TCP settings templates or custom profiles using Set-NetTCPSetting.

Enabling Continuous Pacing on the Internet Profile

To enforce continuous pacing across standard outbound internet traffic — ideal for remote streaming, large file uploads, and home lab gateways — set the profile to Always:

Set-NetTCPSetting -SettingName "Internet" -PacingProfile Always

Enabling Hardware Pacing Offload

If your machine is equipped with a server-grade network adapter or modern Wi-Fi 6E/7 NIC that supports hardware rate pacing, configure hardware offload to eliminate CPU timer overhead:

Set-NetTCPSetting -SettingName "Internet" -PacingProfile Offload

(If the underlying network driver does not support hardware pacing offload, the Windows TCP/IP stack automatically falls back to software-based pacing timers.)

Enabling Pacing for Custom or Data Centre Workloads

If you run local Hyper-V virtual switches, storage arrays, or Docker/WSL2 development environments utilizing the Datacenter or InternetCustom templates, enable pacing across those templates:

Set-NetTCPSetting -SettingName "Datacenter" -PacingProfile Always
Set-NetTCPSetting -SettingName "InternetCustom" -PacingProfile Always

To apply continuous pacing universally across all available TCP profiles in a single command:

Get-NetTCPSetting | Set-NetTCPSetting -PacingProfile Always

Confirm the new settings have taken effect:

Get-NetTCPSetting | Select-Object SettingName, PacingProfile

Verifying Hardware Pacing Offload Support in Network Adapters

To determine whether your physical network adapter supports hardware-assisted transmission pacing and quality-of-service offloading, query adapter hardware properties via PowerShell:

Get-NetAdapterAdvancedProperty | Where-Object { $_.DisplayName -like "*Pacing*" -or $_.DisplayName -like "*QoS*" -or $_.DisplayName -like "*Rate Limit*" } | Select-Object DisplayName, DisplayValue

For Intel and Mellanox network adapters, verify that hardware packet pacing and send buffer coalescing are enabled in the NDIS driver configuration:

Get-NetAdapter | Select-Object Name, InterfaceDescription, Status, LinkSpeed

Validating Jitter Reduction and Network Smoothness

After enabling TCP pacing, validate that packet bursts have smoothed out and bufferbloat is reduced during saturated network uploads.

Perform an upload latency stress test while pinging an external reference gateway (such as Cloudflare DNS 1.1.1.1) in PowerShell:

# Run sustained ping test to measure latency jitter under load
Test-NetConnection -ComputerName "1.1.1.1" -InformationLevel Detailed

To observe transmission rate regularity and packet pacing counters directly, query performance monitor counters:

Get-Counter -Counter "\TCPv4\Segments Sent/sec", "\Network Interface(*)\Bytes Sent/sec" -Continuous

With pacing enabled, packet output curves will show consistent, steady data rates rather than sharp alternating peaks and troughs.

Reverting to Default Windows 11 TCP Pacing Settings

If specialized legacy applications or local benchmarks require immediate burst transmission without scheduling delays, revert the pacing profile back to Microsoft defaults.

Restore the default InitialCwnd or Disabled state across profiles:

Set-NetTCPSetting -SettingName "Internet" -PacingProfile InitialCwnd
Set-NetTCPSetting -SettingName "Datacenter" -PacingProfile Disabled

Or reset all templates simultaneously:

Get-NetTCPSetting | Set-NetTCPSetting -PacingProfile Disabled

Restart the active network adapter using Restart-NetAdapter -Name "Ethernet" to clear active pacing queues.

Get the best tech tips delivered straight to your inbox.

Join thousands of readers mastering Apple, Google, Microsoft, and Linux.