web-dev-qa-db-fra.com

Limites du récepteur TCP taille de la fenêtre à 64 512)

Faits (veuillez identifier toute fausse déclaration):

  1. J'ai une connexion à 100 Mbps entre deux sites distants de 80 ms

  2. Il s'agit d'une longue connexion longue qui pourrait bénéficier d'une grande taille de fenêtre TCP peut-être jusqu'à 100 Mbps * 0,08 s = 1 000 000 octets)

  3. Les deux machines exécutent Windows Server 2012. "Le niveau de réglage automatique de la fenêtre de réception" est normal sur les deux. Les "heuristiques de mise à l'échelle des fenêtres" sont désactivées sur les deux.

  4. J'ai couru "iperf -s" d'un côté et "iperf -c" de l'autre. Le transfert s'est produit à 5 Mbps. J'obtiens le même résultat dans l'autre sens.

  5. Les deux parties ont annoncé la prise en charge de TCP fenêtres coulissantes dans leurs SYN.

  6. Le récepteur a demandé une taille de fenêtre TCP de 64 512 octets (0xFC00) pendant toute la durée de l'exécution avec une valeur d'échelle de fenêtre TCP fenêtre "sans décalage" (0x000)).

  7. Le réseau a pu gérer une plus grande taille de fenêtre (voir les diagrammes de séquence ci-dessous)

  8. Le récepteur a gardé la fenêtre plus petite que celle prise en charge par le réseau

  9. Cette connexion se produit dans un VPN IPSEC. La MTU de l'interface du tunnel est réduite à 1400 octets dans les deux sens.

Question

  • Pourquoi le récepteur garde-t-il la fenêtre petite?

Non-réponses

  • Le réseau est cassé

    Les machines Linux fonctionnant sur le même réseau ouvrent la fenêtre TCP à 1,5 mégaoctets et transmettent des données à 6 fois la bande passante

  • Les heuristiques de mise à l'échelle des fenêtres sont activées

    Les heuristiques de mise à l'échelle des fenêtres sont désactivées (voir la sortie de "netsh interface tcp show heuristics" ci-dessous)

  • Le niveau de réglage automatique de la fenêtre de réception n'est pas normal

    Le niveau de réglage automatique de la fenêtre de réception est normal (voir la sortie de "netsh interface tcp show global" ci-dessous)

  • Cela ne fonctionne tout simplement pas bien sur une machine virtuelle dans ESXi

    J'obtiens des performances 6 fois meilleures sur une machine Linux virtuelle fonctionnant sur le même hôte.


Mise à jour 1 12 juin 2015 16h30 PDT

J'ai modifié le test en mettant linux d'un côté de la connexion. Effectivement, lorsque Linux envoie des données à Windows Server 2012, Windows offre une fenêtre de réception TCP TCP $ === trop petite) (64 512 octets).

Lorsque j'envoie des données de Windows vers linux, linux offre une fenêtre de réception suffisamment large TCP (1 365 120 octets). Cependant, Windows limite les envois à ~ 60 000 octets maximum en vol.


Mise à jour 2 13 juin 2015 15h00 PDT

Un pas de plus vers la cause profonde. Dans ma configuration, ni SO_SNDBUF ni SO_RCVBUF ne sont définis (par iperf). Ce sont les tampons d'envoi et de réception qui ont effectivement lié la fenêtre de réception. Lorsqu'il ne spécifie pas ces valeurs, Windows Server 2012 fournit une valeur par défaut de 64 Ko. La question est donc maintenant:

Question

  • Quand aucun n'est spécifié, pourquoi Windows Server 2012 n'augmente-t-il pas dynamiquement SO_SNDBUF/SO_RCVBUF pour s'adapter aux longs gros tuyaux comme décrit à MSDN ?

Non-réponses

  • "netsh winsock show autotuning" est désactivé

    Il est activé.


Mise à jour 3 24 août 2015 16h00 PDT

netsh a apparemment été remplacé par Set-NetTCPSetting et sa famille. Get-NetTCPSetting combiné avec Get-NetTCPConnection montre que j'opère dans le régime "Internet" qui me propose ces paramètres:

SettingName                   : Internet
MinRto(ms)                    : 300
InitialCongestionWindow(MSS)  : 4
CongestionProvider            : CTCP
CwndRestart                   : False
DelayedAckTimeout(ms)         : 50
MemoryPressureProtection      : Enabled
AutoTuningLevelLocal          : Normal
AutoTuningLevelGroupPolicy    : NotConfigured
AutoTuningLevelEffective      : Local
EcnCapability                 : Enabled
Timestamps                    : Disabled
InitialRto(ms)                : 3000
ScalingHeuristics             : Disabled
DynamicPortRangeStartPort     : 49152
DynamicPortRangeNumberOfPorts : 16384

Expéditeur TCP

PS C:\Users\acs> netsh interface tcp show global
Querying active state...

TCP Global Parameters
----------------------------------------------
Receive-Side Scaling State          : enabled
Chimney Offload State               : disabled
NetDMA State                        : disabled
Direct Cache Access (DCA)           : disabled
Receive Window Auto-Tuning Level    : normal
Add-On Congestion Control Provider  : none
ECN Capability                      : enabled
RFC 1323 Timestamps                 : disabled
Initial RTO                         : 3000
Receive Segment Coalescing State    : enabled

PS C:\Users\acs> netsh interface tcp show heuristics
TCP Window Scaling heuristics Parameters
----------------------------------------------
Window Scaling heuristics         : disabled
Qualifying Destination Threshold  : 3
Profile type unknown              : normal
Profile type public               : normal
Profile type private              : normal
Profile type domain               : normal

PS C:\Users\acs> Get-NetTCPSetting

SettingName                   : Automatic
MinRto(ms)                    : 
InitialCongestionWindow(MSS)  : 
CongestionProvider            : 
CwndRestart                   : 
DelayedAckTimeout(ms)         : 
MemoryPressureProtection      : 
AutoTuningLevelLocal          : 
AutoTuningLevelGroupPolicy    : 
AutoTuningLevelEffective      : 
EcnCapability                 : 
Timestamps                    : 
InitialRto(ms)                : 
ScalingHeuristics             : 
DynamicPortRangeStartPort     : 
DynamicPortRangeNumberOfPorts : 

SettingName                   : Custom
MinRto(ms)                    : 20
InitialCongestionWindow(MSS)  : 4
CongestionProvider            : DCTCP
CwndRestart                   : True
DelayedAckTimeout(ms)         : 10
MemoryPressureProtection      : Enabled
AutoTuningLevelLocal          : Normal
AutoTuningLevelGroupPolicy    : NotConfigured
AutoTuningLevelEffective      : Local
EcnCapability                 : Enabled
Timestamps                    : Disabled
InitialRto(ms)                : 3000
ScalingHeuristics             : Disabled
DynamicPortRangeStartPort     : 49152
DynamicPortRangeNumberOfPorts : 16384

SettingName                   : Compat
MinRto(ms)                    : 300
InitialCongestionWindow(MSS)  : 2
CongestionProvider            : Default
CwndRestart                   : False
DelayedAckTimeout(ms)         : 200
MemoryPressureProtection      : Enabled
AutoTuningLevelLocal          : Normal
AutoTuningLevelGroupPolicy    : NotConfigured
AutoTuningLevelEffective      : Local
EcnCapability                 : Enabled
Timestamps                    : Disabled
InitialRto(ms)                : 3000
ScalingHeuristics             : Disabled
DynamicPortRangeStartPort     : 49152
DynamicPortRangeNumberOfPorts : 16384

SettingName                   : Datacenter
MinRto(ms)                    : 20
InitialCongestionWindow(MSS)  : 4
CongestionProvider            : DCTCP
CwndRestart                   : True
DelayedAckTimeout(ms)         : 10
MemoryPressureProtection      : Enabled
AutoTuningLevelLocal          : Normal
AutoTuningLevelGroupPolicy    : NotConfigured
AutoTuningLevelEffective      : Local
EcnCapability                 : Enabled
Timestamps                    : Disabled
InitialRto(ms)                : 3000
ScalingHeuristics             : Disabled
DynamicPortRangeStartPort     : 49152
DynamicPortRangeNumberOfPorts : 16384

SettingName                   : Internet
MinRto(ms)                    : 300
InitialCongestionWindow(MSS)  : 4
CongestionProvider            : CTCP
CwndRestart                   : False
DelayedAckTimeout(ms)         : 50
MemoryPressureProtection      : Enabled
AutoTuningLevelLocal          : Normal
AutoTuningLevelGroupPolicy    : NotConfigured
AutoTuningLevelEffective      : Local
EcnCapability                 : Enabled
Timestamps                    : Disabled
InitialRto(ms)                : 3000
ScalingHeuristics             : Disabled
DynamicPortRangeStartPort     : 49152
DynamicPortRangeNumberOfPorts : 16384

Expéditeur SYN

No.     Time           Source                Destination           Protocol Length Delta      Sequence number Acknowledgment number Bytes in flight Calculated window size Info
    814 5.036577000    10.10.0.21            10.11.0.1             TCP      66     0.000000000 0               0                                     64512                  49758→5001 [SYN, ECN, CWR] Seq=0 Win=64512 Len=0 MSS=1460 WS=1 SACK_PERM=1

Frame 814: 66 bytes on wire (528 bits), 66 bytes captured (528 bits) on interface 0
Ethernet II, Src: 00:11:22:33:44:55, Dst: aa:bb:cc:dd:ee:ff
Internet Protocol Version 4, Src: 10.10.0.21 (10.10.0.21), Dst: 10.11.0.1 (10.11.0.1)
Transmission Control Protocol, Src Port: 49758 (49758), Dst Port: 5001 (5001), Seq: 0, Len: 0
    Source Port: 49758 (49758)
    Destination Port: 5001 (5001)
    [Stream index: 73]
    [TCP Segment Len: 0]
    Sequence number: 0    (relative sequence number)
    Acknowledgment number: 0
    Header Length: 32 bytes
    .... 0000 1100 0010 = Flags: 0x0c2 (SYN, ECN, CWR)
    Window size value: 64512
    [Calculated window size: 64512]
    Checksum: 0x1451 [validation disabled]
    Urgent pointer: 0
    Options: (12 bytes), Maximum segment size, No-Operation (NOP), Window scale, No-Operation (NOP), No-Operation (NOP), SACK permitted
        Maximum segment size: 1460 bytes
        No-Operation (NOP)
        Window scale: 0 (multiply by 1)
            Kind: Window Scale (3)
            Length: 3
            Shift count: 0
            [Multiplier: 1]
        No-Operation (NOP)
        No-Operation (NOP)
        TCP SACK Permitted Option: True

Perspective de l'expéditeur du graphe de séquence  enter image description here

enter image description here

Récepteur TCP Paramètres

PS C:\Users\acs> netsh interface tcp show global
Querying active state...

TCP Global Parameters
----------------------------------------------
Receive-Side Scaling State          : enabled
Chimney Offload State               : disabled
NetDMA State                        : disabled
Direct Cache Access (DCA)           : disabled
Receive Window Auto-Tuning Level    : normal
Add-On Congestion Control Provider  : none
ECN Capability                      : enabled
RFC 1323 Timestamps                 : disabled
Initial RTO                         : 3000
Receive Segment Coalescing State    : enabled

PS C:\Users\acs> netsh interface tcp show heuristics
TCP Window Scaling heuristics Parameters
----------------------------------------------
Window Scaling heuristics         : disabled
Qualifying Destination Threshold  : 3
Profile type unknown              : normal
Profile type public               : normal
Profile type private              : normal
Profile type domain               : normal

PS C:\Users\acs> Get-NetTCPSetting

SettingName                   : Automatic
MinRto(ms)                    : 
InitialCongestionWindow(MSS)  : 
CongestionProvider            : 
CwndRestart                   : 
DelayedAckTimeout(ms)         : 
MemoryPressureProtection      : 
AutoTuningLevelLocal          : 
AutoTuningLevelGroupPolicy    : 
AutoTuningLevelEffective      : 
EcnCapability                 : 
Timestamps                    : 
InitialRto(ms)                : 
ScalingHeuristics             : 
DynamicPortRangeStartPort     : 
DynamicPortRangeNumberOfPorts : 

SettingName                   : Custom
MinRto(ms)                    : 20
InitialCongestionWindow(MSS)  : 4
CongestionProvider            : DCTCP
CwndRestart                   : True
DelayedAckTimeout(ms)         : 10
MemoryPressureProtection      : Enabled
AutoTuningLevelLocal          : Normal
AutoTuningLevelGroupPolicy    : NotConfigured
AutoTuningLevelEffective      : Local
EcnCapability                 : Enabled
Timestamps                    : Disabled
InitialRto(ms)                : 3000
ScalingHeuristics             : Disabled
DynamicPortRangeStartPort     : 49152
DynamicPortRangeNumberOfPorts : 16384

SettingName                   : Compat
MinRto(ms)                    : 300
InitialCongestionWindow(MSS)  : 2
CongestionProvider            : Default
CwndRestart                   : False
DelayedAckTimeout(ms)         : 200
MemoryPressureProtection      : Enabled
AutoTuningLevelLocal          : Normal
AutoTuningLevelGroupPolicy    : NotConfigured
AutoTuningLevelEffective      : Local
EcnCapability                 : Enabled
Timestamps                    : Disabled
InitialRto(ms)                : 3000
ScalingHeuristics             : Disabled
DynamicPortRangeStartPort     : 49152
DynamicPortRangeNumberOfPorts : 16384

SettingName                   : Datacenter
MinRto(ms)                    : 20
InitialCongestionWindow(MSS)  : 4
CongestionProvider            : DCTCP
CwndRestart                   : True
DelayedAckTimeout(ms)         : 10
MemoryPressureProtection      : Enabled
AutoTuningLevelLocal          : Normal
AutoTuningLevelGroupPolicy    : NotConfigured
AutoTuningLevelEffective      : Local
EcnCapability                 : Enabled
Timestamps                    : Disabled
InitialRto(ms)                : 3000
ScalingHeuristics             : Disabled
DynamicPortRangeStartPort     : 49152
DynamicPortRangeNumberOfPorts : 16384

SettingName                   : Internet
MinRto(ms)                    : 300
InitialCongestionWindow(MSS)  : 4
CongestionProvider            : CTCP
CwndRestart                   : False
DelayedAckTimeout(ms)         : 50
MemoryPressureProtection      : Enabled
AutoTuningLevelLocal          : Normal
AutoTuningLevelGroupPolicy    : NotConfigured
AutoTuningLevelEffective      : Local
EcnCapability                 : Enabled
Timestamps                    : Disabled
InitialRto(ms)                : 3000
ScalingHeuristics             : Disabled
DynamicPortRangeStartPort     : 49152
DynamicPortRangeNumberOfPorts : 16384

Récepteur SYN

No.     Time           Source                Destination           Protocol Length Delta      Sequence number Acknowledgment number Bytes in flight Calculated window size Info
    817 5.110501000    10.11.0.1             10.10.0.21            TCP      70     0.073924000 0               1                                     64512                  5001→49758 [SYN, ACK, ECN] Seq=0 Ack=1 Win=64512 Len=0 MSS=1460 WS=1 SACK_PERM=1 [ETHERNET FRAME CHECK SEQUENCE INCORRECT]

Frame 817: 70 bytes on wire (560 bits), 70 bytes captured (560 bits) on interface 0
Ethernet II, Src: aa:bb:cc:dd:ee:ff, Dst: 00:11:22:33:44:55
Internet Protocol Version 4, Src: 10.11.0.1 (10.11.0.1), Dst: 10.10.0.21 (10.10.0.21)
Transmission Control Protocol, Src Port: 5001 (5001), Dst Port: 49758 (49758), Seq: 0, Ack: 1, Len: 0
    Source Port: 5001 (5001)
    Destination Port: 49758 (49758)
    [Stream index: 73]
    [TCP Segment Len: 0]
    Sequence number: 0    (relative sequence number)
    Acknowledgment number: 1    (relative ack number)
    Header Length: 32 bytes
    .... 0000 0101 0010 = Flags: 0x052 (SYN, ACK, ECN)
    Window size value: 64512
    [Calculated window size: 64512]
    Checksum: 0xb5bb [validation disabled]
    Urgent pointer: 0
    Options: (12 bytes), Maximum segment size, No-Operation (NOP), Window scale, No-Operation (NOP), No-Operation (NOP), SACK permitted
        Maximum segment size: 1460 bytes
        No-Operation (NOP)
        Window scale: 0 (multiply by 1)
            Kind: Window Scale (3)
            Length: 3
            Shift count: 0
            [Multiplier: 1]
        No-Operation (NOP)
        No-Operation (NOP)
        TCP SACK Permitted Option: True
    [SEQ/ACK analysis]

Perspective du récepteur du graphe de séquence  enter image description hereenter image description here

Fenêtre TCP  enter image description here

34
Chris Stankevitz

J'ai vu cela comme un problème spécifique au pilote; dans mon cas avec les contrôleurs de réseau QLogic qui tentaient d'utiliser TCPChimney. Ce lien décrit la fonctionnalité TCPChimney ajoutée dans Windows 2008 - mais je suis sûr qu'elle s'applique toujours: https://support.Microsoft.com/en-us/kb/951037

Je recommanderais de tester les éléments suivants, dans l'ordre; après chaque test, redémarrez et voyez si le récepteur commence à augmenter le TCP RWIN comme prévu.

1) Chargez les dernières versions des pilotes de la carte réseau sur l'ordinateur récepteur. 1) Désactivez TCPChimney sur l'ordinateur récepteur 2) Désactivez tout déchargement de "réception TCP". Cela se trouverait dans les paramètres avancés des propriétés de la carte réseau (la même zone où la vitesse et le duplex seraient définis) 3) Désactivez tout le déchargement "Envoi TCP" (également dans les propriétés avancées de la carte réseau)

(Et contrairement au commentaire "Et les grandes tailles de fenêtres TCP supérieures à 65k sont mauvaises pour les serveurs, car alors la demande de mémoire pour les connexions augmente. 65k à lui seul pourrait également ne pas vous rendre assez heureux. - user303507 Aug 6 '15 à 11:30 ", grand TCP Les fenêtres de réception ne sont PAS intrinsèquement mauvaises pour le serveur. Dans le cas d'une bande passante élevée, les liaisons à latence élevée (comme les relais satellite), les grandes RWIN des valeurs sont nécessaires pour que nous ayons plus de données TCP "dans le canal". Imaginez une connexion de 600 Mbps avec une latence de 3000 ms; la liaison à large bande passante serait limitée à environ 20 KBps; comme seulement 65 Ko de données non acquittées TCP peuvent être "dans le canal" à la fois.)

1
Jason Walker

Voici quelques informations J'ai découvert que c'était peut-être la réponse que vous cherchiez. Notez que la mention de la limite de 64 Ko en mode désactivé peut être un indice de limites similaires en mode normal qui ne sont pas documentées.

Essayez d'activer le mode "expérimental" pour les niveaux de réglage automatique astronomiques.

Lors de la définition du niveau de réglage automatique de Windows, les paramètres possibles sont les suivants:

  • normal: valeur par défaut, permet à la fenêtre de réception de s'agrandir pour s'adapter à la plupart des conditions
  • désactivé: utilise une valeur fixe pour la fenêtre de réception TCP. Le limite à 64 Ko (limité à 65 535).
  • très restreint: permet à la fenêtre de réception de se développer au-delà de sa valeur par défaut, de façon très conservatrice
  • restreint: croissance quelque peu restreinte de la fenêtre de réception TCP au-delà de sa valeur par défaut
  • expérimental: permet à la fenêtre de réception de s'agrandir pour s'adapter à des scénarios extrêmes (non recommandé, il peut dégrader les performances dans des scénarios courants, uniquement à des fins de recherche. Il permet des valeurs RWIN de plus de 16 Mo)
0
Aland

Utilisez un optimiseur de réseau comme Cisco WAAS ou Riverbed. Ils effectuent des acks locaux rapidement, vous n'avez donc pas besoin de vous soucier des paramètres du serveur. Dans un réseau plus grand, vous n'avez de toute façon aucune influence sur la configuration du serveur car ce sont d'autres équipes ou cela est externalisé.

0
user303507

Cela ressemble à un bogue de réglage automatique de Windows pour moi, peut-être quelque chose à voir avec cela? https://support.Microsoft.com/en-us/kb/93217

Avez-vous essayé de demander manuellement une valeur SO_RCVBUF supérieure à l'aide de WskControlSocket?

0
Phil McKerracher