¿Qué es “backlog” en las conexiones TCP?

A continuación, verá un progtwig de Python que actúa como un servidor que escucha las solicitudes de conexión al puerto 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 pregunta es cuál es la función del parámetro del método socket.listen() (es decir, 5 ).

Basado en los tutoriales de internet:

El argumento de la acumulación especifica el número máximo de conexiones en cola y debe ser al menos 0; El valor máximo depende del sistema (generalmente 5), el valor mínimo se fuerza a 0.

Pero:

  1. ¿Qué es estas conexiones en cola ?
  2. ¿Hace algún cambio para las solicitudes de los clientes? (Quiero decir, ¿el servidor que se está ejecutando con socket.listen(5) diferente del servidor que se está ejecutando con socket.listen(1) al aceptar solicitudes de conexión o al recibir datos?)
  3. ¿Por qué el valor mínimo es cero? ¿No debería ser al menos 1 ?
  4. ¿Qué valor se prefiere?
  5. ¿Está este backlog definido solo para conexiones TCP o lo tenemos para UDP y otros protocolos?

NOTA: Las respuestas se enmarcan sin tener antecedentes en Python, pero las preguntas son irrelevantes para el lenguaje, para ser respondidas.

¿Cuáles son estas conexiones en cola?

En palabras simples, BACKLOG es igual al número de conexiones pendientes que la cola mantendrá.

Cuando varios clientes se conectan al servidor, el servidor retiene las solicitudes entrantes en una cola. Los clientes se organizan en la cola y el servidor procesa sus solicitudes una por una a medida que avanza el miembro de la cola. La naturaleza de este tipo de conexión se llama conexión en cola.

¿Hace algún cambio para las solicitudes de los clientes? (Quiero decir, ¿el servidor que se está ejecutando con socket.listen (5) es diferente del servidor que se está ejecutando con socket.listen (1) al aceptar solicitudes de conexión o al recibir datos?)

Sí, ambos casos son diferentes. El primer caso permitiría que solo 5 clientes se organizaran en la cola; mientras que en el caso de backlog = 1, solo se puede mantener 1 conexión en la cola, lo que resulta en la eliminación de la solicitud de conexión adicional.

¿Por qué el valor mínimo es cero? ¿No debería ser al menos 1?

No tengo idea acerca de Python, pero, según esta fuente , en C, un argumento de reserva de 0 puede permitir que el socket acepte conexiones, en cuyo caso la longitud de la cola de escucha puede establecerse en un valor mínimo definido por la implementación.

¿Qué valor se prefiere?

Esta pregunta no tiene una respuesta bien definida. Diría que esto depende de la naturaleza de su aplicación, así como también de las configuraciones de hardware y la configuración del software. Nuevamente, según la fuente, BackLog se limita silenciosamente a entre 1 y 5, inclusive (nuevamente según C).

¿Está este registro definido solo para conexiones TCP o lo tenemos para UDP y otros protocolos?

NO. Tenga en cuenta que no es necesario escuchar () o aceptar () para sockets de datagtwigs desconectados (UDP). ¡Esta es una de las ventajas de usar sockets de datagtwigs desconectados!

Pero, tenga en cuenta que también hay TCP based datagram socket implementations (llamadas TCPDatagramSocket) que también tienen un parámetro de acumulación.

Cuando se establece la conexión TCP, se realiza el llamado protocolo de enlace de tres vías. Ambas partes intercambian algunos paquetes y una vez que lo hacen, esta conexión se llama completa y está lista para ser utilizada por la aplicación.

Sin embargo, este apretón de manos de tres vías lleva algún tiempo. Y durante ese tiempo la conexión se pone en cola y esta es la acumulación. Por lo tanto, puede establecer la cantidad máxima de conexiones paralelas incompletas a través de .listen(no) call (tenga en cuenta que según el estándar de posix, el valor es solo una sugerencia , puede ser totalmente ignorado). Si alguien intenta establecer una conexión por encima del límite de acumulación, la otra parte la rechazará.

Por lo tanto, el límite de trabajo pendiente se trata de conexiones pendientes, no establecidas.

Ahora, un mayor límite de retraso será mejor en la mayoría de los casos. Tenga en cuenta que el límite máximo depende del sistema operativo, por ejemplo, cat /proc/sys/net/core/somaxconn me da 128 en mi Ubuntu.