code de contrôle SIO_SET_COMPATIBILITY_MODE
Description
Le code de contrôle SIO_SET_COMPATIBILITY_MODE demande comment la pile réseau doit gérer certains comportements pour lesquels la façon par défaut de gérer le comportement peut différer d’une version de Windows à l’autre.
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 pour 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 supérieur ou égal à 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 de 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 superposé, le paramètre lpOverlapped est ignoré.
Si s a été ouvert avec l’attribut qui se chevauche et que le paramètre lpOverlapped n’a pas la valeur NULL, l’opération est effectuée en tant qu’opération (asynchrone) qui se chevauche. 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 une fois l’opération 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 une fois l’opération terminée (ignorée pour les sockets qui ne se chevauchent pas).
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 soit retournée.
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 socket n’est pas prise en charge sur le protocole spécifié. |
WSAENOTCONN | Le socket n’est pas connecté. |
WSAENOTSOCK | Le descripteur s 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 du SIO_SET_COMPATIBILITY_MODE IOCTL est effectuée sur un socket de datagramme. |
Notes
le SIO_SET_COMPATIBILITY_MODE IOCTL demande comment la pile réseau doit gérer certains comportements pour lesquels la façon par défaut de gérer le comportement peut différer d’une version de Windows à l’autre. 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 de 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 revient à 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 à partir 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 la 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 en 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 . Certaines des valeurs possibles pour le membre TargetOsVersion sont les suivantes :
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. |
Le principal impact du membre TargetOsVersion est de savoir si ce membre est 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 « remplirait le canal ». Ce produit de délai de bande passante est l’espace tampon requis au niveau de l’expéditeur et du destinataire pour obtenir le 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 pour maintenir le pipeline plein. Des problèmes de performances TCP se produisent lorsque le produit à retard de bande passante est volumineux. Un chemin réseau fonctionnant dans ces conditions est souvent appelé « long, fat pipe ». Les exemples incluent les liaisons satellites par paquets à haute capacité, les liaisons sans fil à haut débit et les liaisons terrestres en fibre optique 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 plus grande fenêtre qui peut être utilisée est de 65 535 octets. Pour contourner cette limitation, une option d’extension TCP, TCP Window Scale, 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 la RFC 1323 disponible sur le site web de l’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 de mise à l’é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 afin d’obtenir la vraie taille de fenêtre. Par conséquent, un facteur d’échelle de fenêtre de 8 entraînerait une vraie taille de fenêtre é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é sur une valeur de 8, la taille réelle de la fenêtre est de 16 776 960 octets.
La taille réelle de la fenêtre de réception et, par conséquent, le facteur d’échelle sont déterminés par l’espace tampon de réception maximal. Cet espace tampon maximal correspond à la quantité de données qu’un récepteur TCP permet à un expéditeur TCP d’envoyer avant d’avoir à 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 destinataire ne peut pas stocker. Un hôte d’envoi peut uniquement envoyer la quantité maximale de données publiées par le destinataire avant d’attendre un accusé de réception et une mise à jour de la taille de la 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 de la pile TCP/IP a une valeur par défaut basée sur 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. Ainsi, pour un lien de 10 Mbits/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 MBits/s, la taille de fenêtre de réception par défaut est définie sur 65 535 octets.
Sur Windows Server 2003 et Windows XP, la véritable taille de fenêtre de réception maximale de 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 si vous n’utilisez pas l’extension WSopt ou sur 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 de fenêtre, une application ne peut atteindre un débit d’environ 5 mégabits par seconde (Mbits/s) que sur un chemin d’accès avec un temps d’aller-retour (RTT) de 100 millisecondes, quelle que soit la bande passante du chemin. Ce débit peut être mis à l’échelle à plus d’un gigabit par seconde (Gbits/s) avec la mise à l’échelle des fenêtres, 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 une valeur encodée DWORD de telle 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 Tcp Timestamp (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 les valeurs de Registre TCPWindowSize et Tcp1323Opts ne sont pas créées. Par défaut, l’extension WSopt est désactivée et la taille de la fenêtre de réception TCP est définie par le système sur une 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 des fenêtres sur une connexion TCP est toujours utilisée uniquement lorsque l’expéditeur et le destinataire incluent une option de mise à l’échelle de fenêtre TCP dans le segment de synchronisation (SYN) envoyé l’un à l’autre pour négocier un facteur de mise à l’échelle de fenêtre. Lorsque la mise à l’échelle de fenêtre est utilisée sur une connexion, le champ Fenêtre dans 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 de la fenêtre de réception réelle 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 d’un socket peut être augmentée à tout moment à l’aide de SO_RCVBUF, mais elle ne peut être réduite qu’avant l’établissement d’une connexion. Pour utiliser la mise à l’échelle de fenêtre, 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 retard de bande passante, on ne sait toujours pas à quelle vitesse l’application de réception récupèrera les données du tampon de données entrant (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 maximale fixe de la fenêtre de réception pour une connexion TCP ne varie pas en fonction des conditions réseau changeantes.
Pour résoudre le problème de détermination correcte de 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 réglage automatique des fenêtres de réception. Lorsque cette fonctionnalité est activée, le réglage automatique de la fenêtre de réception détermine continuellement la taille de fenêtre de réception réelle optimale en mesurant le produit de délai de bande passante et le taux de récupération de l’application, et ajuste la taille maximale réelle de la fenêtre de réception en fonction des conditions réseau changeantes. Le réglage automatique de la fenêtre de réception active l’extension TCP WSopt par défaut, ce qui autorise 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 résolu lors de la première établissement de la connexion.
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 la qualité de service (QoS) plus importante sur les réseaux qui fonctionnent à ou à proximité de la capacité.
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 à l’aide de SO_RCVBUF’option socket n’est autorisée 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 de la fenêtre à 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 paramétrage automatique de réception de la fenêtre est désactivé.
L’autotuning Windows peut également être complètement désactivé à l’aide de la commande suivante, netsh interface tcp set global autotuninglevel=disabled
, auquel cas la spécification WsaBehaviorAutoTuning n’aura aucun effet.
L’autotuning de réception de fenêtre peut également être désactivé 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 de mise à l’échelle Windows. Sur Windows Vista, un récepteur négocie par défaut un facteur d’échelle de fenêtre de 8 pour une taille de fenêtre réelle maximale de 16 776 960 octets. Lorsque les données commencent à circuler sur une liaison rapide, Windows commence d’abord 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 périphériques 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é comme 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. Certaines applications et implémentations de pile TCP sur d’autres plateformes ignorent également l’extension TCP WSopt et le facteur de mise à l’échelle de fenêtre. Ainsi, l’hôte distant qui envoie les données peut envoyer des données au débit publié dans le champ Fenêtre de l’en-tête TCP (256 octets). Cela peut entraîner la réception des 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, de sorte que le champ Fenêtre dans l’en-tête TCP est initialement défini sur 16 384 octets et que le facteur d’échelle de fenêtre est défini sur 2 pour une taille de réception de fenêtre true initiale de 64 000 octets.
La fonctionnalité de paramétrage automatique de 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 le SIO_SET_COMPATIBILITY_MODE IOCTL dès qu’un socket est créé, car cette option n’a aucun sens 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.