
Tengo un conocimiento bastante bueno del uso práctico de los puertos y de cómo funcionan. Sin embargo, tengo algunas preguntas que me gustaría aclarar.
- ¿Qué sucede si enviamos una solicitud sin especificar un puerto para el socket del servidor?
- ¿Hay alguna manera de configurar una máquina para que, en lugar de que un proceso escuche en un puerto en particular, todas las solicitudes enviadas a mi dirección IP sean manejadas por el mismo proceso? En cuyo caso, el cliente podría omitir el puerto en la solicitud.
- Partiendo de la pregunta 2, si solo quiero ejecutar un servidor de algún tipo en algo como una Raspberry Pi, ¿podría hacerlo de manera que mi dirección IP se enrute a mi RPi, que maneja todas y cada una de las solicitudes de red entrantes utilizando el mismo servidor? ? Es decir, las personas simplemente se conectan a la dirección IP, sin número de puerto, para conectarse a mi servidor.
Respuesta1
¿Por qué debemos proporcionar un número de puerto además de una IP al enviar una solicitud?
Porque el protocolo TCP (y UDP) lo requiere. Es parte de la especificación del protocolo.
¿Qué sucede si enviamos una solicitud sin especificar un puerto para el socket del servidor?
Bueno, si no especifica un número de puerto, probablemente habrá ceros en esa parte de la llamada API. El puerto 0 es un puerto reservado y algunas implementaciones lo utilizan para indicar que el sistema asigna dinámicamente un puerto.
¿Hay alguna manera de configurar una máquina para que, en lugar de que un proceso escuche en un puerto en particular, todas las solicitudes enviadas a mi dirección IP sean manejadas por el mismo proceso?
No si utiliza protocolos de capa de transporte TCP o UDP o cualquiera de los protocolos de nivel de aplicación integrados en ellos. Como HTTP
En algunos sistemas operativos hay un proceso único como parte del sistema operativo, pero transfiere conexiones a aplicaciones específicas.
¿Podría tenerlo para que mi dirección IP se enrute a mi RPi?
Puede configurar el enrutador para enrutar todas las solicitudes de conexión entrantes a su rPi
la gente simplemente se conecta a la dirección IP, sin número de puerto, para conectarse a mi servidor.
No utilizar protocolos estándar como HTTP.
Creo que no es posible utilizar API estándar como Berkely Sockets. Me imagino que podrías, con algo de esfuerzo, utilizar un protocolo de capa de transporte nuevo o diferente que hayas creado tú mismo. Necesitarías algunas razones bastante sólidas para sufrir todo ese inconveniente.
Respuesta2
¿Qué sucede si enviamos una solicitud sin especificar un puerto para el socket del servidor?
No puedes, un socket es un puerto IP + por definición. La razón por la que existen puertos es porque varios programas en una máquina pueden enviar/recibir tráfico y los puertos se utilizan para diferenciar entre procesos en cada extremo.
¿Hay alguna manera de configurar una máquina para que, en lugar de que un proceso escuche en un puerto en particular, todas las solicitudes enviadas a mi dirección IP sean manejadas por el mismo proceso?
Podría hacer que su proceso abra 65535 sockets, uno en cada puerto. No puedes hacer que un programa existente haga esto que no esté escrito para hacerlo sin algún tipo de programa intermediario extraño que probablemente tendrías que escribir tú mismo.
En Linux, es posible que puedas crear una iptables
configuración que haga esto o algo equivalente.
Si solo quiero ejecutar un servidor de algún tipo en algo como una Raspberry Pi, ¿podría hacerlo para que mi dirección IP se enrute a mi RPi, que maneja todas y cada una de las solicitudes de red entrantes utilizando el mismo servidor?
La situación predeterminada en la mayoría de los enrutadores residenciales estándar es que su enrutador ignore cualquier tráfico que le envíe alguien externo.
En casi todos estos enrutadores, puede realizar el reenvío de puertos, lo que le indica a su enrutador que reenvíe el tráfico entrante en un puerto específico a un sistema específico en su red privada detrás del enrutador.
Probablemente también pueda decirle a su enrutador que reenvíe cualquier tráfico entrante no solicitado a una IP específica en su red privada detrás del enrutador. Esto se llama DMZ.
Respuesta3
Los puertos son esenciales para los protocolos que permiten que múltiples procesos se comuniquen entre servidores. Esto es más que una consideración práctica.
Los servicios conocidos tienen puertos asignados: DNS=53, HTTP=80, HTTPS=443, SMTP=25, Telnet=23, SSH=22, FTP=20&21, etc. Para servicios tan conocidos, no es necesario especificar el port si se están ejecutando en el puerto asignado al servicio. Los puertos asignados se enumeran en /etc/services en plataformas Unix/Linux.
- Para TCP y UDP, no puedes realizar conexiones sin un puerto. El encabezado incluye campos para los puertos de origen y de destino. Siempre habrá un valor en estos campos, incluso si es cero.
- Es posible capturar todos los paquetes que llegan a una interfaz. Así funcionan herramientas como tcpdump.
- Como se indica en 1, todas las solicitudes entrantes tendrán un número de puerto. Los enrutadores SOHO generalmente admiten una DMZ y reenviarán todas las solicitudes entrantes que no se enrutan de otro modo a la dirección IP asignada a la DMZ. En la mayoría de los casos, sólo necesita reenviar los puertos necesarios para el servicio al servidor (su Raspberry Pi). Esto le permitiría tener varias Raspberry Pis ejecutando diferentes servicios.