code de contrôle SIO_LOOPBACK_FAST_PATH
Description
Le code de contrôle SIO_LOOPBACK_FAST_PATH configure un socket TCP pour une latence plus faible et des opérations plus rapides sur l’interface de bouclage.
ImportantL’SIO_LOOPBACK_FAST_PATH est déconseillé et il n’est pas recommandé d’utiliser dans votre code.
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_LOOPBACK_FAST_PATH, // dwIoControlCode
(LPVOID) lpvInBuffer, // pointer to a Boolean value
(DWORD) cbInBuffer, // size, in bytes, of the input buffer
(LPVOID) lpvOutBuffer, // pointer to output buffer
(DWORD) cbOutBuffer, // 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_LOOPBACK_FAST_PATH, // dwIoControlCode
(LPVOID) lpvInBuffer, // pointer to a Boolean value
(DWORD) cbInBuffer, // size, in bytes, of the input buffer
(LPVOID) lpvOutBuffer, // pointer to output buffer
(DWORD) cbOutBuffer, // 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_LOOPBACK_FAST_PATH pour cette opération.
lpvInBuffer
Pointeur vers la mémoire tampon d’entrée. Ce paramètre contient un pointeur vers une valeur booléenne qui indique si le socket doit être configuré pour les opérations de bouclage rapide.
cbInBuffer
Taille, en octets, de la mémoire tampon d’entrée.
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.
Si la mémoire tampon de sortie est trop petite, l’appel échoue, WSAGetLastError renvoie WSAEINVAL et le paramètre lpcbBytesReturned pointe vers une valeur DWORD de zéro.
Si lpOverlapped a la valeur NULL, la valeur DWORD pointée par le paramètre lpcbBytesReturned retourné lors d’un appel réussi ne peut pas être égale à zéro.
Si le paramètre lpOverlapped n’est pas NULL pour les sockets superposés, les opérations qui ne peuvent pas être effectuées immédiatement sont lancées et l’achèvement sera indiqué ultérieurement. La valeur DWORD pointée par le paramètre lpcbBytesReturned retourné peut être égale à zéro, car la taille des données stockées ne peut pas être déterminée tant que l’opération superposée n’est pas terminée. La status d’achèvement finale peut être récupérée lorsque la méthode d’achèvement appropriée est signalée lorsque l’opération est terminée.
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 | L’opération d’E/S qui se chevauche est en cours. Cette valeur est retournée si une opération qui se chevauche a été lancée avec succès et que l’achèvement sera indiqué ultérieurement. |
WSA_OPERATION_ABORTED | L'opération d'E/S a été abandonnée en raison de l'arrêt d'un thread ou de la requête d'une application. Cette erreur est retournée si 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 . |
WSAEACCES | Une tentative d’accès à un socket a été effectuée d’une manière interdite par ses autorisations d’accès. Cette erreur est retournée dans plusieurs conditions pour les réservations de ports persistantes qui incluent les éléments suivants : l’utilisateur n’a pas les privilèges d’administration requis sur l’ordinateur local ou l’application ne s’exécute pas dans un interpréteur de commandes amélioré en tant qu’administrateur intégré (RunAs administrator ). |
WSAEFAULT | Le système a détecté une adresse de pointeur non valide lors de la tentative d’utilisation d’un argument pointeur dans un appel. Cette erreur est retournée du paramètre lpvInBuffer, lpvoutBuffer, lpcbBytesReturned, lpOverlapped ou lpCompletionRoutine n’est pas totalement contenu dans une partie valide de l’espace d’adressage utilisateur. |
WSAEINPROGRESS | Une opération de blocage est actuellement en cours d'exécution. Cette erreur est retournée si la fonction est appelée lorsqu’un rappel est en cours. |
WSAEINTR | Une opération de blocage a été interrompue par un appel à WSACancelBlockingCall. Cette erreur est retournée si une opération de blocage a été interrompue. |
WSAEINVAL | Argument non valide fourni. Cette erreur est retournée si le paramètre dwIoControlCode n’est pas une commande valide, si un paramètre d’entrée spécifié n’est pas acceptable ou si la commande n’est pas applicable au type de socket spécifié. |
WSAENETDOWN | Une opération de socket a rencontré un réseau inactif. Cette erreur est retournée si le sous-système réseau a échoué. |
WSAENOTSOCK | Une opération a été tentée sur un objet qui n’est pas un socket. Cette erreur est retournée si le descripteur s n’est pas un socket. |
WSAEOPNOTSUPP | L’opération tentée n’est pas prise en charge pour le type d’objet référencé. Cette erreur est retournée si la commande IOCTL spécifiée n’est pas prise en charge. Cette erreur est également retournée si le SIO_LOOPBACK_FAST_PATH IOCTL n’est pas pris en charge par le fournisseur de transport. |
Notes
Une application peut utiliser le SIO_LOOPBACK_FAST_PATH IOCTL pour réduire la latence et améliorer les performances des opérations de bouclage sur un socket TCP. Cet IOCTL demande que la pile TCP/IP utilise un chemin d’accès rapide spécial pour les opérations de bouclage sur ce socket. Le SIO_LOOPBACK_FAST_PATH IOCTL ne peut être utilisé qu’avec des sockets TCP. Ce IOCTL doit être utilisé des deux côtés de la session de bouclage. Le chemin rapide de bouclage TCP est pris en charge à l’aide de l’interface de bouclage IPv4 ou IPv6.
Le socket qui prévoit de lancer la demande de connexion doit appliquer ce IOCTL avant d’effectuer la demande de connexion. Ainsi, le socket utilisé par la fonction connect, ConnectEx, WSAConnect, WSAConnectByList ou WSAConnectByName pour lancer la connexion doit appliquer ce IOCTL pour utiliser le chemin rapide pour les opérations de bouclage.
Le socket qui écoute la demande de connexion doit appliquer ce IOCTL avant d’accepter la connexion. Par conséquent, le socket utilisé par la fonction d’écoute doit appliquer cet IOCTL afin que tous les sockets acceptés utilisent le chemin rapide pour le bouclage. Tous les sockets retournés par la fonction listen et passés à la fonction accept, AcceptEx ou WSAAccept seront marqués pour utiliser le chemin d’accès rapide spécial pour les opérations de bouclage.
Une fois qu’une application établit la connexion sur une interface de bouclage à l’aide du chemin rapide, tous les paquets pendant la durée de vie de la connexion doivent utiliser le chemin rapide.
L’application de SIO_LOOPBACK_FAST_PATH à un socket qui sera connecté à un chemin sans bouclage n’aura aucun effet.
Cette optimisation du bouclage TCP génère des paquets qui transitent par la couche de transport (TL) au lieu du bouclage traditionnel via la couche réseau. Cette optimisation améliore la latence des paquets de bouclage. Une fois qu’une application opte pour un paramètre de niveau de connexion pour utiliser le chemin rapide de bouclage, tous les paquets suivent le chemin de bouclage. Pour les communications de bouclage, la congestion et la suppression des paquets ne sont pas attendues. La notion de contrôle de la congestion et de livraison fiable dans TCP ne sera pas nécessaire. Toutefois, cela n’est pas vrai pour le contrôle de flux. Sans contrôle de flux, l’expéditeur peut surcharger la mémoire tampon de réception, ce qui entraîne un comportement de bouclage TCP erroné. Le contrôle de flux dans le chemin de bouclage optimisé TCP est conservé en plaçant les demandes d’envoi dans une file d’attente. Lorsque la mémoire tampon de réception est pleine, la pile TCP/IP garantit que les envois ne se terminent pas tant que la file d’attente n’est pas prise en compte en conservant le contrôle de flux.
Les connexions tcp fast path loopback en présence d’une légende de la plateforme de filtrage Windows (PAM) pour les données de connexion doivent prendre le chemin lent non optimisé pour le bouclage. Ainsi, les filtres PAM empêchent l’utilisation de ce nouveau chemin rapide de bouclage. Lorsqu’un filtre PAM est activé, le système utilise le chemin lent même si le SIO_LOOPBACK_FAST_PATH IOCTL a été défini. Cela garantit que les applications en mode utilisateur disposent de la capacité de sécurité complète du PAM.
Par défaut, SIO_LOOPBACK_FAST_PATH est désactivé.
Seul un sous-ensemble des options de socket TCP/IP est pris en charge lorsque le SIO_LOOPBACK_FAST_PATH IOCTL est utilisé pour activer le chemin rapide de bouclage sur un socket. La liste des options prises en charge comprend les éléments suivants :
- IP_TTL
- IP_UNICAST_IF
- IPV6_UNICAST_HOPS
- IPV6_UNICAST_IF
- IPV6_V6ONLY
- SO_CONDITIONAL_ACCEPT
- SO_EXCLUSIVEADDRUSE
- SO_PORT_SCALABILITY
- SO_RCVBUF
- SO_REUSEADDR
- TCP_BSDURGENT