web-dev-qa-db-fra.com

Qu'est-ce que le "backlog" dans les connexions TCP?

Ci-dessous, vous voyez un programme python qui agit comme un serveur écoutant les demandes de connexion au port 9999:

# server.py 
import socket                                         
import time

# create a socket object
serversocket = socket.socket(
            socket.AF_INET, socket.SOCK_STREAM) 

# get local machine name
Host = socket.gethostname()                           

port = 9999                                           

# bind to the port
serversocket.bind((Host, port))                                  

# queue up to 5 requests
serversocket.listen(5)                                           

while True:
    # establish a connection
    clientsocket,addr = serversocket.accept()      

    print("Got a connection from %s" % str(addr))
    currentTime = time.ctime(time.time()) + "\r\n"
    clientsocket.send(currentTime.encode('ascii'))
    clientsocket.close()

La question est de savoir quelle est la fonction du paramètre de la méthode socket.listen() (c'est-à-dire 5).

Sur la base des tutoriels sur Internet:

L'argument backlog spécifie le nombre maximal de connexions en file d'attente et doit être au moins égal à 0; la valeur maximale dépend du système (généralement 5), la valeur minimale est forcée à 0.

Mais:

  1. Quels sont ces connexions en file d'attente?
  2. Cela fait-il une différence pour les demandes des clients? (Je veux dire que le serveur qui s'exécute avec socket.listen(5) est différent du serveur qui s'exécute avec socket.listen(1) pour accepter les demandes de connexion ou pour recevoir des données?)
  3. Pourquoi la valeur minimale est-elle nulle? Cela ne devrait-il pas être au moins 1?
  4. Y a-t-il une valeur préférée?
  5. Est-ce que backlog est défini pour TCP uniquement ou s'applique-t-il également pour UDP et d'autres protocoles?
23
user3739941

REMARQUE: les réponses sont formulées sans aucune expérience en Python, mais les questions ne sont pas pertinentes pour la langue, pour y répondre.

Quelles sont ces connexions en file d'attente?

En termes simples, le paramètre backlog spécifie le nombre de connexions en attente que la file d'attente contiendra.

Lorsque plusieurs clients se connectent au serveur, le serveur conserve ensuite les demandes entrantes dans une file d'attente. Les clients sont disposés dans la file d'attente et le serveur traite leurs demandes une par une au fur et à mesure que le membre de la file d'attente progresse. La nature de ce type de connexion est appelée connexion en file d'attente.

Cela fait-il une différence pour les demandes des clients? (Je veux dire que le serveur qui s'exécute avec socket.listen(5) est différent du serveur qui s'exécute avec socket.listen(1) pour accepter les demandes de connexion ou pour recevoir des données?)

Oui, les deux cas sont différents. Le premier cas permettrait à seulement 5 clients d'être disposés dans la file d'attente; alors que dans le cas de backlog = 1, une seule connexion peut être maintenue dans la file d'attente, ce qui entraîne la suppression de la demande de connexion supplémentaire!

Pourquoi la valeur minimale est-elle nulle? Cela ne devrait-il pas être au moins 1?

Je n'ai aucune idée de Python, mais, selon cette source , en C, un argument de backlog de 0 peut permettre au socket d'accepter des connexions, auquel cas la longueur de la file d'attente d'écoute peut être définie sur une valeur minimale définie par l'implémentation.

Y a-t-il une valeur préférée?

Cette question n'a pas de réponse bien définie. Je dirais que cela dépend de la nature de votre application, ainsi que des configurations matérielles et logicielles. Encore une fois, selon la source, BackLog est silencieusement limité entre 1 et 5 inclus (toujours selon C).

Ce backlog est-il défini pour les connexions TCP uniquement ou s'applique-t-il également à UDP et à d'autres protocoles?

NON. Veuillez noter qu'il n'est pas nécessaire d'écouter () ou d'accepter () pour les sockets datagrammes non connectés (UDP). C'est l'un des avantages de l'utilisation de sockets datagrammes non connectés!

Mais gardez à l'esprit qu'il y a aussi des implémentations de socket de datagramme basées sur TCP (appelées TCPDatagramSocket)) qui ont un paramètre de backlog.

32
Am_I_Helpful

Lorsque la connexion TCP est en cours d'établissement, la négociation dite à trois est effectuée. Les deux côtés échangent des paquets et une fois qu'ils le font, cette connexion est appelée complète et est prête à être utilisée par l'application. .

Cependant, cette poignée de main à trois prend du temps. Et pendant ce temps, la connexion est mise en file d'attente et c'est l'arriéré. Vous pouvez donc définir le nombre maximum de connexions parallèles incomplètes via .listen(no) call (notez que selon la norme posix la valeur n'est qu'un indice , elle peut être totalement ignorée). Si quelqu'un essaie d'établir une connexion au-dessus de la limite de retard, l'autre côté la refusera.

La limite de backlog concerne donc les connexions en attente, non établies.

Une limite de backlog plus élevée sera désormais meilleure dans la plupart des cas. Notez que la limite maximale dépend du système d'exploitation, par ex. cat /proc/sys/net/core/somaxconn Donne moi 128 sur mon Ubuntu.

18
freakish