network-programming - qué - tcp udp
¿Cambia el puerto cuando un servidor acepta una conexión TCP? (3)
Cuando un cliente se conecta a un servidor utilizando TCP, se crea un nuevo socket para la secuencia TCP. ¿La conexión permanece en el mismo puerto en que se realizó la conexión o se cambia a algún otro puerto?
El nuevo socket es un concepto de nivel de aplicación introducido porque cada conexión establecida necesita un descriptor de archivo único (también distinto del descriptor de archivo de escucha), que se asigna a una sesión TCP, pero no es lo mismo. La sesión en sí se identifica por la combinación de la dirección y el puerto de origen y destino. El puerto de origen (cliente) generalmente se elige al azar, mientras que el puerto de destino (servidor) es el puerto de escucha. No se asigna ningún puerto adicional.
El servidor usa el mismo puerto para escuchar y aceptar una nueva conexión y comunicarse con el cliente remoto.
Déjame darte un ejemplo, (en el sistema Linux):
Primero, inicie un http server
por python :
xiongyu@ubuntu:~$ sudo python -m SimpleHTTPServer 500
Serving HTTP on 0.0.0.0 port 500 ...
Segundo, use el comando nc
para conectarse al http server
, aquí iniciamos dos clientes:
xiongyu@ubuntu:~$ nc 0.0.0.0 500
Use netstat
para ver el estado neto del puerto 5000:
xiongyu@ubuntu:~$ netstat -natp |grep '':500''
tcp 0 0 0.0.0.0:500 0.0.0.0:* LISTEN 54661/python
tcp 0 0 127.0.0.1:51586 127.0.0.1:500 ESTABLISHED 57078/nc
tcp 0 0 127.0.0.1:51584 127.0.0.1:500 ESTABLISHED 54542/nc
tcp 0 0 127.0.0.1:500 127.0.0.1:51586 ESTABLISHED -
tcp 0 0 127.0.0.1:500 127.0.0.1:51584 ESTABLISHED 54661/python
Como puede ver, el servidor http usa el puerto 500 para LISTEN
para el cliente; después de un nuevo cliente conectado al servidor, todavía usa el puerto 500 para comunicarse con el cliente, pero con un nuevo descriptor de archivos.
El socket asociado con el nuevo descriptor devuelto por accept
en el servidor usará el mismo puerto en el lado del servidor de la conexión que el socket original (asumiendo definiciones "normales" donde el cliente inicia la conexión). El nuevo zócalo tendrá un número de puerto de cliente diferente (el puerto remoto desde el punto de vista del servidor).