El conocimiento de redes que todo programador debería tener
Con este 20% del conocimiento de redes, seguro que podrás afrontar el 80% y más de los casos como desarrollador.

Hola dev, bienvenido 👋 No he encontrado un artículo que aborde directamente a este tema, por eso me animé a hacerlo yo mismo, y estimados devs, espero que les guste y les sirva un montón, sé que así será, ya que a mi me ha servido bastante y somos coleguitas.

Aquí voy a tocar conceptos y conocimiento básico de redes, vamos que no es algo que sea demasiado avanzado. Si alguien experto en redes lo lee, seguro pensará que es muy básico, sin embargo, como decía Cantinflas, he ahí el detalle, este artículo está orientado a desarrolladores de software, no a expertos en redes, y por increíble que parezca, existen muchos developers inlusive de nivel senior que no conocen ni la quinta parte de lo que aquí voy a contarte, sin embargo como siempre digo, seamos pragmáticos, aceptemos nuestras falencias y trabajemos en ellas.

Después de comprender este artículo te sentirás más tranquilo trabajando con puertos y hablando de protocolos, además de la confianza y seguridad que te da el saber el trasfondo de algo es invaluable. Conocer estos temas es lo que te convierte en un desarrollador prolijo, contribuye también al conocimiento de ingeniería que un ingeniero de software, valga la redundancia, debería tener. Comencemos!

Por qué es importante?

Como desarrollador de software, es importante tener conocimientos básicos sobre puertos y protocolos de red, especialmente si estás trabajando en aplicaciones que interactúan con redes o servicios en línea.

Integración con servicios o APIs

Muchas aplicaciones modernas se comunican con servicios externos a través de la red utilizando diferentes protocolos y puertos. Por ejemplo, integrar una pasarela de pago (que puede utilizar HTTPS sobre el puerto 443) o una API (que podría usar HTTP sobre el puerto 80).

Seguridad

Comprender qué puertos y protocolos están utilizando tus aplicaciones es crucial para configurar correctamente las reglas de firewall y asegurar que las comunicaciones sean seguras y eficientes en tu servidor.

Por ejemplo si tienes un servidor VPS donde alojarás tu aplicación, deberás saber configurar mínimamente el firewall si no quieres ser atacado.

En esta entrada puedes encontrar cómo configurar el firewall en un servidor ubuntu con BASH.

Optimización

Al saber qué protocolos y puertos utiliza cada servicio o aplicación, puedes optimizar el rendimiento de tu aplicación eligiendo los métodos de comunicación más eficientes y apropiados para tus necesidades específicas. Esto es parte de la diferencia entre un amateur y un profesional.

Resolución de problemas de red

En situaciones donde tu aplicación enfrenta problemas de conectividad o rendimiento, entender cómo funcionan los puertos y protocolos te permitirá diagnosticar y resolver problemas de red de manera más efectiva.

Cumplimiento de estándares y mejores prácticas

Por último pero no menos importante, al desarrollar aplicaciones que interactúan con redes, es importante seguir las mejores prácticas y estándares de la industria en términos de uso de protocolos y puertos para garantizar la interoperabilidad y la seguridad.

Esto te permitirá también saber de lo que hablas y por supuesto aumentar tu profesionalismo al trabajar.

El Modelo OSI

El Modelo OSI (Open Systems Interconnection) es un marco conceptual que define cómo los sistemas de computadoras deben comunicarse entre sí. Está dividido en capas que representan funciones específicas de la comunicación de red, desde la conexión física hasta la interacción de las aplicaciones.

Este modelo OSI divide las funciones de comunicación de red en siete capas distintas, cada una responsable de funciones específicas que contribuyen al intercambio de datos entre sistemas de computadoras.

Estimado dev, aquí te voy a desglosar cada capa y te daré algunos ejemplos de protocolos que se encuentran en cada una:

  1. Capa física:
    • Esta capa se encarga de la transmisión y recepción de datos a nivel físico. Define las características eléctricas, mecánicas y funcionales de los dispositivos de red.
    • Ejemplos:
      • Ethernet: Es un protocolo de red cableada ampliamente utilizado.
      • Wi-Fi (IEEE 802.11): Como sabrás, es un protocolo para redes inalámbricas.
      • Fibra óptica (SONET/SDH): Es una tecnología de transmisión de datos usando luz, hoy en día en plena masificación en reemplazo de las ya viejas conexiones ADSL.
  2. Capa de enlace de datos:
    • Se ocupa de la transferencia confiable de datos a través de un enlace físico.
    • Ejemplos:
      • Ethernet (IEEE 802.3): Es un protocolo común para redes cableadas.
      • Wi-Fi (IEEE 802.11): Así como en la capa anterior, también opera en esta capa para redes inalámbricas.
      • PPP (Point-to-Point Protocol): Es utilizado para establecer conexiones directas punto a punto.
      • HDLC (High-Level Data Link Control): Protocolo de enlace de datos orientado a bit.
  3. Capa de red:
    • Encargada de enrutar paquetes de datos a través de la red.
    • Ejemplos:
      • IP (Internet Protocol): No es un protocolo más, es EL PROTOCOLO, es fundamental para el direccionamiento y enrutamiento de paquetes en Internet.
      • ICMP (Internet Control Message Protocol): Es utilizado para el diagnóstico de problemas en la red.
      • ARP (Address Resolution Protocol): Asigna direcciones IP a direcciones físicas (MAC).
      • OSPF (Open Shortest Path First) y BGP (Border Gateway Protocol): Son protocolos de enrutamiento.
  4. Capa de transporte:
    • Proporciona comunicación de extremo a extremo entre diferentes dispositivos en la red.
    • Ejemplos:
      • TCP (Transmission Control Protocol): Garantiza la entrega ordenada y confiable de datos.
      • UDP (User Datagram Protocol): Proporciona un método simple de transferencia sin conexión.
      • SCTP (Stream Control Transmission Protocol): Soporta transmisión de datos fiable y no fiable.
  5. Capa de sesión:
    • Establece, administra y finaliza sesiones entre aplicaciones de red.
    • Ejemplos:
      • NetBIOS (Network Basic Input/Output System): Proporciona servicios de sesión a aplicaciones de red.
      • RPC (Remote Procedure Call): Permite a un programa solicitar un servicio de otro programa ubicado en otra computadora en una red.
      • SIP (Session Initiation Protocol): Utilizado para establecer, modificar y finalizar sesiones multimedia.
  6. Capa de presentación:
    • Se encarga de la representación de los datos, la sintaxis y la encriptación.
    • Ejemplos:
      • SSL/TLS (Secure Sockets Layer/Transport Layer Security): Se encarga de proporcionar comunicaciones seguras a través de Internet.
      • JPEG (Joint Photographic Experts Group): formato de archivo para imágenes.
      • ASCII (American Standard Code for Information Interchange): codificación de caracteres estándar.
  7. Capa de aplicación:
    • Es la capa más cercana al usuario final y proporciona servicios de red directamente accesibles a las aplicaciones.
    • Ejemplos:
      • HTTP (Hypertext Transfer Protocol): Utilizado para la transferencia de hipertexto en la World Wide Web.
      • FTP (File Transfer Protocol): Utilizado para la transferencia de archivos.
      • SMTP (Simple Mail Transfer Protocol): protocolo estándar para el envío de correo electrónico.
      • DNS (Domain Name System): Traduce nombres de dominio a direcciones IP.
      • SNMP (Simple Network Management Protocol): Es utilizado para administrar dispositivos de red.

El modelo OSI. Créditos de la imagen: community.fs.com

Protocolos

Un protocolo es un conjunto de reglas y estándares que permiten la comunicación entre dispositivos en una red. Estos protocolos definen cómo se deben enviar, recibir y procesar los datos, asegurando que los dispositivos puedan entenderse y comunicarse eficazmente.

Los protocolos son esenciales para la interoperabilidad y comunicación entre diferentes dispositivos y redes. Sin ellos, no sería posible establecer conexiones fiables ni garantizar que los datos se interpreten correctamente en cada extremo de la comunicación.

Tipos de Protocolos en Redes

Existen muchos protocolos utilizados en las redes de comunicación, cada uno con un propósito específico. Algunos de los más importantes son:

  1. Protocolo de Control de Transmisión (TCP): Es un protocolo orientado a la conexión que garantiza la entrega ordenada y fiable de una secuencia de bytes desde un programa en un ordenador a otro programa en otro ordenador.
  2. Protocolo de Internet (IP): Es responsable de direccionar y enrutar los paquetes de datos entre dispositivos en diferentes redes.
  3. Protocolo de Transferencia de Hipertexto (HTTP/HTTPS): Utilizado para la transmisión de documentos hipermedia, como páginas web, en la World Wide Web.
  4. Protocolo de Transferencia de Archivos (FTP): Protocolo estándar utilizado para la transferencia de archivos entre un cliente y un servidor en una red.
  5. Protocolo Simple de Correo (SMTP): Utilizado para la transferencia de correos electrónicos entre servidores de correo.
  6. Protocolo de Resolución de Direcciones (ARP): Utilizado para mapear una dirección IP a una dirección física de hardware en una red local.

Ejemplo de Comunicación con Protocolos

Cuando un usuario accede a un sitio web, varios protocolos trabajan juntos para hacer posible la comunicación:

  1. DNS (Sistema de Nombres de Dominio) traduce el nombre de dominio del sitio web a una dirección IP.
  2. TCP/IP se encarga de establecer la conexión y garantizar que los datos se envíen de manera fiable entre el cliente y el servidor.
  3. HTTP/HTTPS maneja la solicitud y respuesta de las páginas web.

El Protocolo HTTP

Dada su importancia, voy a profundizar en este protocolo en particular.

El Protocolo de Transferencia de HiperTexto (Hypertext Transfer Protocol) es un sencillo protocolo cliente-servidor que articula los intercambios de información entre los clientes Web y los servidores HTTP.

Se compone de tres elementos fundamentales:

  • Petición HTTP (Request)
  • Respuesta HTTP (Response) y
  • Métodos HTTP (Methods)
Comunicación mediante HTTP. Créditos de la imagen: developer.mozilla.org

Petición

Es el mensaje que el cliente le envía al servidor, por supuesto esto se hace mediante el protocolo HTTP.

Se compone de 3 elementos: Línea de petición, cabecera o header y de cuerpo del mensaje o body el cual es opcional.

Respuesta

Es el mensaje que el servidor le envía como respuesta a una petición al cliente, también mediante el protocolo HTTP.

También se compone de 3 partes: Línea de Status o código de estado, cabecera o header y cuerpo o body opcional.

Los códigos de estado HTTP son respuestas emitidas por un servidor en respuesta a una solicitud HTTP hecha por un cliente (como un navegador web o una aplicación). Estos códigos indican el resultado de la solicitud y se dividen en cinco categorías principales, cada una representada por un rango de números.

Aquí te dejo una explicación breve de cada categoría ✌️:

  1. 1xx (Informativos):
    • 100 Continue: El servidor ha recibido la solicitud inicial y el cliente puede continuar con su solicitud.
    • 101 Switching Protocols: El servidor acepta cambiar a un protocolo diferente según lo solicitado por el cliente.
  2. 2xx (Éxito):
    • 200 OK: La solicitud ha tenido éxito y el servidor ha devuelto los datos solicitados.
    • 201 Created: La solicitud ha tenido éxito y se ha creado un nuevo recurso.
    • 204 No Content: La solicitud ha tenido éxito, pero el servidor no devuelve ningún contenido.
  3. 3xx (Redirección):
    • 301 Moved Permanently: El recurso solicitado se ha movido permanentemente a una nueva URL.
    • 302 Found: El recurso solicitado se encuentra temporalmente en una URL diferente.
    • 304 Not Modified: El recurso no ha cambiado desde la última solicitud, por lo que el cliente puede usar la versión en caché.
  4. 4xx (Errores del Cliente):
    • 400 Bad Request: La solicitud del cliente es incorrecta o no se puede procesar.
    • 401 Unauthorized: El cliente debe autenticarse para obtener el recurso solicitado.
    • 403 Forbidden: El cliente no tiene permiso para acceder al recurso.
    • 404 Not Found: El recurso solicitado no se ha encontrado en el servidor.
  5. 5xx (Errores del Servidor):
    • 500 Internal Server Error: El servidor ha encontrado un error interno y no puede completar la solicitud.
    • 502 Bad Gateway: El servidor, actuando como una puerta de enlace o proxy, recibió una respuesta inválida del servidor upstream.
    • 503 Service Unavailable: El servidor no está disponible temporalmente, generalmente debido a mantenimiento o sobrecarga.

Te estarás preguntando, y cómo me ayuda saber estos códigos? Claro que ayudan, aquí te explico las razones:

Diagnóstico y Depuración: Los códigos de estado te ayudan a identificar problemas rápidamente. Por ejemplo, un 404 indica que el recurso no se encontró, como cuando entras a una URL inválida o que ya no existe, mientras que un 500 indica un problema en el servidor y tú como desarrollador deberías solucionar.

Manejo de Errores: Permiten al desarrollador gestionar y mostrar mensajes de error adecuados al usuario. Por ejemplo, mostrar una página de "No encontrado" para un 404.

Control de Flujo: Al diseñar APIs, los códigos de estado indican al cliente el resultado de sus solicitudes, permitiendo manejar respuestas de manera adecuada.

Seguridad y Autenticación: Códigos como 401 y 403 ayudan a implementar y verificar controles de acceso y autenticación en las aplicaciones.

Métodos HTTP

De forma coloquial se les llama también verbos HTTP y son 9:

GET: Solicita la representación de un recurso específico. Las solicitudes GET solo deben recuperar datos y no deben tener ningun otro propósito.

POST: Se utiliza para enviar datos al servidor, como el contenido de un formulario, y puede causar la creación de un nuevo recurso o la actualización de uno existente.

PUT: Reemplaza todas las representaciones actuales del recurso de destino con la carga útil de la solicitud. Se utiliza para actualizar o crear un recurso específico.

DELETE: Elimina el recurso especificado.

HEAD: Es similar a GET, pero solicita solo los encabezados de la respuesta sin el cuerpo del mensaje. Se utiliza para obtener metainformación sobre un recurso.

OPTIONS: Describe las opciones de comunicación para el recurso de destino, permitiendo al cliente determinar las capacidades del servidor.

PATCH: Aplica modificaciones parciales a un recurso. A diferencia de PUT, que reemplaza completamente el recurso, PATCH aplica cambios incrementales o parciales.

TRACE: Realiza una prueba de bucle de regreso para la ruta a la que llega el mensaje, permitiendo ver qué cambios o adiciones se realizan a la solicitud por los servidores intermedios.

CONNECT: Establece un túnel para comunicación segura a través de un proxy.

Un desarrollador de software debería conocer el protocolo HTTP porque es la base de la comunicación en la web, y entender cómo funciona es esencial para construir aplicaciones web efectivas y eficientes. Aquí te explico en palabras sencillas por qué es importante y cómo se usa en el día a día:

Por qué es importante conocer HTTP?

Comunicación Web: HTTP es el protocolo que permite que los navegadores y servidores web se comuniquen. Cada vez que visitas una página web, se está utilizando HTTP para transferir datos entre tu navegador y el servidor.

Interacción con APIs: Muchas aplicaciones modernas dependen de APIs (Interfaces de Programación de Aplicaciones) para funcionar. Estas APIs a menudo utilizan HTTP para enviar y recibir datos. Saber cómo funcionan las solicitudes y respuestas HTTP es crucial para integrar y usar estas APIs correctamente.

Depuración y Resolución de Problemas: Cuando algo va mal en una aplicación web, conocer HTTP te ayuda a entender y solucionar problemas. Por ejemplo, si una solicitud a un servidor falla, los códigos de estado HTTP (como 404 para "No encontrado" o 500 para "Error del servidor") te pueden dar pistas sobre qué salió mal.

Optimización del Rendimiento: Entender cómo se transfieren los datos a través de HTTP te permite optimizar la velocidad y eficiencia de tu aplicación. Puedes mejorar el rendimiento de la carga de páginas, gestionar mejor las cachés, y minimizar la latencia.

Cómo se usan los métodos HTTP en el día a día?

Enviar Solicitudes y Recibir Respuestas: Cuando desarrollas una aplicación web, a menudo necesitas enviar solicitudes HTTP (GET, POST, PUT, DELETE) para interactuar con un servidor. Por ejemplo, una solicitud GET para obtener datos de una API, o una solicitud POST para enviar datos de un formulario.

Manejo de Formularios: Al trabajar con formularios en una aplicación web, los datos se envían al servidor mediante solicitudes HTTP. Conocer HTTP te ayuda a gestionar cómo se envían estos datos y cómo manejar las respuestas del servidor.

Configuración de Rutas y Endpoints: Al crear APIs, configuras rutas y endpoints que responden a diferentes métodos HTTP. Por ejemplo dev, podrías tener un endpoint que responda a solicitudes GET para devolver datos de usuarios y otro que responda a solicitudes POST para crear nuevos usuarios.

Autenticación y Seguridad: HTTP es fundamental para implementar y entender mecanismos de autenticación y seguridad, como el uso de tokens de autorización en las cabeceras de las solicitudes para acceder a recursos protegidos.

Uso de Herramientas de Desarrollo: Herramientas como Postman para probar APIs, o la pestaña "Network" en las herramientas de desarrollador de los navegadores, se basan en HTTP. Estas herramientas muestran cómo se envían y reciben las solicitudes HTTP, ayudándote a depurar y mejorar tu aplicación, así que es mejor que sepas de esto dev 🐿️.

En resumen, conocer HTTP te permite como desarrollador web construir aplicaciones que pueden comunicarse con servidores y otras aplicaciones, resolver problemas más eficientemente y optimizar el rendimiento y la seguridad de sus aplicaciones. Es una habilidad esencial para cualquier desarrollador de software que trabaje en el desarrollo web.

Puertos

Los números de puertos en el protocolo TCP/IP se representan utilizando 16 bits, es por eso que hay 216 combinaciones, en otras palabras, 65536 posibles puertos.

Los puertos van desde el 0 hasta el 65535 y están clasificados en 3:

Puertos Bien Conocidos (Well-Known Ports): Se refiere al rango de puertos del 0 al 1023. Estos son reservados para servicios específicos y protocolos estándar que se utilizan comúnmente en Internet. Se denominan "bien conocidos" porque están establecidos por la Internet Assigned Numbers Authority (IANA) y son ampliamente reconocidos.

Puertos Registrados (Registered Ports): Se refiere al rango de puertos del 1024 al 49151. Estos puertos no están reservados específicamente para ningún protocolo estándar, pero pueden ser registrados en la IANA por empresas, organizaciones o desarrolladores para sus aplicaciones o servicios específicos que no están en el rango de puertos bien conocidos.

Puertos Dinámicos y/o Privados: El rango de puertos aquí son los comprendidos entre el 49152 y el 65535. También conocidos como puertos efímeros, estos están disponibles para uso general y son utilizados por aplicaciones y servicios según sea necesario. No están reservados específicamente por ninguna entidad y no tienen una asignación estándar como los puertos bien conocidos y registrados. Son utilizados principalmente para conexiones salientes y temporales.

Algunos puertos utilizados...

Como mencioné, los puertos bien conocidos son reservados para servicios, aquí te hago una lista de algunos puertos y sus servicios:

20 FTP (File Transfer Protocol) - Data Transfer
21 FTP (File Transfer Protocol) - Command Control
22 SSH (Secure Shell)
23 Telnet
25 SMTP (Simple Mail Transfer Protocol)
53 DNS (Domain Name System)
67 DHCP (Dynamic Host Configuration Protocol) - Servidor
68 DHCP (Dynamic Host Configuration Protocol) - Cliente
69 TFTP (Trivial File Transfer Protocol)
80 HTTP (HyperText Transfer Protocol)
110 POP3 (Post Office Protocol v3)
119 NNTP (Network News Transfer Protocol)
123 NTP (Network Time Protocol)
135 MS RPC (Microsoft Remote Procedure Call)
137-139 NetBIOS
143 IMAP (Internet Message Access Protocol)
161 SNMP (Simple Network Management Protocol)
194 IRC (Internet Relay Chat)
389 LDAP (Lightweight Directory Access Protocol)
443 HTTPS (HyperText Transfer Protocol Secure)
445 Microsoft-DS (Directory Services)
465 SMTPS (Simple Mail Transfer Protocol Secure)
514 Syslog
515 LPD (Line Printer Daemon)
587 SMTP (Submission)
636 LDAPS (Lightweight Directory Access Protocol over SSL)
989/990 FTPS (File Transfer Protocol Secure)
993 IMAPS (Internet Message Access Protocol Secure)
995 POP3S (Post Office Protocol 3 Secure)

Por otra parte, los puertos registrados, se usan para algunos servicios o productos, a continuación una pequeña lista:

1433 Microsoft SQL Server
1723 PPTP (Point-to-Point Tunneling Protocol)
1812 RADIUS (Remote Authentication Dial-In User Service)
3306 MySQL
3389 RDP (Remote Desktop Protocol)
5432 PostgreSQL
5900 VNC (Virtual Network Computing)
6379 Redis
8080 HTTP Alternate (comúnmente usado para proxy y caching)
8443 HTTPS Alternate
27017 MongoDB

Recomendaciones

Para minimizar la probabilidad de conflictos y asegurar que tu aplicación funcione correctamente, es generalmente recomendable utilizar puertos en el rango de los puertos registrado y dinámico (1024 al 65535) a excepción de los mencionados arriba. Sobretodo los puertos dinámicos (del 49152 al 65535) son menos propensos a estar asignados permanentemente a otros servicios o aplicaciones.

Ejemplo

Si tu aplicación necesita un puerto específico y quieres minimizar posibles conflictos, podrías elegir un puerto en el rango de 49152-65535, por ejemplo, el puerto 50000.

Aunque es menos recomendado, también puedes asignar puertos dentro del rango de puertos registrados a tus proyectos, por ejemplo suele ser común utilizar el puerto 4000 o 5000 para tu aplicación en Angular, y los puertos 20000, 21000 y 22000 para tus servicios del backend. Los puertos mencionados en este párrafo son sólo ejemplos que te doy para que te hagas una idea, lo importante es que no utilices alguno ya reservado ni alguno del rango de puertos bien conocidos.

Consideraciones adicionales sobre los puertos

  • Asegúrate de que el puerto que elijas no esté en uso por otro servicio en el mismo sistema antes de asignarlo a tu aplicación.
  • Si tu aplicación será desplegada en entornos de producción, es buena práctica documentar los puertos que estás utilizando para evitar conflictos futuros.
  • Si tu aplicación requiere múltiples puertos o tiene componentes que interactúan entre sí, asegúrate de planificar y documentar adecuadamente el rango de puertos que utilizarás.
Qué bien se siente el saber cómo funcionan las cosas dev! 😎 Foto de Dale de Vera en Unsplash

Otros conceptos

Redes es toda una profesión en sí, así que siempre habrán más conceptos por conocer de ella, sin embargo algunos conceptos que también deberías tener en claro son los siguientes:

Direcciones IP: Son identificadores únicos asignados a dispositivos en una red (IPv4 e IPv6).

Enrutamiento: Es el proceso de enviar datos a través de una red desde el origen hasta el destino utilizando routers y gateways.

Firewalls: Son dispositivos de hardware o software que controlan el tráfico de red basado en reglas de seguridad.

DNS (Domain Name System): Sistema que traduce nombres de dominio (URLs) a direcciones IP.

Uff dev 🔥 ha sido una lectura prolija y con lo mencionado anteriormente deberías moverte con soltura, aplicando Pareto, este es el 20% del conocimiento que te permitirá desenvolverte en el 80% de los casos en tu trabajo como desarrollador de software, y si necesitas algún otro concepto siempre puedes investigarlo por tu cuenta y añadirlo a tu set de skills, eso es muy genial! 🐿️😎✌️

Ahora que ya lo sabes, compártelo 🤝 Foto de charlesdeluvio en Unsplash

Si esta entrada te ha encantado, entonces compártela crack, me ayudarías un montón 🦊

Créditos de la imagen de portada: Foto de Thomas Jensen en Unsplash

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *