Connexion HTTP persistante

Essayer d’implémenter un serveur HTTP simple en C en utilisant une interface de socket Linux J’ai rencontré quelques difficultés avec une certaine fonctionnalité que j’aimerais qu’elle possède, à savoir les connexions persistantes. Il est relativement facile d’envoyer un fichier à la fois avec des connexions TCP distinctes, mais cela ne semble pas être une solution très efficace (en considérant plusieurs poignée de main par exemple). Quoi qu’il en soit, le serveur doit gérer plusieurs requêtes (HTML, CSS, images) au cours d’une même connexion TCP. Pourriez-vous me donner des indices sur la manière d’aborder le problème?

C’est assez facile – ne fermez pas la connexion TCP après avoir écrit la réponse.

Il y a deux façons de procéder, pipelined et non pipelined.

Dans une implémentation non en pipeline, vous lisez une requête http sur le socket, vous la traitez, vous l’écrivez en dehors du socket, puis vous essayez d’en lire une autre. Continuez ainsi jusqu’à ce que le correspondant distant ferme le socket ou fermez-le vous-même après avoir cessé de recevoir des demandes sur le socket au bout d’environ 10 secondes.

Dans une implémentation en pipeline, lisez autant de requêtes qu’il y a sur le socket, traitez-les toutes en parallèle, puis réécrivez-les toutes dans le socket, dans le même ordre que vous les avez reçues. Vous avez tout le temps un fil qui lit les demandes et un autre qui les écrit à nouveau.

Vous n’êtes pas obligé de le faire, mais vous pouvez indiquer que vous prenez en charge les connexions persistantes et le traitement en pipeline en ajoutant l’en-tête suivant dans vos réponses:

Connection: Keep-Alive 

Lisez ceci: http://en.wikipedia.org/wiki/HTTP_persistent_connection

À propos, en pratique, les connexions persistantes ne présentent pas d’énormes avantages. La surcharge de la gestion de la négociation est très faible comparée au temps nécessaire pour lire et écrire des données sur des sockets réseau. Il existe un débat sur les avantages en termes de performances des connexions persistantes. D’un côté sous forte charge, maintenir les connexions ouvertes signifie beaucoup moins de sockets sur votre système dans TIME_WAIT. D’autre part, comme vous maintenez le socket ouvert pendant 10 secondes, vous aurez beaucoup plus de sockets ouverts à la fois qu’en mode non persistant.

Si vous souhaitez améliorer les performances d’un serveur auto-écrit, la meilleure chose à faire pour améliorer les performances du réseau “frontal” de votre serveur est de mettre en œuvre un système de gestion de socket basé sur des événements. Regardez dans libev et eventlib.