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.