Utilisation du protocole de session
Le commutateur Windows Sockets utilise son protocole de session pour transférer des données via une connexion SAN. Si le commutateur transfère une petite quantité de données, il transfère ces données dans un message de contrôle. Chaque message de contrôle se compose d’un en-tête et d’une charge utile facultative de données d’application. Si le commutateur transfère une grande quantité de données, il transfère ces données à l’aide d’opérations RDMA.
Cette section explique comment configurer et effectuer un transfert de données.
Note Selon le comportement des applications qui chargent le commutateur, le commutateur optimise son protocole de session pour réduire la surcharge liée au transfert des données d’application.
Cette section fournit également des exemples de la façon dont le protocole de session du commutateur effectue des transferts de données. Toutefois, ces exemples n’incluent pas de descriptions définitives de ces opérations.
Configuration d’un transfert de données
Le commutateur alloue un pool de mémoires tampons de messages de contrôle pour chaque socket connecté. Le commutateur effectue ensuite des appels à la fonction WSPRegisterMemory du fournisseur de services SAN pour inscrire ces mémoires tampons de messages dans des régions de mémoire physique. Le commutateur utilise une partie du pool de mémoires tampons pour envoyer des informations de contrôle de flux à un homologue distant lors de l’appel de la fonction WSPSend d’un fournisseur de services SAN. Le commutateur utilise l’autre partie du pool pour publier des mémoires tampons de messages afin de recevoir des informations de contrôle de flux d’un homologue distant lors de l’appel de la fonction WSPRecv d’un fournisseur de services SAN. Une fois que le commutateur a reçu des messages de contrôle, il les consomme immédiatement. Après avoir consommé des messages de contrôle, le commutateur appelle la fonction WSPRecv du fournisseur de services SAN et transmet les mémoires tampons de réception pour les publier à nouveau afin qu’ils puissent recevoir des messages de contrôle supplémentaires d’un homologue distant.
Transfert de données d’application
La taille du transfert de données affecte la façon dont le commutateur gère l’opération de transfert de données.
Si une application demande à envoyer une petite quantité de données, le commutateur transfère ces données comme décrit dans Envoi de données urgentes sur un SAN.
Si une application demande à envoyer une grande quantité de données, le commutateur copie la partie initiale des données dans une mémoire tampon de message de contrôle utilisée pour l’envoi. L’en-tête de ce message de contrôle contient des informations qui spécifient la quantité de données d’application. Le commutateur appelle ensuite la fonction WSPSend du fournisseur de services SAN pour envoyer ce message de contrôle à l’homologue distant du socket SAN.
La façon dont le commutateur effectue le transfert des données d’application varie selon que le fournisseur de services prend en charge la fonction WSPRdmaRead .
Transfert de données vers un fournisseur qui prend en charge la fonction WSPRdmaRead
La figure suivante montre une vue d’ensemble de la façon dont le commutateur termine le transfert des données d’application si le fournisseur de services SAN de l’homologue distant prend en charge une fonction WSPRdmaRead. La séquence qui suit décrit plus en détail le transfert des données d’application.
Pour transférer des données lorsque l’homologue distant prend en charge WSPRdmaRead
- Le commutateur local doit appeler la fonction WSPRegisterRdmaMemory du fournisseur de services SAN pour inscrire la mémoire RDMA pour l’accès en lecture. Dans ce cas, l’en-tête de contrôle de la mémoire tampon de messages identifie également le descripteur pour la mémoire RDMA qui contient les données restantes de l’application.
- Le commutateur sur l’homologue distant appelle ensuite WSPRdmaRead pour transférer les données d’application de la mémoire RDMA vers les mémoires tampons de réception que le commutateur sur l’homologue distant précédemment inscrit auprès de WSPRegisterMemory appelle. Le fournisseur de services SAN transmet les données mises en mémoire tampon en arrière-plan. Cela permet aux applications qui ne publient pas plusieurs envois à la fois de publier une autre demande d’envoi pendant que le fournisseur de services SAN envoie des données mises en mémoire tampon.
- Le commutateur de l’homologue distant appelle ensuite WSPSend pour envoyer un message de contrôle au commutateur local pour indiquer que le transfert est terminé.
- Le commutateur local appelle la fonction WSPDeregisterRdmaMemory pour libérer de la mémoire RDMA.
- Le commutateur local termine la demande d’envoi de l’application. Si le commutateur ne peut pas inscrire la mémoire pour les mémoires tampons de données de l’application ou si la mémoire temporaire ne peut pas être entièrement allouée, il termine la demande d’envoi d’une application avec le code d’erreur WSAENOBUFS .
Transfert de données vers un fournisseur qui ne prend pas en charge la fonction WSPRdmaRead
La figure suivante montre une vue d’ensemble de la façon dont le commutateur termine le transfert des données d’application si le fournisseur de services SAN de l’homologue distant ne prend pas en charge une fonction WSPRdmaRead . La séquence qui suit décrit plus en détail le transfert des données d’application.
Pour transférer des données lorsque l’homologue distant ne prend pas en charge WSPRdmaRead
- Le commutateur de l’homologue distant appelle WSPRegisterRdmaMemory pour inscrire la mémoire RDMA pour l’accès en écriture.
- Le commutateur de l’homologue distant appelle ensuite WSPSend pour envoyer un message de contrôle au commutateur local qui indique l’emplacement de la mémoire RDMA dans laquelle le commutateur local peut écrire.
- Le commutateur local appelle la fonction WSPRdmaWrite pour transférer les données d’application vers la mémoire RDMA. Le fournisseur de services SAN transmet les données mises en mémoire tampon en arrière-plan. Cela permet aux applications qui ne publient pas plusieurs envois à la fois de publier une autre demande d’envoi pendant que le fournisseur de services SAN envoie des données mises en mémoire tampon.
- Le commutateur local appelle la fonction WSPGetOverlappedResult pour obtenir les résultats du transfert. Pour plus d’informations, consultez Achèvement des demandes de transfert de données.
- Le commutateur local appelle WSPSend pour envoyer un message de contrôle à l’homologue distant pour indiquer que le transfert est terminé.
- Le commutateur de l’homologue distant appelle WSPDeregisterRdmaMemory pour libérer de la mémoire RDMA.
- Le commutateur local termine la demande d’envoi de l’application. Si le commutateur ne peut pas inscrire de mémoire pour les mémoires tampons de données de l’application ou si la mémoire temporaire ne peut pas être allouée, il termine la demande d’envoi d’une application avec le code d’erreur WSAENOBUFS .