Question

J'ai une connexion client / serveur via un socket TCP, avec le serveur écrit au client aussi vite que possible.

Recherche sur mon activité réseau, le client de production reçoit des données à environ 2,5 Mb / s.

Un nouveau client léger que j'ai écrit à lire juste et le taux de référence, a un taux d'environ 5.0MB / s (ce qui est probablement autour de la vitesse maximale du serveur peut transmettre).

Je me demandais ce qui régit les taux ici, étant donné que le client envoie pas de données sur le serveur pour lui dire au sujet des limites de taux.

Était-ce utile?

La solution

Dans TCP est le client. Si la fenêtre TCP du serveur est plein - il doit attendre plus de ACKs client est venu. Il vous est caché à l'intérieur de la pile TCP, mais TCP introduit une livraison garantie, ce qui signifie que le serveur ne peut pas envoyer des données plus rapidement que le taux auquel le client est de les traiter.

Autres conseils

TCP a le contrôle de flux et il arrive automatiquement. Lisez à ce sujet à http://en.wikipedia.org/wiki/Transmission_Control_Protocol#Flow_control

Lorsque le tube se remplit en raison d'un contrôle de flux, le serveur socket opérations d'écriture d'E / S ne se termine pas jusqu'à ce que le contrôle de flux est releaved.

Le serveur est en train d'écrire des données à 5.0MB / s, mais si votre client est le goulot d'étranglement ici alors serveur doit attendre avant que les données contenues dans « Envoyé tampon » est complètement envoyé au client, ou suffisamment d'espace est libéré pour mettre plus données.

Comme vous avez dit que le client léger a pu recevoir au 5.0MB / s, alors il sera les opérations de post-réception de votre client que vous devez vérifier. Si vous recevez des données et le traitement alors avant de lire plus de données, alors cela pourrait être le goulot d'étranglement.

Il est préférable de recevoir des données de manière asynchrone, et dès que l'un est complet reçoivent, demandez les sockets client pour commencer à recevoir à nouveau des données, alors que vous traitez les données reçues dans un thread pool de thread séparé. De cette façon, votre client est toujours disponible pour recevoir les données entrantes et le serveur peut envoyer à pleine vitesse.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top