getsockname - socket python 3 example
¿Qué es "retraso" en las conexiones TCP? (2)
Cuando se establece la conexión TCP, se realiza el llamado handshake 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 algo de tiempo. Y durante ese tiempo, la conexión está en cola y esto es atrasado. Entonces puede establecer la cantidad máxima de conexiones paralelas incompletas. Si alguien intenta establecer una conexión por encima del límite de retraso, el otro lado lo rechazará.
Entonces, el límite de retraso es sobre conexiones pendientes, no establecidas.
Ahora, el límite de atrasos más alto 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.
A continuación, verá un programa 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()
Las preguntas son cuál es la función del parámetro del método socket.listen()
(es decir, 5
).
Basado en los tutoriales en Internet:
El argumento de retraso especifica el número máximo de conexiones en cola y debe ser al menos 0; el valor máximo depende del sistema (normalmente 5), el valor mínimo se fuerza a 0.
Pero:
- ¿Qué son estas conexiones en cola ?
- ¿Hay algún cambio para las solicitudes de los clientes? (Quiero decir, ¿el servidor que se ejecuta con
socket.listen(5)
diferente del servidor que se ejecuta consocket.listen(1)
al aceptar solicitudes de conexión o al recibir datos?) - ¿Por qué el valor mínimo es cero? ¿No debería ser al menos
1
? - ¿Qué valor es preferido?
- ¿Este
backlog
definido solo para conexiones TCP o lo tenemos para UDP y otros protocolos también?
NOTA: Las respuestas se enmarcan sin tener ningún fondo en Python, pero las preguntas son irrelevantes para el idioma, para ser contestadas.
¿Qué son estas conexiones en cola?
En palabras simples, BACKLOG es igual a cuántas conexiones pendientes tendrá la cola.
Cuando a varios clientes les gustaría conectarse al servidor, el servidor retiene las solicitudes entrantes en una cola. Los clientes se organizan en una cola y el servidor procesa sus solicitudes una por una a medida que avanza el miembro de la cola. Esta naturaleza de conexión se llama conexión en cola.
¿Hay algún cambio para las solicitudes de los clientes? (Quiero decir, ¿el servidor que se ejecuta con socket.listen (5) es diferente del servidor que se ejecuta 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 1 conexión puede ser retenida en la cola, ¡dando como resultado la caída 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 acumulación 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 es preferido?
Esta pregunta no tiene una respuesta bien definida. Yo 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. De nuevo, según la fuente, BackLog
está silenciosamente limitado a entre 1 y 5, inclusive (de nuevo según C).
¿Este backlog está definido solo para conexiones TCP o lo tenemos para UDP y otros protocolos también?
NO. Tenga en cuenta que no es necesario escuchar () o aceptar () para sockets de datagramas desconectados (UDP). ¡Esta es una de las ventajas de usar conectores de datagramas no conectados!
Pero, tenga en cuenta que también hay TCP based datagram socket implementations
(llamadas TCPDatagramSocket) que también tienen un parámetro de backlog.