Les ingénieurs du réseau rencontrent fréquemment des situations où la performance de la fenêtre ou de l'application TCP est imputée à l'infrastructure du réseau. Après avoir effectué de vastes captures de paquets, des tcprumps et une analyse de réseau, le vrai goulot d'étranglement est souvent découvert: NIC épuisé (Network Interface Card) ou tampons de niveau OS sur les systèmes client ou serveur.
Cet article fournit à la fois l'héritage (vers 2009) et les configurations de tampons actuelles (2025-2026) pour Linux, Windows et macOS, ainsi que des techniques de diagnostic pour identifier l'épuisement du tampon avant qu'il ne devienne un problème critique.
TCP utilise un mécanisme de contrôle de flux où le récepteur annonce une « taille de fenêtre » indiquant la quantité de données qu'il peut accepter. Lorsque les tampons système se remplissent, cette fenêtre se rétrécit à zéro, forçant l'expéditeur à attendre. Cela apparaît comme un problème de réseau, mais est en fait un problème de ressource hôte.
# Check current TCP buffer settings sysctl net.ipv4.tcp_rmem sysctl net.ipv4.tcp_wmem sysctl net.core.rmem_max sysctl net.core.wmem_max # Check NIC ring buffer sizes ethtool -g eth0 # Monitor socket buffer usage ss -tm # Check for TCP zero window events tcpdump -i any 'tcp[tcpflags] & tcp-push != 0' -vv # Check network statistics for buffer issues netstat -s | grep -i "buffer\|queue\|drop"
# Check TCP parameters
netsh interface tcp show global
# View network adapter buffer settings
Get-NetAdapterAdvancedProperty -Name "Ethernet" | Where-Object {$_.DisplayName -like "*buffer*"}
# Monitor TCP statistics
netstat -s -p tcp
# Check receive window auto-tuning
netsh interface tcp show global | findstr "Receive Window"
# Check current buffer settings sysctl kern.ipc.maxsockbuf sysctl net.inet.tcp.sendspace sysctl net.inet.tcp.recvspace # View network statistics netstat -s -p tcp # Monitor socket buffers netstat -an -p tcp
| Paramètres | Valeur historique (2009) | Désignation des marchandises |
|---|---|---|
| net.core.rmem default | 124928 (122 Ko) | Taille du tampon de réception par défaut |
| N.R.M.S.M. | 131071 (128Ko) | Taille maximale du tampon de la prise de réception |
| net.core.wmem default | 124928 (122KB) | Taille du tampon d'envoi par défaut |
| net.core.wmem max | 131071 (128KB) | Taille maximale du tampon d'envoi |
| Net.ipv4.tcp rmem | 4096 87380 174760 | TCP recevoir le tampon : min, par défaut, max (en octets) |
| Net.ipv4.tcp wmem | 4096 16384 131072 | TCP envoie le tampon : min, par défaut, max (en octets) |
| Net.ipv4.tcp mem | 196608 262144 393216 | Pages de mémoire TCP : basse, pression, haute |
| net.core.netdev max backlog | 1 000 | Nombre maximal de paquets en attente d'entrée |
| Le nombre d'heures de travail est le plus élevé. | 10240 (10Ko) | Taille maximale du tampon auxiliaire par socket |
| Parameter | Valeur actuelle recommandée | Description |
|---|---|---|
| net.core.rmem_default | 16777216 (16MB) | Default receive socket buffer size |
| net.core.rmem_max | 134217728 (128Mo) | Maximum receive socket buffer size |
| net.core.wmem_default | 16777216 (16MB) | Default send socket buffer size |
| net.core.wmem_max | 134217728 (128MB) | Maximum send socket buffer size |
| net.ipv4.tcp_rmem | 4096 87380 134217728 | TCP recevoir le tampon: min, par défaut, max (128 Mo max) |
| net.ipv4.tcp_wmem | 4096 65536 134217728 | TCP envoie le tampon : min, par défaut, max (128 Mo max) |
| net.ipv4.tcp_mem | 8388608 12582912 16777216 | Pages de mémoire TCP : basse, pression, haute (système 64GB) |
| net.core.netdev_max_backlog | 250000 | Nombre maximal de paquets en file d'attente (10GbE+) |
| net.core.optmem_max | 65536 (64Ko) | Maximum ancillary buffer size per socket |
| net.ipv4.tcp congestion control | bbr | Utiliser le contrôle de congestion BBR (algorithme de Google) |
| net.ipv4.tcp window scaling | 1 | Activer l'échelle de fenêtre TCP (RFC 1323) |
| net.ipv4.tcp timestamps | 1 | Activer les timestamps TCP pour une meilleure estimation RTT |
| Net.ipv4.tcp sack | 1 | Activer la reconnaissance sélective |
| net.ipv4.tcp no metrics save | 1 | Désactiver la mise en cache des mesures TCP |
Ajouter ces paramètres à /etc/sysctl.conf ou créer un nouveau fichier /etc/sysctl.d/99-network-tuning.conf:
# Network Buffer Tuning for High-Performance Applications # Optimized for 10GbE+ networks with RTT up to 300ms # Core socket buffer settings net.core.rmem_default = 16777216 net.core.rmem_max = 134217728 net.core.wmem_default = 16777216 net.core.wmem_max = 134217728 # TCP buffer settings net.ipv4.tcp_rmem = 4096 87380 134217728 net.ipv4.tcp_wmem = 4096 65536 134217728 net.ipv4.tcp_mem = 8388608 12582912 16777216 # Device buffer settings net.core.netdev_max_backlog = 250000 net.core.netdev_budget = 50000 net.core.netdev_budget_usecs = 5000 net.core.optmem_max = 65536 # TCP optimizations net.ipv4.tcp_congestion_control = bbr net.ipv4.tcp_window_scaling = 1 net.ipv4.tcp_timestamps = 1 net.ipv4.tcp_sack = 1 net.ipv4.tcp_no_metrics_save = 1 net.ipv4.tcp_moderate_rcvbuf = 1 # Apply with: sysctl -p /etc/sysctl.d/99-network-tuning.conf
# Check current ring buffer sizes ethtool -g eth0 # Set maximum ring buffer sizes (adjust based on NIC capabilities) ethtool -G eth0 rx 4096 tx 4096 # Make persistent by adding to /etc/network/interfaces or systemd service
| Parameter | Legacy Value (2009) | Lieu |
|---|---|---|
| TcpWindowSize | 65535 (64Ko) | Registre: HKLM\System\CurrentControlSet\Services\Tcpip\Paramètres |
| Tcp1323Opts | 0 (désactivé) | Échelle de fenêtre désactivée par défaut |
| ReceiveWindow par défaut | 8192 (8Ko) | Fenêtre de réception par défaut |
| Envoi par défautWindow | 8192 (8KB) | Fenêtre d'envoi par défaut |
| GlobalMaxTcpWindowSize | 65535 (64KB) | Taille maximale de la fenêtre TCP |
| Connexions TcpNum | 16777214 | Connexions TCP maximales |
Windows moderne utilise le Receive Fenêtre Auto-Tuning caractéristique, qui s'ajuste dynamiquement recevoir des tampons en fonction des conditions du réseau.
| Fonctionnalité | Réglage actuel recommandé | Description |
|---|---|---|
| Niveau de tuning automatique | normale (ou très expérimentale pour 10GbE+) | Réglage dynamique des fenêtres de réception |
| Étalonnage du côté de réception (RSS) | activé | Distribuer le traitement réseau entre les processeurs |
| Chimney Décharge | automatique (ou désactivé sur les NIC modernes) | Décharge TCP vers le matériel NIC |
| DMA net | handicapés | Accès direct à la mémoire (déprécié) |
| Paramètres mondiaux TCP | Voir les commandes ci-dessous | Paramètres TCP à l ' échelle du système |
| Fournisseur de congestion | CUBIC (ou recul de NewReno) | Algorithme de contrôle de la congestion TCP |
# Check current auto-tuning level netsh interface tcp show global # Enable auto-tuning (normal mode - default for most scenarios) netsh interface tcp set global autotuninglevel=normal # For high-bandwidth, high-latency networks (10GbE+, data center environments) netsh interface tcp set global autotuninglevel=experimental # For conservative tuning (if experimental causes issues) netsh interface tcp set global autotuninglevel=restricted # For very conservative tuning (not recommended for high-performance networks) netsh interface tcp set global autotuninglevel=highlyrestricted # Enable CUBIC congestion provider (Windows Server 2022/Windows 11+ only) netsh interface tcp set supplemental template=Internet congestionprovider=cubic # Note: Windows 10 and Server 2019 use Compound TCP or NewReno by default # CUBIC is not available on these older versions # Enable Receive-Side Scaling (RSS) netsh interface tcp set global rss=enabled # Set chimney offload (automatic is recommended) netsh interface tcp set global chimney=automatic # Disable NetDMA (recommended for modern systems) netsh interface tcp set global netdma=disabled # Enable Direct Cache Access (if supported) netsh interface tcp set global dca=enabled # Enable ECN (Explicit Congestion Notification) netsh interface tcp set global ecncapability=enabled # Set initial congestion window to 10 (RFC 6928) netsh interface tcp set global initialRto=3000
# View current adapter settings Get-NetAdapterAdvancedProperty -Name "Ethernet" # Increase receive buffers (adjust based on NIC) Set-NetAdapterAdvancedProperty -Name "Ethernet" -DisplayName "Receive Buffers" -DisplayValue 2048 # Increase transmit buffers Set-NetAdapterAdvancedProperty -Name "Ethernet" -DisplayName "Transmit Buffers" -DisplayValue 2048 # Enable Jumbo Frames (if network supports it) Set-NetAdapterAdvancedProperty -Name "Ethernet" -DisplayName "Jumbo Packet" -DisplayValue 9014 # Enable Large Send Offload (LSO) Set-NetAdapterAdvancedProperty -Name "Ethernet" -DisplayName "Large Send Offload V2 (IPv4)" -DisplayValue Enabled Set-NetAdapterAdvancedProperty -Name "Ethernet" -DisplayName "Large Send Offload V2 (IPv6)" -DisplayValue Enabled
# These settings are typically NOT needed on Windows 10/11 due to auto-tuning # Only modify if auto-tuning is disabled or problematic # Registry path: HKLM\System\CurrentControlSet\Services\Tcpip\Parameters # Maximum TCP window size (if auto-tuning disabled) # TcpWindowSize = 16777216 (16MB) - REG_DWORD # Enable window scaling (enabled by default on modern Windows) # Tcp1323Opts = 3 - REG_DWORD # Number of TCP Timed Wait Delay # TcpTimedWaitDelay = 30 - REG_DWORD (default 240)
| Parameter | Legacy Value (2009) | Description |
|---|---|---|
| kern.ipc.maxsockbuf | 262144 (256 Ko) | Taille maximale du tampon de prise |
| Net.inet.tcp.sendspace | 32768 (32Ko) | Par défaut TCP envoie le tampon |
| l'espace net.inet.tcp.recvspace | 32768 (32KB) | Par défaut, TCP reçoit le tampon |
| Le nombre d'heures de travail est égal à celui des heures de travail. | 131072 (128Ko) | Maximum auto-tuné recevoir tampon |
| Le taux d'utilisation de l'eau de mer dans le secteur de l'alimentation humaine est de 5 %. | 131072 (128KB) | tampon d'envoi automatique maximal |
| Pour le calcul de la valeur de référence, voir le tableau 1. | 0 (disabled) | Échelle de la fenêtre TCP |
| Parameter | Current Recommended Value | Description |
|---|---|---|
| kern.ipc.maxsockbuf | 8388608 (8MB) | Maximum socket buffer size |
| net.inet.tcp.sendspace | 131072 (128KB) | Default TCP send buffer |
| net.inet.tcp.recvspace | 131072 (128KB) | Default TCP receive buffer |
| net.inet.tcp.autorcvbufmax | 16777216 (16MB) | Maximum auto-tuned receive buffer |
| net.inet.tcp.autosndbufmax | 16777216 (16MB) | Maximum auto-tuned send buffer |
| net.inet.tcp.rfc1323 | 1 (activé) | Activer l'échelle des fenêtres TCP |
| Sack net.inet.tcp. | 1 (enabled) | Enable Selective Acknowledgment |
| C'est la raison pour laquelle il n'y a pas d'écart entre les taux de change et les taux de change. | 1440 | Taille maximale du segment par défaut TCP |
| net.inet.tcp.relayed ack | 3 | Comportement d'ACK retardé |
# Check current settings sysctl kern.ipc.maxsockbuf sysctl net.inet.tcp.sendspace sysctl net.inet.tcp.recvspace sysctl net.inet.tcp.autorcvbufmax sysctl net.inet.tcp.autosndbufmax # Apply settings temporarily (until reboot) sudo sysctl -w kern.ipc.maxsockbuf=8388608 sudo sysctl -w net.inet.tcp.sendspace=131072 sudo sysctl -w net.inet.tcp.recvspace=131072 sudo sysctl -w net.inet.tcp.autorcvbufmax=16777216 sudo sysctl -w net.inet.tcp.autosndbufmax=16777216 sudo sysctl -w net.inet.tcp.rfc1323=1 sudo sysctl -w net.inet.tcp.sack=1 # Make settings persistent (create /etc/sysctl.conf) sudo tee /etc/sysctl.conf <Création d'un LaunchDaemon pour les paramètres persistants
# Create /Library/LaunchDaemons/com.local.sysctl.plist sudo tee /Library/LaunchDaemons/com.local.sysctl.plist <EOF sudo chmod 644 /Library/LaunchDaemons/com.local.sysctl.plist sudo launchctl load /Library/LaunchDaemons/com.local.sysctl.plist Label com.local.sysctl ProgramArguments /usr/sbin/sysctl -w kern.ipc.maxsockbuf=8388608 RunAtLoad Avertissement : macOS Ventura (13) et plus tard ont des restrictions de protection de l'intégrité du système (SIP). Certains paramètres du noyau peuvent ne pas être modifiables même avec sudo. Testez les paramètres dans votre environnement spécifique.
# Server side iperf3 -s # Client side - test TCP throughput iperf3 -c server_ip -t 60 -i 5 -w 16M # Test with multiple parallel streams iperf3 -c server_ip -P 10 -t 60 # Test UDP performance iperf3 -c server_ip -u -b 1000M -t 60
# Capture and display TCP window sizes tcpdump -i any -n 'tcp' -vv | grep -i window # Save capture for Wireshark analysis tcpdump -i any -w /tmp/capture.pcap 'tcp port 443'
Recherchez ces indicateurs de problèmes tampons :
# Linux - Monitor network buffer statistics watch -n 1 'cat /proc/net/sockstat' watch -n 1 'ss -tm | grep -i mem' # Check for drops netstat -s | grep -i drop # Windows - Monitor TCP statistics netstat -e 1 # macOS - Monitor network statistics netstat -s -p tcp
Pour déterminer les tailles de tampon optimales pour votre réseau, calculez le produit Bandwidth-Delay :
BDP = Bandwidth (bits/sec) × RTT (seconds) Example for 10 Gigabit Ethernet with 50ms RTT: BDP = 10,000,000,000 × 0.050 = 500,000,000 bits = 62.5 MB Buffer Size = BDP × 2 (for bidirectional traffic and headroom) Buffer Size = 62.5 MB × 2 = 125 MB This is why modern settings recommend 128MB maximum buffers.
| Type de charge | Taille recommandée du tampon | Paramètres clés |
|---|---|---|
| Serveur Web (faible latence) | 4-16 Mo | Moins de tampons, plus de connexions, réponse rapide |
| Serveur de base de données | 16-32 Mo | tampons modérés, débit constant |
| Transfert de fichiers / Sauvegarde | 64 à 128 Mo | Des tampons maximums, une priorité de débit élevée |
| Diffusion vidéo | 32-64 MB | Grands tampons, taux de livraison uniforme |
| HPC / Centre de données | 128-256 Mo | Des tampons maximaux, un contrôle spécialisé de la congestion |
| Sans fil / Mobile | 2-8 Mo | tampons conservateurs, manipulation variable de latence |
L'épuisement des tampons est une cause principale de problèmes de performance qui semblent être liés au réseau. En comprenant l'évolution du calibrage du tampon des limites de 128 Ko de 2009 aux capacités de 128 Mo d'aujourd'hui, les ingénieurs réseau peuvent rapidement identifier et résoudre ces problèmes.
À emporter :
Rappelez-vous : Un "problème réseau" révélé par l'analyse de paquets pour montrer TCP 0 windows est en fait un problème de ressources système hôte. Avec un réglage tampon approprié, vous pouvez éliminer ces faux diagnostics et atteindre des performances optimales.
Dernière mise à jour: février 2, 2026
Auteur: Baud9600 Équipe technique