code de contrôle SIO_SET_COMPATIBILITY_MODE

Description

Le code de contrôle SIO_SET_COMPATIBILITY_MODE demande comment la pile de mise en réseau doit gérer certains comportements pour lesquels la façon par défaut de gérer le comportement peut différer entre Windows versions.

Pour effectuer cette opération, appelez la fonction WSAIoctl ou WSPIoctl avec les paramètres suivants.

int WSAIoctl(
  (socket) s,             // descriptor identifying a socket
  SIO_SET_COMPATIBILITY_MODE, // dwIoControlCode
  (LPVOID) lpvInBuffer,    // pointer to WSA_COMPATIBILITY_MODE struct
  (DWORD) cbInBuffer,      // length of input buffer
  NULL,         // output buffer
  0,       // size of output buffer
  (LPDWORD) lpcbBytesReturned,    // number of bytes returned
  (LPWSAOVERLAPPED) lpOverlapped,   // OVERLAPPED structure
  (LPWSAOVERLAPPED_COMPLETION_ROUTINE) lpCompletionRoutine,  // completion routine
);
int WSPIoctl(
  (socket) s,             // descriptor identifying a socket
  SIO_SET_COMPATIBILITY_MODE, // dwIoControlCode
  (LPVOID) lpvInBuffer,    // pointer to WSA_COMPATIBILITY_MODE struct
  (DWORD) cbInBuffer,      // length of input buffer
  NULL,         // output buffer
  0,       // size of output buffer
  (LPDWORD) lpcbBytesReturned,    // number of bytes returned
  (LPWSAOVERLAPPED) lpOverlapped,   // OVERLAPPED structure
  (LPWSAOVERLAPPED_COMPLETION_ROUTINE) lpCompletionRoutine,  // completion routine
  (LPWSATHREADID) lpThreadId,   // a WSATHREADID structure
  (LPINT) lpErrno   // a pointer to the error code.
);

Paramètres

s

Descripteur identifiant un socket.

dwIoControlCode

Code de contrôle de l’opération. Utilisez SIO_SET_COMPATIBILITY_MODE pour cette opération.

lpvInBuffer

Pointeur vers la mémoire tampon d’entrée. Ce paramètre doit pointer vers une structure WSA_COMPATIBILITY_MODE .

cbInBuffer

Taille, en octets, de la mémoire tampon d’entrée. Ce paramètre doit être égal ou supérieur à la taille de la structure WSA_COMPATIBILITY_MODE pointée par le paramètre lpvInBuffer .

lpvOutBuffer

Pointeur vers la mémoire tampon de sortie. Ce paramètre n’est pas utilisé pour cette opération.

cbOutBuffer

Taille, en octets, de la mémoire tampon de sortie. Ce paramètre doit être défini sur zéro.

lpcbBytesReturned

Pointeur vers une variable qui reçoit la taille, en octets, des données stockées dans la mémoire tampon de sortie. Ce paramètre retourné pointe vers une valeur DWORD égale à zéro pour cette opération, car il n’y a pas de sortie.

lpvOverlapped

Pointeur vers une structure WSAOVERLAPPED .

Si le socket s a été créé sans l’attribut qui se chevauche, le paramètre lpOverlapped est ignoré.

Si s’est ouvert avec l’attribut qui se chevauche et que le paramètre lpOverlapped n’est pas NULL, l’opération est effectuée en tant qu’opération superposée (asynchrone). Dans ce cas, le paramètre lpOverlapped doit pointer vers une structure WSAOVERLAPPED valide.

Pour les opérations qui se chevauchent, la fonction WSAIoctl ou WSPIoctl retourne immédiatement et la méthode d’achèvement appropriée est signalée lorsque l’opération a été terminée. Sinon, la fonction ne retourne pas tant que l’opération n’est pas terminée ou qu’une erreur se produit.

lpCompletionRoutine

Type : _In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE

Pointeur vers la routine d’achèvement appelée lorsque l’opération a été terminée (ignorée pour les sockets non superposés).

lpThreadId

Pointeur vers une structure WSATHREADID à utiliser par le fournisseur dans un appel ultérieur à WPUQueueApc. Le fournisseur doit stocker la structure WSATHREADID référencée (pas le pointeur vers le même) jusqu’à ce que la fonction WPUQueueApc retourne.

Note Ce paramètre s’applique uniquement à la fonction WSPIoctl .

lpErrno

Pointeur vers le code d’erreur.

Note Ce paramètre s’applique uniquement à la fonction WSPIoctl .

Valeur retournée

Si l’opération se termine correctement, la fonction WSAIoctl ou WSPIoctl retourne zéro.

Si l’opération échoue ou est en attente, la fonction WSAIoctl ou WSPIoctl retourne SOCKET_ERROR. Pour obtenir des informations d’erreur étendues, appelez WSAGetLastError.

Code d'erreur Signification
WSA_IO_PENDING Une opération superposée a été lancée avec succès et l’achèvement sera indiqué ultérieurement.
WSA_OPERATION_ABORTED Une opération qui se chevauche a été annulée en raison de la fermeture du socket ou de l’exécution de la commande IOCTL SIO_FLUSH .
WSAEFAULT Le paramètre lpOverlapped ou lpCompletionRoutine n’est pas totalement contenu dans une partie valide de l’espace d’adressage utilisateur.
WSAEINPROGRESS La fonction est appelée lorsqu’un rappel est en cours.
WSAEINTR Une opération de blocage a été interrompue.
WSAEINVAL Le paramètre dwIoControlCode n’est pas une commande valide ou un paramètre d’entrée spécifié n’est pas acceptable, ou la commande n’est pas applicable au type de socket spécifié. Cette erreur est retournée si le paramètre cbInBuffer est inférieur à la taille de la structure WSA_COMPATIBILITY_MODE .
WSAENETDOWN Le sous-système réseau a échoué.
WSAENOPROTOOPT L’option de socket n’est pas prise en charge sur le protocole spécifié.
WSAENOTCONN Le socket s n’est pas connecté.
WSAENOTSOCK Le descripteur n’est pas un socket.
WSAEOPNOTSUPP La commande IOCTL spécifiée n’est pas prise en charge. Cette erreur est retournée si le SIO_SET_COMPATIBILITY_MODE IOCTL n’est pas pris en charge par le fournisseur de transport. Cette erreur est également retournée lorsqu’une tentative d’utilisation de la SIO_SET_COMPATIBILITY_MODE IOCTL est effectuée sur un socket de datagramme.

Remarques

le SIO_SET_COMPATIBILITY_MODE IOCTL demande comment la pile de mise en réseau doit gérer certains comportements pour lesquels la façon par défaut de gérer le comportement peut différer entre Windows versions. La structure d’argument d’entrée pour SIO_SET_COMPATIBILITY_MODE est spécifiée dans la structure WSA_COMPATIBILITY_MODE définie dans le fichier d’en-tête Mswsockdef.h . Un pointeur vers la structure WSA_COMPATIBILITY_MODE est passé dans le paramètre cbInBuffer . Cette structure est définie comme suit :

// Need to #include <mswsock.h>

/* Argument structure for SIO_SET_COMPATIBILITY_MODE */
typedef struct _WSA_COMPATIBILITY_MODE {
    WSA_COMPATIBILITY_BEHAVIOR_ID BehaviorId;
    ULONG TargetOsVersion;
} WSA_COMPATIBILITY_MODE, *PWSA_COMPATIBILITY_MODE;

La valeur spécifiée dans le membre BehaviorId indique le comportement demandé. La valeur spécifiée dans le membre TargetOsVersion indique la version Windows demandée pour le comportement.

Le membre BehaviorId peut être l’une des valeurs du type d’énumération WSA_COMPATIBILITY_BEHAVIOR_ID défini dans le fichier d’en-tête Mswsockdef.h . Les valeurs possibles pour le membre BehaviorId sont les suivantes :

Terme Description
WsaBehaviorAll Cela équivaut à demander tous les comportements compatibles possibles définis pour WSA_COMPATIBILITY_BEHAVIOR_ID.
WsaBehaviorReceiveBuffering Lorsque le membre TargetOsVersion est défini sur une valeur pour Windows Vista ou version ultérieure, les réductions de la taille de la mémoire tampon de réception TCP sur ce socket à l’aide de l’option de socket SO_RCVBUF sont autorisées même après l’établissement d’une connexion TCP. Lorsque le membre TargetOsVersion est défini sur une valeur antérieure à Windows Vista, les réductions de la taille de la mémoire tampon de réception TCP sur ce socket à l’aide de l’option de socket SO_RCVBUF ne sont pas autorisées après l’établissement de la connexion.
WsaBehaviorAutoTuning Lorsque le membre TargetOsVersion est défini sur une valeur pour Windows Vista ou version ultérieure, le réglage automatique de la fenêtre de réception est activé et le facteur d’échelle de fenêtre TCP est réduit à 2 de la valeur par défaut 8. Lorsque TargetOsVersion est défini sur une valeur antérieure à Windows Vista, le réglage automatique de la fenêtre de réception est désactivé. L’option de mise à l’échelle de fenêtre TCP est également désactivée et la taille maximale de la fenêtre de réception réelle est limitée à 65 535 octets. L’option de mise à l’échelle de fenêtre TCP ne peut pas être négociée sur la connexion même si l’option de socket SO_RCVBUF a été appelée sur ce socket spécifiant une valeur supérieure à 65 535 octets avant l’établissement de la connexion.

Le membre TargetOsVersion peut être l’une des constantes de version NTDDI définies dans le fichier d’en-tête Sdkddkver.h . Voici quelques-unes des valeurs possibles pour le membre TargetOsVersion :

Terme Description
NTDDI_LONGHORN Le comportement cible est la valeur par défaut pour Windows Vista.
NTDDI_WS03 Le comportement cible est la valeur par défaut pour Windows Server 2003.
NTDDI_WINXP Le comportement cible est la valeur par défaut pour Windows XP.
NTDDI_WIN2K Le comportement cible est la valeur par défaut pour Windows 2000.

L’impact principal du membre TargetOsVersion est que ce membre soit défini sur une valeur égale ou supérieure à NTDDI_LONGHORN.

Les performances TCP dépendent non seulement du taux de transfert lui-même, mais plutôt du produit du taux de transfert et du délai d’aller-retour. Ce produit de délai de bande passante mesure la quantité de données qui « rempliraient le canal ». Ce produit de délai de bande passante est l’espace de mémoire tampon requis pour l’expéditeur et le récepteur afin d’obtenir un débit maximal sur la connexion TCP sur le chemin d’accès. Cet espace tampon représente la quantité de données non reconnues que TCP doit gérer afin de maintenir le pipeline plein. Les problèmes de performances TCP surviennent lorsque le produit de délai de bande passante est volumineux. Un chemin d’accès réseau fonctionnant sous ces conditions est souvent appelé « canal long, gras ». Il peut s’agir, par exemple, de liaisons satellites à haute capacité, de liaisons sans fil haut débit et de liaisons fibre optiques terrestres sur de longues distances.

L’en-tête TCP utilise un champ de données 16 bits (champ Fenêtre dans l’en-tête de paquet TCP) pour signaler la taille de la fenêtre de réception à l’expéditeur. Par conséquent, la fenêtre la plus grande qui peut être utilisée est de 65 535 octets. Pour contourner cette limitation, une option d’extension TCP, l’échelle de fenêtre TCP, a été ajoutée pour le tcp hautes performances afin d’autoriser les fenêtres supérieures à 65 535 octets. L’option Tcp Window Scale (WSopt) est définie dans RFC 1323 disponible sur le site web IETF. L’extension WSopt étend la définition de la fenêtre TCP à 32 bits à l’aide d’un facteur d’échelle logarithmique d’un octet pour étendre le champ fenêtre 16 bits dans l’en-tête TCP. L’extension WSopt définit un facteur d’échelle implicite (2 à une certaine puissance), qui est utilisé pour multiplier la valeur de taille de fenêtre trouvée dans un en-tête TCP pour obtenir la taille réelle de la fenêtre. Par conséquent, un facteur d’échelle de fenêtre de 8 entraînerait une taille de fenêtre réelle égale à la valeur du champ Fenêtre dans l’en-tête TCP multipliée par 2^8 ou 256. Par conséquent, si le champ Fenêtre de l’en-tête TCP a été défini sur la valeur maximale de 65 535 octets et que le facteur d’échelle WSopt a été négocié avec une valeur de 8, la taille réelle de la fenêtre serait de 16 776 960 octets.

La taille réelle de la fenêtre de réception et, par conséquent, le facteur d’échelle est déterminé par l’espace tampon de réception maximal. Cet espace tampon maximal est la quantité de données qu’un récepteur TCP permet à un expéditeur TCP d’envoyer avant de devoir attendre un accusé de réception. Une fois la connexion établie, la taille de la fenêtre de réception est annoncée dans chaque segment TCP (champ Fenêtre dans l’en-tête TCP). La publicité de la quantité maximale de données que l’expéditeur peut envoyer est un mécanisme de contrôle de flux côté récepteur qui empêche l’expéditeur d’envoyer des données que le récepteur ne peut pas stocker. Un hôte d’envoi ne peut envoyer que la quantité maximale de données publiées par le récepteur avant d’attendre un accusé de réception et une mise à jour de taille de fenêtre de réception.

Sur Windows Server 2003 et Windows XP, l’espace tampon de réception maximal qui représente la taille de la fenêtre de réception pour la pile TCP/IP a une valeur par défaut en fonction de la vitesse de liaison de l’interface d’envoi. La valeur réelle s’ajuste automatiquement aux incréments pairs de la taille maximale de segment (MSS) négociée pendant l’établissement de la connexion TCP. Par conséquent, pour un lien de 10 Mbit/s, la taille de fenêtre de réception par défaut est normalement définie sur 16 000 octets, tandis que sur un lien de 100 MBit/s, la taille de la fenêtre de réception par défaut est définie sur 65 535 octets.

Sur Windows Server 2003 et Windows XP, la taille maximale de la fenêtre de réception maximale pour la pile TCP/IP peut être configurée manuellement à l’aide des valeurs de Registre suivantes sur une interface spécifique ou pour l’ensemble du système :

HKEY_LOCAL_MACHINE\SYSTEM\Current Control Set\Services\Tcpip\Parameters\TCPWindowSize

HKEY_LOCAL_MACHINE\SYSTEM\Current Control Set\Services\Tcpip\Parameters\Interface\TCPWindowSize

La valeur de Registre pour TCPWindowSize peut être définie sur un maximum de 65 535 octets lorsque vous n’utilisez pas l’extension WSopt ou un maximum de 1 073 741 823 octets lorsque l’extension WSopt est utilisée (un facteur d’échelle maximal de 4 est pris en charge). Sans mise à l’échelle des fenêtres, une application ne peut atteindre qu’un débit d’environ 5 mégabits par seconde (Mbits/s) sur un chemin avec une durée aller-retour de 100 millisecondes (RTT), quelle que soit la bande passante du chemin. Ce débit peut être mis à l’échelle sur un gigaoctet par seconde (Gbits/s) avec une mise à l’échelle de fenêtre, ce qui permet à TCP de négocier le facteur de mise à l’échelle de la taille de la fenêtre pendant l’établissement de la connexion.

Sur Windows Server 2003 et Windows XP, l’extension WSopt peut être activée en définissant la valeur de Registre suivante.

HKEY_LOCAL_MACHINE\SYSTEM\Current Control Set\Services\Tcpip\Parameters\Tcp1323Opts

La valeur de Registre Tcp1323Opts est encodée par DWORD , de sorte que lorsque le bit 0 est défini, l’extension TCP WSopt est activée. Lorsque le bit 1 est défini, l’option d’horodatage TCP (TSopt) définie dans RFC 1323 est activée. Par conséquent, une valeur de 1 ou 3 active l’extension WSopt.

Sur Windows Server 2003 et Windows XP, la valeur par défaut est que TCPWindowSize et les valeurs de Registre Tcp1323Opts ne sont pas créées. Par conséquent, la valeur par défaut est que l’extension WSopt est désactivée et que la taille de la fenêtre de réception TCP est définie par le système sur la valeur maximale de 65 535 octets en fonction de la vitesse de liaison. Lorsque la mise à l’échelle des fenêtres est activée sur Windows Server 2003 et Windows XP en définissant la valeur de Registre Tcp1323Opts, la mise à l’échelle de fenêtre sur une connexion TCP est toujours utilisée uniquement lorsque l’expéditeur et le récepteur incluent une option d’échelle de fenêtre TCP dans le segment de synchronisation (SYN) envoyé les uns aux autres pour négocier un facteur d’échelle de fenêtre. Lorsque la mise à l’échelle de fenêtre est utilisée sur une connexion, le champ Fenêtre de l’en-tête TCP est défini sur 65 535 octets et le facteur d’échelle de fenêtre est utilisé pour ajuster la taille réelle de la fenêtre de réception vers le haut par le facteur d’échelle de fenêtre négocié lors de l’établissement de la connexion.

Une application peut spécifier la taille de la fenêtre de réception TCP pour une connexion à l’aide de l’option de socket SO_RCVBUF . La taille de la fenêtre de réception TCP pour un socket peut être augmentée à tout moment à l’aide de SO_RCVBUF, mais elle ne peut être réduite qu’avant d’établir une connexion. Pour utiliser la mise à l’échelle des fenêtres, une application doit spécifier une taille de fenêtre supérieure à 65 535 octets lors de l’utilisation de l’option de socket SO_RCVBUF avant l’établissement de la connexion.

La valeur idéale pour la taille de la fenêtre de réception TCP est souvent difficile à déterminer. Pour remplir la capacité du réseau entre l’expéditeur et le destinataire, la taille de la fenêtre de réception doit être définie sur le produit de délai de bande passante pour la connexion, qui est la bande passante multipliée par le temps d’aller-retour. Même si une application peut déterminer correctement le produit de délai de bande passante, il n’est toujours pas connu la rapidité avec laquelle l’application réceptrice récupère les données de la mémoire tampon de données entrante (taux de récupération de l’application). Malgré la prise en charge de la mise à l’échelle des fenêtres TCP, la taille maximale de la fenêtre de réception dans Windows Server 2003 et Windows XP peut toujours limiter le débit, car il s’agit d’une taille maximale fixe pour toutes les connexions TCP (sauf si spécifiée par application à l’aide de SO_RCVBUF), ce qui peut améliorer le débit pour certaines connexions et diminuer le débit pour d’autres. En outre, la taille de fenêtre de réception maximale fixe pour une connexion TCP ne varie pas avec la modification des conditions réseau.

Pour résoudre le problème de déterminer correctement la valeur de la taille maximale de la fenêtre de réception pour une connexion TCP en fonction des conditions actuelles du réseau, la pile TCP/IP dans Windows Vista prend en charge une fonctionnalité de paramétrage automatique de fenêtre de réception. Lorsque cette fonctionnalité est activée, le réglage automatique de la fenêtre de réception détermine en permanence la taille optimale de la fenêtre de réception réelle en mesurant le produit de délai de bande passante et le taux de récupération de l’application, et ajuste la taille de fenêtre de réception maximale réelle en fonction de la modification des conditions réseau. Le réglage automatique de la fenêtre de réception active l’extension TCP WSopt par défaut, ce qui permet jusqu’à 16 776 960 octets pour la taille réelle de la fenêtre. À mesure que les données circulent sur la connexion, la pile TCP/IP surveille la connexion, mesure le produit de délai de bande passante actuel pour la connexion et le taux de réception de l’application, et ajuste la taille réelle de la fenêtre de réception pour optimiser le débit. La pile TCP/IP modifie la valeur du champ Fenêtre dans l’en-tête TCP en fonction des conditions réseau, car le facteur d’échelle WSopt est fixe lorsque la connexion est établie pour la première fois.

La pile TCP/IP dans Windows Vista n’utilise plus les valeurs de Registre TCPWindowSize. Avec un meilleur débit entre homologues TCP, l’utilisation de la bande passante réseau augmente pendant le transfert de données. Si toutes les applications sont optimisées pour recevoir des données TCP, l’utilisation globale du réseau peut augmenter considérablement, ce qui rend l’utilisation de qualité de service (QoS) plus importante sur les réseaux qui fonctionnent à une capacité proche ou proche.

Le comportement par défaut sur Windows Vista pour la mise en mémoire tampon de réception lorsque SIO_SET_COMPATIBILITY_MODE n’est pas spécifié à l’aide de WsaBehaviorReceiveBuffering est qu’aucune réduction de taille de fenêtre de réception n’est autorisée à l’aide de l’option de socket SO_RCVBUF après l’établissement d’une connexion.

Le comportement par défaut sur Windows Vista pour le réglage automatique lorsque SIO_SET_COMPATIBILITY_MODE n’est pas spécifié à l’aide de WsaBehaviorAutoTuning est que la pile reçoit le réglage automatique des fenêtres à l’aide d’un facteur d’échelle de fenêtre de 8. Notez que si une application définit une taille de fenêtre de réception valide avec l’option de socket SO_RCVBUF , la pile utilise la taille spécifiée et le réglage automatique de réception de la fenêtre est désactivé. Windows l’autotuning peut également être désactivé complètement à l’aide de la commande suivante, netsh interface tcp set global autotuninglevel=disabledauquel cas la spécification de WsaBehaviorAutoTuning n’aura aucun effet. La fonctionnalité de réception automatique de la fenêtre peut également être désactivée en fonction de la stratégie de groupe définie sur Windows Server 2008.

L’option WsaBehaviorAutoTuning est nécessaire sur Windows Vista pour certains appareils et pare-feu de passerelle Internet qui ne prennent pas correctement en charge les flux de données pour les connexions TCP qui utilisent l’extension WSopt et un facteur d’échelle windows. Sur Windows Vista, un récepteur par défaut négocie un facteur d’échelle de fenêtre de 8 pour une taille maximale de fenêtre réelle de 16 776 960 octets. Lorsque les données commencent à circuler sur un lien rapide, Windows commence initialement par une taille de fenêtre true de 64 Kilooctets en définissant le champ Fenêtre de l’en-tête TCP sur 256 et en définissant le facteur d’échelle de fenêtre sur 8 dans les options TCP (256*2^8=64 Ko). Certains appareils et pare-feu de passerelle Internet ignorent le facteur d’échelle de fenêtre et examinent uniquement le champ Fenêtre publié dans l’en-tête TCP spécifié sous la forme 256 et suppriment les paquets entrants pour la connexion qui contiennent plus de 256 octets de données TCP. Pour prendre en charge la mise à l’échelle des fenêtres de réception TCP, un périphérique de passerelle ou un pare-feu doit surveiller la négociation TCP et suivre le facteur d’échelle de fenêtre négocié dans le cadre des données de connexion TCP. Par ailleurs, certaines applications et implémentations de pile TCP sur d’autres plateformes ignorent l’extension TCP WSopt et le facteur de mise à l’échelle des fenêtres. Par conséquent, l’hôte distant qui envoie les données peut envoyer des données à la vitesse annoncée dans le champ Fenêtre de l’en-tête TCP (256 octets). Cela peut entraîner la réception de données très lentement par le récepteur.

La définition du membre BehaviorId sur WsaBehaviorAutoTuning et TargetOsVersion sur Windows Vista réduit le facteur d’échelle de fenêtre à 2. Le champ Fenêtre de l’en-tête TCP est initialement défini sur 16 384 octets et le facteur d’échelle de fenêtre est défini sur 2 pour une taille initiale de réception de fenêtre true de 64 Ko. La fonctionnalité de réglage automatique de la fenêtre peut ensuite augmenter la taille de réception de la fenêtre réelle jusqu’à 262 140 octets en définissant le champ Fenêtre dans l’en-tête TCP sur 65 535 octets. Une application doit définir l’SIO_SET_COMPATIBILITY_MODE IOCTL dès qu’un socket est créé, car cette option n’est pas logique ou ne s’applique pas après l’envoi d’un syn. La définition de cette option a le même impact que la commande suivante : netsh interface tcp set global autotuninglevel=highlyrestricted

Notez que le fichier d’en-tête Mswsockdef.h est automatiquement inclus dans Mswsock.h ou Netiodef.h et ne doit pas être utilisé directement.

Voir aussi

Prise

WSAGetLastError

WSAGetOverlappedResult

WSAIoctl

WSAOVERLAPPED

WSASocketA

WSASocketW