comment le protocole TCP peut-il être réglé pour une transmission unidirectionnelle haute performance?

mon client (réseau) envoie des paquets de données de 50 à 100 Ko toutes les 200 ms à mon serveur. il y a jusqu’à 300 clients. Le serveur n’envoie rien au client. Le serveur (dédié) et les clients sont en réseau local. Comment régler la configuration TCP pour de meilleures performances? Serveur sur Windows Server 2003 ou 2008, clients sur Windows 2000 et versions ultérieures.

Par exemple, taille de la fenêtre TCP. La modification de ce paramètre aide-t-elle? rien d’autre? des options de prise spéciales?

[EDIT]: dans les différents modes, les paquets peuvent atteindre 5 Mo

J’ai fait une étude à ce sujet il y a quelques années avec 1700 points de données. La conclusion était que la meilleure chose à faire est de configurer un énorme tampon de réception de socket (par exemple 512k) sur le récepteur. Faites cela sur le socket d’écoute, donc il sera hérité par les sockets acceptés, donc il sera déjà défini pendant qu’ils sont en prise de contact. Cela permet de négocier le redimensionnement de la fenêtre TCP lors de la négociation, ce qui permet au client de connaître la taille de la fenêtre> 64k. L’énorme taille de la fenêtre permet essentiellement au client de transmettre au taux maximal possible, sous réserve uniquement de l’évitement de la congestion plutôt que de la fermeture des fenêtres de réception.

Quel OS? IPv4 ou v6? Pourquoi une telle décharge? pourquoi ne peut-il pas être décomposé?

En supposant un solide, stable, faible bande passante: délai prod, vous pouvez ajuster des choses comme le dimensionnement en vol, la taille de la fenêtre initiale, mtu (selon les données, la version IP et le mode [tcp / udp].

Vous pouvez également arrondir les entrées ou équilibrer les entrées, vous avez donc moins de temps d’interruption depuis le nic. La liaison est également une option.

5MB / paquet /? C’est une conception assez médiocre. Je pense que cela conduirait à beaucoup de retranscriptions de segments, et BEAUCOUP de mémoire de kernel / stack étant utilisée dans la reconstruction / retransmission de séquence (acceptation du temps d’attente, etc.).

(Est-ce que c’est possible?)

Comme tous les clients sont en réseau local, vous pouvez essayer d’activer les “trames étendues” (vous devez exécuter une commande netsh pour cela, il faut google pour la commande précise, mais il y a beaucoup de procédures).

Sur la couche application, vous pouvez utiliser TransmitFile, qui est l’équivalent de sendfile de Windows et qui fonctionne très bien sous Windows Server 2003 (il est artificiellement limité sous “non serveur”, mais cela ne vous posera aucun problème). Notez que vous pouvez utiliser un fichier mappé en mémoire si vous générez les données à la volée.

Comme pour l’optimisation des parameters, l’augmentation du tampon d’envoi ne vous apportera probablement aucun avantage, bien que l’augmentation du tampon de réception puisse aider dans certains cas, car cela réduit la probabilité de perte de paquets. Une taille de fenêtre TCP plus importante (paramètre de registre) peut aider, car cela permet à l’expéditeur d’envoyer plus de données avant de devoir bloquer jusqu’à l’arrivée des ACK.

Il peut être utile de tenir compte du quota de travail du programme, cela ne vous coûte rien et peut être un avantage, car le kernel doit verrouiller les pages lors de leur envoi. Être autorisé à avoir plus de pages verrouillées pourrait accélérer les choses (ou peut-être pas, mais cela ne nuira pas non plus, les valeurs par défaut sont ridiculement basses de toute façon).