Soy un principiante en todo esto de http y tcp/ip. Entonces, tal vez haya muchas cosas en estas preguntas que no tengan sentido o que sean totalmente incorrectas.
Primero agregaré todas las preguntas que tenía en mente ya que no pude ponerlas en el título.
Trabajo en Django (Python Framework) para desarrollo web.
Estoy confundido en cuanto a cómo funcionan los servidores. ¿Y cómo se decide el puerto de destino a través de la url?
P PRINCIPAL: Lo que he aprendido hasta ahora es que a través de DNS obtenemos la dirección IP del sitio web. Y el puerto (tanto el destino como el origen) lo decide el TCP. Y enviado a través de encabezados TCP. Pero, ¿cómo decide a qué puerto debe ir en un servidor (es decir, puerto de destino)?
MI RESPUESTA A LA PREGUNTA ANTERIOR: Después de pasar mucho tiempo, he llegado a saber que, las solicitudes http están predeterminadas en 80 y https está predeterminada en 443 y, de manera similar, otros tipos de solicitudes también están predeterminadas en algún puerto. Entonces podemos averiguar la dirección IP en base a esto.
Pero esto plantea otra pregunta en mi mente.
Otra pregunta: también construí un sitio web simple de django y lo implementé en pythonanywhere. Pero lo implementé como una aplicación completa. Supongamos que mi aplicación django acepta diferentes tipos de solicitudes como HTTP, HTTPS, SMTP, etc. Entonces, ¿cómo se decidirá el puerto para estas tareas específicas? Debido a que todas estas solicitudes vendrán bajo una sola aplicación, deberían ejecutarse en el mismo puerto. No creo que el servidor cambie nada en la aplicación en sí. Entonces, ¿cómo se decidirá ahora el puerto de destino?
NOTA: No estoy seguro de si es posible hacer una aplicación en django que acepte diferentes tipos de solicitudes. Pero debería ser posible porque podemos crear una aplicación diferente, con startapp y ejecutarla en una URL diferente.
Dondequiera que leí, decía que el puerto predeterminado para http es 80, ¿entonces eso significa que también debería ser posible cambiarlo?
PREGUNTAS MAS IMPORTANTES Y PARA RESUMIR TODAS LAS DUDAS Supongamos que tengo un proyecto que acepta diferentes solicitudes. Y quiero implementarlo en el servidor, entonces, ¿cómo se separarán las solicitudes http y las solicitudes smtp? ¿Tengo que crear manualmente diferentes aplicaciones y luego implementarlas en diferentes puertos o algo así? Si no es así y todo se ejecuta en el mismo puerto, ¿cómo se decide este puerto en el navegador? Supongamos que mi nombre de dominio es xyz.com, entonces, ¿cómo se accederá al puerto específico en el servidor?
Básicamente, ¿cómo se decide un puerto de destino?
Como ya has visto, los protocolos suelen tener un puerto asignado por defecto (80 para http, 443 para https, 25 para smtp,…). Los principales protocolos en uso en Internet tienen su puerto asignado por la IANA .
Algunas aplicaciones también utilizan un puerto de forma predeterminada (por ejemplo, el servicio de base de datos PostreSQL está configurado de forma predeterminada para utilizar el puerto 5432). https://web.mit.edu/rhel-doc/4/RH-DOCS/rhel-sg-en-4/ch-ports.html
La mayoría de las veces puede omitir el puerto, porque la aplicación que usa conoce el valor predeterminado y lo usa por usted. Cuando le pide a su navegador web que envíe una solicitud a http://example.com , en segundo plano, la solicitud se envía a http://example.com:80 .
Puede configurar sus aplicaciones para escuchar en un puerto diferente al predeterminado. Las personas pueden querer hacer esto para diferentes propósitos (lista no exhaustiva):
Cambiar los puertos de esta manera puede requerir una gran cantidad de configuración (debe configurar el servicio y todos sus clientes).
Ahora, la otra parte de la pregunta: ¿cómo el mismo puerto puede ser utilizado por diferentes servicios?
Si desea exponer diferentes servicios en el mismo puerto, puede usar algo como un proxy inverso. Es una aplicación que escucha en un puerto y redirige el tráfico en base a reglas, y en ocasiones ofrecen la posibilidad de modificar el contenido (por nombrar algunos: Traefik, Caddy. Los servidores web generales también tienen capacidades de proxy inverso: Nginx, Apache con mod_proxy, ...).
Por ejemplo, imagina que tienes 2 aplicaciones web y quieres que estén accesibles en el puerto 80. Podrías configurar estas aplicaciones para usar diferentes puertos (digamos 8080 y 8081), tener el proxy inverso para escuchar en el puerto 80 y redirigir las solicitudes según en la URL utilizada (podría redirigir app1.example.com:80 a localhost:8080 y app2.example.com:80 a localhost:8081 ). Solo el puerto 80 tiene que ser accesible desde el exterior.