Protocolos de Aplicación en Internet: Funcionamiento y Características

Clasificado en Informática

Escrito el en español con un tamaño de 2,51 MB

Protocolos Clásicos

      • Con este nombre englobamos a los protocolos de nivel de aplicación que primero se definieron en Internet:
        • Protocolos de terminal remoto.
          • TELNET.
          • RLOGIN.
        • Protocolos de transferencia de ficheros.
          • FTP.

Terminal Remoto: Introducción (I)

      • Antiguamente, para conectarse a una máquina había que hacerlo desde un terminal:
        • Físicamente conectado a la máquina.
        • Necesitaba un port por máquina (host).

Objetivo:

      • Poder conectarse desde un único terminal a múltiples máquinas:
        • Físicamente conectadas a una red.
        • Sin límite en el número de hosts.
      • Es uno de los servicios más antiguos y usados de Internet.
      • Dos protocolos de nivel de aplicación proporcionan este servicio:
        • TELNET:
          • Muy antiguo (origen: 1969) y complejo (10.000 líneas).
          • Reimplementación en cualquier implementación TCP/IP y sistemas operativos.
        • RLOGIN:
          • Más simple (100 líneas de código).
          • Nativo en sistemas UNIX (luego portátil a otros sistemas operativos).
      • Son protocolos cliente/servidor.

En cuanto al tráfico que se genera:

      • No es un tipo de aplicación que genere gran volumen de tráfico.
      • Generan paquetes pequeños.
        • Relación 1:20 entre el número de bytes enviados por cliente y servidor.

Protocolos de Terminal Remoto

RLOGIN

      • Pensado para hacer "login remoto" entre máquinas UNIX.
      • Apareció con el 4.1 BSD (1983).
        • Forma parte de un conjunto de comandos conocidos como comandos de red:
          • rlogin (login remoto).
          • rsh (shell remota).
          • rcp (copiar ficheros).
      • RFC 1282 (1991):
        • Más sencillo que TELNET.
        • No tiene negociación de opciones como se necesita entre hosts de sistemas diferentes.
        • Se diseñó sólo para sistemas BSD.

RLOGIN: Protocolo (I)

      • El cliente establece una conexión TCP con el puerto 513 del servidor.
      • El cliente envía (en uno o varios segmentos TCP):
  1. El nombre del usuario en el cliente, terminado por un \0.
  2. El nombre del usuario en el servidor, terminado por un \0.
  3. El nombre del terminal del cliente y su velocidad, seguido de un \0.
    • El servidor responde:
      • OK (byte con valor 0) si la autenticación es exitosa.
      • Un mensaje de error (si la autenticación falla o algo no es válido).
Después de esto:
  • El servidor envía todo lo que aparezca en su salida estándar (stdout) al cliente.
  • El cliente envía los datos que se escriben en el teclado al servidor.
Servidor responde:
  • En el caso de éxito, responde con un byte 0.

A continuación:

  1. Se pueden establecer datos adicionales relacionados con la parte de autenticación, como permisos.
  1. A partir de aquí:
  • El servidor envía al cliente su salida estándar (datos o mensajes).
  • El cliente envía comandos al servidor para interactuar.
  1. Los datos que intercambian el cliente y el servidor se agrupan en paquetes TCP.
  • Puede haber optimización en el envío de paquetes con acumulación de datos pequeños en el terminal.
Soporte adicional para señales (como interrupción de un proceso).
  1. Intercambio de datos:
  • Se pueden negociar características como el tamaño de la ventana TCP.

53MPKlYjvUwAAAABJRU5ErkJggg==

RLOGIN: Autenticación

El servidor primero intenta el método de .rhosts. Si no funciona, solicita la clave.

Método 1: Mediante fichero .rhosts:

      • No se intercambia ningún mensaje por la red.
      • El usuario debe tener un fichero de texto denominado $HOME/.rhosts, que contenga líneas en el formato:
        nombre_cliente login_cliente
        Método 2: Solicitando un "password":
      • El servidor envía un segmento con la cadena "Password".
      • El cliente la muestra al usuario y este ingresa su clave.
      • La clave se envía carácter a carácter desde el cliente al servidor.
      • El servidor valida la clave
      • Orden de intentos:

RLOGIN: Datos

      • Una vez establecida y autenticada la sesión:
        • Todo lo que el cliente escribe en su teclado se envía al servidor.
        • El servidor devuelve datos que salen por pantalla del terminal.
      • Excepciones:
        • Algunas secuencias especiales (como señales de interrupción) no siguen este flujo regular.

wewfmUdlgu+MwAAAABJRU5ErkJggg==

RLOGIN: Secuencias Especiales

      • Control de flujo RLOGIN:
        • Control-S (carácter ASCII STOP):
          • Detiene la escritura en el terminal del cliente.
          • Los datos que se envían al servidor se acumulan en el buffer de recepción.
        • Control-Q (carácter ASCII START):
          • Reanuda la salida en el terminal.
      • Uso por defecto:
        • Los caracteres Control-S y Control-Q no se envían al servidor directamente, sino que se usan para controlar el flujo de datos.
      • Otras características especiales:
        • EOF (fin de entrada):
          • Enviado por el cliente con un carácter ^D justo después de un retorno de carro ().
        • Suspensión de cliente (Control-Z):
          • El cliente detiene temporalmente la entrada.
      • Interrupción (Control-C):
        • No es un carácter especial:
          • Se envía al servidor y se interpreta como una señal para interrumpir el proceso en ejecución.

RLOGIN: Comandos

      • Comandos de servidor a cliente:
        • Usan un solo byte en hexadecimal:
          • 0x02: "Flush output" (limpiar salida).
            • Solicita al cliente detener el envío de datos pendientes de escritura.
          • 0x10: "Suspend input" (suspender entrada).
            • Solicita que el cliente active o desactive el control de flujo (Control-S / Control-Q).
          • 0x80: "Change window size" (cambiar tamaño de ventana).
            • El cliente informa sobre el cambio de tamaño de su terminal.
      • Diferenciación de datos normales:
        • Los comandos se indican usando datos urgentes de TCP.
        • El byte urgente en el encabezado TCP señala el comando al cliente.
      • Comandos de cliente a servidor:
        • Sólo existe un comando: información de tamaño de ventana.
      • Características:
        • Forma de envío:
          • Se envía como datos normales de TCP (no como datos urgentes).
        • Contenido del flujo de datos:
          • Dos bytes 0xFF:
            • Sirven para distinguir este comando de otros datos.
          • Dos bytes que representan el carácter "s" en ASCII:
            • Indica el comienzo del comando de tamaño de ventana.
          • 16 bits con el número de filas:
            • Por ejemplo, 25 filas.
          • 16 bits con el número de caracteres por fila:
            • Por ejemplo, 80 caracteres.
          • 16 bits con el número de píxeles en X:
            • Normalmente se deja en 0.
          • 16 bits con el número de píxeles en Y:
            • Normalmente se deja en 0.
      • Propósito:
        • Este comando permite que el servidor ajuste la interfaz de terminal remoto para adaptarse al tamaño de ventana definido por el cliente (filas y columnas).

TELNET

      • Descripción:
        • Protocolo de nivel de aplicación diseñado para servicios de terminal remoto.
        • Definido en RFC 854 - Telnet Protocol Specification (1983).
        • Permite establecer una conexión TCP con el puerto 23 del servidor.
        • Su propósito es facilitar la interacción entre un cliente y un servidor de forma remota.
      • Características principales:
        • Proporciona un terminal remoto donde cada carácter escrito en el cliente se transmite al servidor y viceversa.
        • Utiliza el concepto de "Network Virtual Terminal" (NVT) para estandarizar el intercambio de datos:
          • Traduce caracteres desde la máquina cliente a un formato común (NVT) y viceversa.
          • Permite que máquinas con diferentes sistemas operativos interactúen.

TELNET: Datos

      • Intercambio de datos:
        • Utiliza un juego de caracteres ASCII según el modelo NVT.
        • Codificación de caracteres:
          • Cada carácter se codifica como 1 byte.
          • Primer byte (0-7):
            • Reservado para caracteres de control.
            • Algunos ejemplos: NUL (0), BEL (7, campana), BS (retroceso), CR (retorno de carro).
          • Resto de bytes (8-127):
            • Corresponden a caracteres imprimibles.
            • Incluyen letras, números y símbolos estándar ASCII.
          • Bytes con valor mayor a 127:
            • Reservados para extensiones futuras.
      • Diferenciación de datos:
        • Telnet separa los datos en:
          • "Data Characters" (caracteres de datos): Información normal intercambiada entre cliente y servidor.
          • "Control Characters" (caracteres de control): Usados para comandos especiales entre cliente y servidor.
  1. Señalización en banda
  • "Señalización en banda" significa que los comandos TELNET se envían mezclados con los datos, es decir, se transmiten dentro del mismo flujo de datos.
  • No se utiliza un canal aparte para los comandos (a diferencia de RLOGIN, que sí puede enviar datos urgentes de TCP).
  1. Formato de los comandos:
  • Los comandos TELNET constan de dos o más bytes:
    • Primer byte:
      • Siempre es el byte IAC (Interpret As Command), cuyo valor en hexadecimal es 0xFF (decimal 255).
      • IAC indica al receptor que los siguientes bytes son comandos, no datos.
      • Esto se conoce como una señal de escape.
    • Siguiente byte:
      • Este byte indica cuál es el comando que se va a ejecutar.
      • Por ejemplo:
        • 240 → NOP (No Operation).
        • 244 → Interrupt Process.
  • Bytes adicionales:
    • Dependiendo del comando, pueden necesitarse bytes adicionales.
    • Estos bytes tienen valores menores a 128 (

WrR0HG3+aNHScf4PS+jpFnvnlYMAAAAASUVORK5CYII=

  1. Intercambio de comandos simétrico:
  • Los comandos pueden enviarse tanto de cliente a servidor como de servidor a cliente.
  1. Comandos relacionados con el control del terminal:
  • Interrupción:
    • Cuando el usuario pulsa en el cliente Control-C, el cliente envía un comando Interrupt Process (IAC IP).
    • Esto detiene el proceso que se está ejecutando en el servidor.
  • Borrar línea:
    • Borra la última línea de entrada en el terminal, enviando el comando Erase Line (IAC EL).
  • Borrar carácter:
    • Borra el último carácter de entrada en el terminal, enviando el comando Erase Character (IAC EC).
Negociación adicional:
Se envían comandos adicionales para:
  • Negociar funcionalidades adicionales del terminal (por ejemplo, negociación de opciones).
  • Negociación del modo de operación más detallada.

Negociación de Opciones

  1. RFC 855 - Especificación de Opciones TELNET:
  • El cliente y el servidor inician con el modo básico NVT (Network Virtual Terminal).
Formato de negociación:
  • 3 bytes:
    • Byte 1: IAC (Interpret As Command, valor 0xFF).
    • Byte 2: Comando (WILL, DO, WONT o DONT).
    • Byte 3: Código de la opción que se negocia.
Comandos posibles:
  • WILL:
    • El emisor indica que quiere habilitar una opción.
  • DO:
    • El emisor solicita que el receptor habilite la opción.
  • WONT:
    • El emisor indica que no habilitará una opción.
  • DONT:
    • El emisor indica que no quiere que se habilite una opción.

Negociación de Modo de Operación

      • En TELNET se denomina modo de operación a cómo envía el cliente al servidor los caracteres que teclea el usuario.
        • En RLOGIN sólo hay una forma posible: carácter a carácter.
      • En TELNET hay tres modos posibles:

Modo Carácter a Carácter

Si el servidor no solicita DO LINEMODE, este modo se usa por defecto.

Características:

      • SUPPRESS GO AHEAD está habilitado.
      • Si echo servidor: modo caracter
      • SI EL ECHO LO HACE EL CLIENTE MODO LIENAS CHAPUCERO si falla ultimo echo

Modo Línea (Line Mode)

Se activa si el servidor envía DO LINEMODE y el cliente responde con WILL LINEMODE.

Modo Semidúplex

      • Si está deshabilitado  SUPPRESS GO AHEAD, el protocolo se comporta en semidúplex.
      • TODO NO
      • Go Ahead
  1. Semidúplex (modo por defecto):
  • Funcionamiento: El cliente hace eco local (escribe por pantalla los caracteres que teclea el usuario) y los almacena en un buffer. Sólo envía los caracteres al servidor cuando se le solicita explícitamente enviándole un comando IAC GA (go ahead).
Carácter a carácter:
  • Funcionamiento como en RLOGIN: cada carácter se envía por separado, el servidor hace eco y el cliente cuando recibe el eco lo escribe por pantalla.
Una línea cada vez, o modo líneas:
  • Funcionamiento: el cliente hace eco local y almacena los caracteres en un buffer, sólo los envía al servidor cuando el cliente pulsa fin de línea (CR LF).
  • Eco local versus remoto:
      • Para pasar a modo carácter a carácter (RFC 885):
        • Cliente (o servidor) envía comando IAC DO (WILL) SUPPRESS GO AHEAD y el otro extremo confirma con IAC WILL (DO) SUPPRESS GO AHEAD.
        • Y cliente (o servidor) envía comando IAC DO (WILL) ECHO y confirmado con IAC WILL (DO) ECHO.
      • Para pasar a modo líneas, dos posibilidades:
        • RFC 1184: cliente (o servidor) envía IAC WILL (DO) LINEMODE y confirmando el otro extremo con IAC DO (WILL) LINEMODE.
        • Modo líneas “chapucero” (“kludge line mode”): Cuando la primera negociación del paso a modo carácter a carácter falla y se sugiere:
          • En caso de no estar contemplada en la RFC 885 ya implementadas en la interpretación modo líneas.
      • El modo de operación puede cambiar varias veces a lo largo de una sesión TELNET.

Otras Negociaciones de Opciones

      • Otras opciones que se puede negociar
        • Tipo de terminal y velocidad (RFC 1091 y 1079):
          • Se entra en la negociación con:
            • IAC WILL/DO TERMINAL TYPE.
            • IAC WILL/DO TERMINAL SPEED.
          • Si el otro acepta, se entra en negociación de subopciones (la inicia el que hizo el WILL).
        • Tamaño de ventana (RFC 1073):
          • Se entra en la negociación cuando cliente (o servidor) envía IAC WILL (DO) NAWS.
          • Si el otro acepta, el cliente manda el tamaño de ventana mediante una subopción.
        • Control de flujo (RFC 1372):
          • Funciona como en RLOGIN (S y Q). Por defecto no está habilitado.
          • Se negocia con IAC WILL/DO TOGGLE-FLOW-CONTROL.
          • Si el otro acepta, el que mandó el WILL entra en negociación de subopciones para habilitar/deshabilitar.
        • Variables de entorno (RFC 1408):
          • Se negocia con IAC WILL/DO ENVIRON.
          • Si el otro extremo acepta, el que hizo WILL pasa variables de entorno como subopción.
        • Estado (RFC 859):
          • Se negocia con IAC WILL/DO STATUS.
          • Sirve para que un extremo le pida al otro su percepción del estado actual de las opciones.
        • Hay muchas más.

Negociación de Subopciones

      • La negociación de algunas opciones necesita intercambio adicional de datos.
        • Por ejemplo, en la de tipo de terminal decir el tipo de terminal.
      • Se hace con los comandos SB (suboption begin) y SE (suboption end).
      • Ejemplo:
        • La negociación de tipo de terminal viene definida en la RFC1700. Se hace del siguiente modo:
          • > 255 (IAC), 251 (WILL), 24 (TERMINAL TYPE)
          • > 255 (IAC), 253 (DO), 24 (TERMINAL TYPE)
          • > 255 (IAC), 250 (SB), 24 (TERMINAL TYPE), 1, 255 (IAC), 240 (SE)
            • Byte 1 = 1 = pide el tipo de terminal.
          • > 255 (IAC), 250 (SB), 24 (TERMINAL TYPE), 0, ‘I’, ‘B’, ‘M’, ‘P’, ‘C’, 255 (IAC), 240 (SE)
            • Byte 0 = envía tipo de terminal.
            • Los tipos de terminal posibles están definidos en la RFC.
      • En las RFC donde se define cada opción, se define cómo se realiza la negociación de subopciones. No las vamos a estudiar en detalle.

TELNET y RLOGIN: Seguridad

      • TELNET y RLOGIN no se recomiendan en sistemas modernos desde el punto de vista de seguridad:
        • Por defecto, no cifran los datos.
        • Carecen de un esquema de autenticación que permita asegurar que la comunicación no sea interceptada.
      • En TELNET se han definido nuevas opciones para autenticar/cifrar:
        • RFC 2941, Telnet Authentication Option
        • RFC 2942, Telnet Authentication: Kerberos Version 5
        • RFC 2943, Telnet Authentication Using DSA
        • RFC 2944, Telnet Authentication: SRP
        • RFC 2946, Telnet Data Encryption Option
      • También hay un draft que define uso de telnet con TLS (puerto 992 o STARTTLS).
        • Poco implementadas.
      • Por estas razones están cayendo en desuso frente a SSH, introducido en 1995.

Secure Shell (SSH)

      • SSH v2 definida en la RFC 4250 - 4254 y 4344.
        • Incompatible con SSH v1, actualmente obsoleta.
      • TCP puerto 22.
      • SSH proporciona:
        • Privacidad (confidencialidad del mensaje enviado)
        • Integridad (se garantiza que el mensaje no ha sido alterado por un intruso, usa algoritmos de hash)
        • Autenticación (cliente y servidor pueden estar seguros de que el otro extremo es quien dice ser).
        • Compresión (mejora eficiencia y hace más difícil ataques).
      • SSH se compone de tres protocolos:
        • SSH Transport Layer Protocol (RFC 4253).
        • SSH User Authentication Protocol (RFC 4252).
        • SSH Connection Protocol (RFC 4254).

wHoxRq2T7SPGQAAAABJRU5ErkJggg==

Protocolos de Transferencia de Ficheros

ÍNDICE

1. Introducción.

2. Protocolo FTP.

3. Protocolo TFTP.

      • Copiar ficheros entre máquinas:
        – distinto que los sistemas de ficheros en red, como NFS.
      • Dos protocolos de nivel de aplicación:
        FTP
        - File Transfer Protocol.
        - RFC 959 (año 1985).
        - Extensiones: seguridad (RFC 2228, 2577, 2773), internacionalización (2640), otros (3659, 5797, 7151).
        - Objetivo: copia fiable de ficheros entre máquinas heterogéneas.
        - diferentes sistemas operativos, sistemas de ficheros, juegos de caracteres, etc.
        - Sobre TCP.
        TFTP
        - Trivial File Transfer Protocol.
        - RFC 1350 (año 1992).
        - Extensiones: nuevas opciones (RFC 2347-2349, 7440).
        - Objetivo: arranque de máquinas sin disco en red local (junto con BOOTP/DHCP).
        - Requisitos: sencillo y pequeño, para que quepa en una PROM.
        - Sobre UDP.

FTP es un protocolo de nivel de aplicación que permite copiar ficheros entre máquinas a través de Internet.

      • Muchos S.O. traen integrado un cliente de FTP por línea de comando (ver ejemplo de ejecución a la derecha).

PPPgCQguAVEYIVgW5HnCU1A8OBCODTBtoJwaIJtBeHQBNsKwqEJthWEQxNsKwiHJthWEA5NsK0gHJpgW0E4NMG2gnBogm0F4dAE2wrCoQm2FYRDE2wrCIcm2FYQDk2wrSAcmmBbQTg0wbaCcGiCbQXh0ATbCsKhCbYVhEMTbCv+f2LM119QQ6VvAAAAAElFTkSuQmCC

FTP: Dos Conexiones TCP

      • El protocolo FTP usa dos tipos de conexiones TCP:
        – Transparente al usuario.
      • Una conexión de control:
        – Con el puerto 21 del servidor.
        – Se envían comandos, se reciben respuestas.
        – Dura mientras dura la conexión FTP entre cliente y servidor.
      • 0, 1 o más conexiones de datos:
        – Normalmente puerto 20 en el servidor FTP:
        • Suele ir en sentido inverso al de la control.
        – Se crea y se destruye cada vez que se transmite un fichero:
        • Cuando se hace un “dir”, se transmite un listado.
        • Dura sólo mientras dura esa transferencia.

FTP: Comandos (I)

      • De cliente a servidor.
      • Se envían a través de la conexión de control:
        – No confundir con los que intercambia el usuario con su interfaz de cliente FTP de línea de comando.
        • NO son get, put, mget, dir, bye...
        • Puede no haber una correspondencia uno a uno.
      • Por compatibilidad, se admiten dos comandos telnet:
        – Se pueden usar para abortar una transferencia de fichero en curso:
        • IAC, IP (interrupt process), IAC, DM (sync).
        – A los de negociación de opciones se responde con DONT o WONT.
      • Resto de comandos FTP son cadenas de caracteres en NVT ASCII:
        – 3 o 4 caracteres ASCII, seguidos opcionalmente de argumentos y terminados por .

FTP: Comandos Principales (I)

      • Hay más de 30, los principales son los siguientes:
      • Relacionados con el control de acceso:
        USER : identificación del usuario en el servidor.
        PASS : clave de usuario en el servidor.
        – ACCT : información adicional.
        – QUIT: desconectar (finaliza la sesión FTP).
      • Relacionados con información del servidor:
        – SYST: pregunta el tipo de sistema operativo del servidor.
        – STAT: pide al servidor información sobre la sesión.
      • Relacionados con navegación por el sistema de ficheros del servidor:
        CWD : cambiar directorio de trabajo en el servidor.
        – CDUP: cambiar al directorio padre (“cd ..”).
        PWD: mostrar el directorio de trabajo.
        – MKD : crear directorio en el servidor.
        – RMD : borrar directorio en el servidor.
        – RNFR: Renombrar desde.
        – RNTO: Renombrar hacia.
      • Relacionados con la transferencia de ficheros:
        RETR : copiar fichero del servidor al cliente.
        STOR : copiar fichero de cliente a servidor.
        LIST []: lista el directorio de trabajo en el servidor, o el directorio indicado.
        – ABOR: interrumpir la transferencia de fichero en curso.
      • Relacionados con parámetros de transferencia de ficheros:
        PORT h1,h2,h3,h4,p1,p2: dirección IP (h1,h2,h3,h4) y puerto (p1*256+p2) de la conexión de datos en el cliente.
        PASV: solicita al servidor que entre en modo pasivo para la conexión de datos.
        – TYPE A / E / I / L : tipo de representación.
        – STRU F / R / C: estructura de fichero.
        – MODE S / B / C: modo de transferencia.
      • Otros:
        – NOOP: para mantener la conexión abierta cuando no hay nada que transmitir.

FTP: Respuestas (I)

      • De servidor a cliente.
      • A través de la conexión de control.
      • También son cadenas de caracteres en NVT ASCII.
      • 3 dígitos + carácter blanco + texto opcional + .
        – Todo en NVT ASCII.
        – El cliente FTP sólo mira el código de 3 dígitos.
        – El texto opcional es para los humanos:

1yz Respuesta preliminar positiva

• La respuesta es preliminar:

– Necesita una respuesta adicional para enviar nuevo comando

2yz Respuesta completa positiva

• La acción solicitada ha sido completada

3yz Respuesta intermedia positiva

• La acción solicitada necesita más info u otro comando

4yz Respuesta negativa temporal

• El comando no se ha ejecutado correctamente, pero la causa de error

es temporal y puede reintentarse

5yz Respuesta negativa permanente

• El comando no ha sido aceptado y no debería reintentarse

6yz Respuesta protegida

• Respuestas a comandos seguros, codificados en base64

      • Respuestas (continuación)

x0z Sobre errores de sintaxis

x1z De información

x2z Relacionada con el estado de las conexiones

x3z Relacionada con login

x4z Sin especificar

x5z Sobre estado del sistema de ficheros

      • Ejemplos de respuestas:
        125 Data connection already open; transfer starting
        200 Command OK
        331 Username OK, password required
        421 Can’t open data connection
        452 Error writing file
        500 Syntax error (unrecognized command)
        501 Syntax error in parameters or arguments
        502 Command not implemented
        503 Bad sequence of commands
        530 Not logged in
        532 Need account for storing files
        550 Requested action not taken. File unavailable
        631 Confidentiality and integrity protected reply.
        632 Confidentiality protected reply.
      • Normalmente ocupan una sola línea:
        – Ejemplo: 221 Goodbye
      • Si ocupa más:
        – Primera línea, código de 3 dígitos seguido de un guión
        – Última línea, el mismo código seguido de blanco
        – Ejemplo de respuesta al comando HELP:

FTP: Conexión de Datos

      • La conexión de datos se puede usar para tres cosas:
        – Para transmitir ficheros de cliente a servidor.
        – Para transmitir ficheros de servidor a cliente.
        – Para transmitir listados de ficheros (LIST) de servidor a cliente.
      • La conexión de datos se abre y se cierra cada vez que se tiene que usar.
      • ¿En qué puerto TCP?:
        – La iniciativa de abrir una conexión de datos la tiene siempre el cliente
        (get, put, dir).
      • El comportamiento por defecto (FTP activo):
  1. El cliente abre un puerto local libre y queda a la escucha (espera)
  2. El cliente envía al servidor el número de su puerto local en el comando
    PORT con su IP asociada.
    Ejemplo: PORT 193,145,123,10,12,156
  3. A continuación manda la conexión de control el comando
    correspondiente (RETR, STOR, LIST).
  4. El servidor abre una conexión TCP de datos desde su puerto 20 del
    servidor al indicado en el comando PORT del cliente.

Secuencia típica de comandos / respuestas (I)

      • El cliente (C) establece una conexión TCP de control con el puerto 21 del servidor (S).
      • Identificación:
        • El servidor envía un mensaje de bienvenida:
          S: 220 server ready
        • El cliente envía su nombre de usuario y su clave:
          C: USER nombre_usuario
          S: 331 Password required
          C: PASS clave
          S: 230 Login successful
        • El cliente pregunta al servidor qué tipo de sistema es:
          C: SYST
          S: 215 UNIX Type: L8
      • Cambio de directorio de trabajo:
        C: CWD /user/ro
        S: 200 directory changed
      • Listado de directorio en el servidor:
        – El cliente elige un puerto local libre y p = p1*256+p2 y queda a la escucha en este puerto.
        – El cliente envía por la conexión de control su IP y puerto al servidor:
        C: PORT 193,137,139,10,12,155
        S: 200 Port command successful.
        – El cliente envía el comando de control para el listado de directorio:
        C: LIST
        – El servidor manda una respuesta preliminar positiva por la conexión de control:
        S: 150 Opening ASCII mode data connection.
        – El servidor abre una conexión TCP de datos desde su puerto 20 al puerto
        indicado del cliente.
        – El servidor envía el listado de directorio.
        – El servidor cierra la conexión de datos y envía una respuesta completa
        por la conexión de control:
        S: 226 Transfer complete.

z3OMsX4A8CbJHv+01rZtW1cAeJN8jwEAPQaAPD0GgDw9BoA8PQaAPD0GgDw9BoA8PQaAPD0GgDw9BoA8PQaAPD0GgDw9BoA8PQaAPD0GgDw9BoA8PQaAPD0GgLzPnHPdblZKua6rlLIecKfjOGqtrbX1AHiAL0IrQQQAFQgzAAAAAElFTkSuQmCC

FTP

Secuencia típica de comandos / respuestas (III)

      • Transferencia de fichero:
        – El cliente elige un puerto local libre p = p1*256+p2 y queda a la escucha en este puerto.
        – El cliente envía por la conexión de control su IP y puerto al servidor:
        • C: PORT 193,137,139,10,12,183
        • S: 200 PORT command successful.
          – El cliente envía comandos para indicar el formato en que se va a hacer la transmisión de los datos:
        • C: RETR fichero_o STOR fichero
          – El servidor manda una respuesta preliminar positiva por la conexión de control:
        • S: 150 Opening data connection
          – El servidor abre una conexión TCP de datos desde su puerto 20 al puerto p1*256+p2 del cliente.
          – El servidor (RETR) o el cliente (STOR) manda por la conexión de datos el contenido del fichero en el formato acordado en el paso 3.
          – Al finalizar, el servidor cierra la conexión de datos.
          – El servidor envía, por la conexión de control, una respuesta completa positiva por la conexión de control:
        • S: 226 Transfer complete.
      • Despedida y cierre:
        – El cliente manda un comando de petición de desconexión.
        • C: QUIT
        • S: 221 Goodbye.
          – Se cierra la conexión TCP de control.

FTP: Formato de transmisión

      • Cliente y servidor pueden usar S.O. distintos:
        – Posiblemente distintos formatos de fichero en origen y destino.
      • Deben acordar el formato y el modo en que se va a transmitir.
      • Lo hacen a través de una compleja negociación con comandos TYPE, STRU, MODE.
      • En la práctica sólo vemos los dos más usados:
        Imagen (o binario): comando TYPE I OCUPA -
        • El fichero se transmite sin transformaciones, como un flujo de bytes.
          ASCII: comando TYPE A OCUPA + 1 B + POR LINEA
        • El fichero se convierte del formato de texto que use el transmisor a formato ASCII antes de transmitirse.
          • Por ejemplo, en UNIX, los fines de línea (lf) se sustituyen por (lín).
        • El receptor lo convierte del formato texto ASCII a su formato local.

FTP: Omisión del comando PORT

      • El comando PORT puede omitirse antes de abrir una conexión de datos.
      • Si no se manda comando PORT, el servidor supone que el puerto donde escucha el cliente para la conexión de datos es el mismo que el que obtiene de la conexión de control.
        – El cliente tiene que abrir en modo pasivo con la opción C: PASV o S: RQ, SO_READADDR.
      • Si hay que abrir una segunda conexión de datos, tiene que esperar 2MSL.
      • Por esta razón, la RFC 1123 (Host Requirements) aconseja que los clientes FTP siempre elijan un puerto y usen el comando PORT previamente a hacer el STOR, RETR o LIST.

HbAAAAAACEgNj0WXPw2wAAAAAAhAAs7wYAAAAAIQUxBQAAAABCCmIKAAAAAIQUzPQBAAAAgJCCdVMAAAAAIKT+D3vEoScyumjtAAAAAElFTkSuQmCC

FTP: FTP Pasivo

      • En el modo habitual (FTP activo) el servidor establece la conexión de datos con el puerto indicado por el cliente.
      • Problema: no funciona si el cliente está tras un firewall que no permite establecimiento de conexiones TCP desde el exterior.
      • Con comando PASV el cliente puede indicar al servidor que la conexión de datos la va a iniciar el cliente:

ftp> passive 
Passive mode on. 
ftp> ls 
----> PASV 
227 Entering Passive Mode (192,168,150,90,195,149). 
----> LIST 
150 Opening ASCII mode data connection for file list 
drwx------ 3 stacker users 1024 Jul 27 01:45 public_html 
226 Transfer Complete. 

      • Por sencillez los navegadores web suelen usar FTP pasivo con URLs ftp://... (no tienen que abrir un socket pasivo).

4PwhKggJJBvjkAAAAASUVORK5CYII=

FTP: PORT y PASV con IPv6

      • Los comandos EPRT y EPSV (RFC 2428) permiten gestionar direcciones IPv6.
      • Formato general:
        • EPRT
        • EPSV
          • Respuesta:
          • es el carácter |
            • 1: IPv4 (notación decimal).
            • 2: IPv6 (notación hexadecimal).
      • Ejemplos:
        • EPRT |1|132.235.1.2|6275|
        • EPRT |2|1008::8:800:200C:417A|5282|
        • EPSV
          • 229 Entering Extended Passive Mode (|||34347|)

FTP: Seguridad

      • Conocido como FTPS. Dos métodos:
        • Implícito:
          • Puertos TCP 990 y 989 para control y datos en lugar de 21 y 20.
          • Se espera un Client-Hello de TLS inmediatamente después de establecer la conexión, y se cierra en caso contrario.
        • Explícito:
          • RFCs 2228 y 4217.
          • La sesión de control FTP se inicia en el puerto habitual (21).
          • Cliente pide TLS con comando AUTH.
          • El servidor y la comunicación en texto plano (por ejemplo usuario y contraseña) se cambia con CCC.
          • Indica si se quiere encriptar solo datos seguros con comandos PBSZ y PROT.
            • PBSZ: (Protection Buffer Size). Se suele usar PBSZ 0 cuando se usa TLS.
            • PROT: Indica si las conexiones de datos son en claro (PROT C) o cifradas con TLS (PROT P).

FTP: FTP anónimo

      • Muchos servidores FTP soportan lo que se conoce como anonymous FTP.
        • Permiten a cualquiera conectarse para descargar ficheros.
        • A veces también copiar ficheros a un cierto directorio.
        • Login: anonymous.
        • Para llevar un registro de los accesos que se hacen, es habitual que se exija que:
          • El password sea nuestra dirección de correo (se comprueba que al menos tiene aspecto de dirección de correo).
          • Se pueda hacer resolución inversa de DNS de la IP del cliente (consulta PTR) para obtener nuestro dominio.

TFTP

      • Otro protocolo de nivel de aplicación para copiar ficheros entre máquinas a través de Internet.
      • Pensado para arranque de máquinas sin disco.
        • Usado con frecuencia junto a DHCP.
      • RFC 1350 (año 1992).
        • Extensiones: nuevas opciones (RFC 2347-2349, 7440).
      • Sobre UDP (puerto 69).

Funcionamiento:

      • El cliente manda al servidor un mensaje de petición de lectura o escritura de fichero.

Cabecera UDP

Opcode (2 bytes)

Nombre fichero

0

Modo

0

  1. Tipo de operación (dos bytes):
  • 1 para lectura
  • 2 para escritura
Nombre del fichero que se quiere leer o escribir, terminado por un byte a 0 Modo, terminado por un byte a 0. Es una de las cadenas ASCII siguientes (mayúsculas o minúsculas):
  • netascii: NVT ASCII, con CR LF.
  • octet: bloques de 8 bytes sin interpretar.
  • Si pedía lectura:

01MCAdEBpqQAAAABJRU5ErkJggg==

      • Cuando el cliente recibe un bloque
      • Si hay cualquier error (no existe fichero en el servidor, mal número de secuencia recibido en cliente, etc.) se envía un mensaje de error.

XmehypKc9l0AAAAASUVORK5CYII=

      • Si pedía escritura:
        • El servidor responde con ACK del bloque 0.
        • A continuación el cliente envía los primeros 512 bytes como bloque 1.
        • El servidor responde con ACK del bloque 1.
      • Es una transmisión de datos del tipo de parada y espera.
      • Como va sobre UDP, debe ser el propio TFTP el que maneje la pérdida y duplicado de paquetes.
        • Necesario temporizadores en ambos extremos.

B5bmYd0W3t4FAAAAAElFTkSuQmCC

TFTP: Seguridad y extensiones

    • Consideraciones de seguridad:
      • No hay usuario ni password.
      • Normalmente sólo se permite acceso al directorio /tftproot
        • para evitar que cracker lea el /etc/passwd.
    • Extensiones:
      • Parada y espera, pobres prestaciones:
        • RFC 7440 (2015) define mecanismo de ventana para mejorar prestaciones. Usado por Microsoft.
      • Nuevas opciones:
        • Se negocia (RFC 2347):
          | opc | filename | 0 | mode | 0 | opt1 | 0 | value1 | 0 | opt2 | 0 | value2 | 0 |
        • Opciones:
          • blksize (RFC 2348): tamaño de bloque distinto de 512 bytes.
          • timeout (RFC 2349): tiempo en segundos antes de retransmitir.
          • tsize (RFC 2349): tamaño de fichero.


Servicio de nombres DNS

Índice

      • Introducción.
      • El espacio de nombres DNS.
      • Sintaxis de nombres DNS.
      • Servidores de nombres y zonas.
      • Almacenamiento en caché.
      • El protocolo DNS:
        • Tipos de registros de recursos.
        • Formato de mensaje DNS.
        • Envío TCP o UDP.
      • Evolución:
        • DNSSEC, DDNS, EDNS0, DoT y DoH.
      • DNS es una base de datos distribuida en red que se utiliza con un protocolo cliente/servidor para:
        • Mapear nombres a direcciones IP (y viceversa).
        • Obtener información de correo electrónico.
        • Obtener información sobre servicios.
        • ...y otras muchas cosas.
      • Un sistema de Internet distribuido porque ningún servidor en Internet conoce toda la información:
        • Cada sitio (universidad, empresa o departamento dentro de una empresa, por ejemplo):
          • Mantiene su propia base de datos de información.
          • Y mantiene uno (o varios) servidores que otros sistemas de Internet (clientes) pueden consultar.
      • DNS proporciona el protocolo que permite a los clientes hacer consultas a los servidores y obtener respuestas:
        • El protocolo DNS también permite que los servidores intercambien información.
      • Desde el punto de vista de una aplicación, el acceso al DNS se realiza a través de una librería llamada resolver.
        • En general, una aplicación debe convertir un nombre de host a una dirección IPv4 o IPv6 antes de que pueda pedirle a TCP que abra una conexión o envíe un datagrama usando UDP.
      • Es el software para la implementación de DNS en la mayor parte de los sistemas:
        • Contiene un servidor multipropósito llamado named y una librería de cliente llamada resolver.
        • resolver incluye un API de consulta de las aplicaciones a los servidores de DNS.
        • named implementa las funcionalidades de resolución.
        • Una implementación muy usada de DNS (cliente y servidor) es BIND:BIND incluye una herramienta para hacer consultas llamada dig (domain information groper).

El espacio de nombres DNS

      • El conjunto de todos los nombres utilizados con DNS constituye el espacio de nombres DNS.
        • No distingue entre mayúsculas y minúsculas.
      • Es un árbol de dominios con:
        • Una raíz sin nombre (.) en la parte superior.
        • En el nivel superior del árbol son los llamados dominios de nivel superior (TLDs, por sus siglas en inglés):
          • Todo código de país es un (ccTLD), usado y reservado para un país.
            • Por ejemplo: es (España), uk (Reino Unido).
            • Cada país puede usar su ccTLD según lo establece la norma ISO 3166-1.
          • TLDs genéricos (gTLDs):
            • Editan formatos por un mínimo de 3 letras, para diferenciarlos de los ccTLDs de 2 letras.
            • Ejemplo: .com, .org, .edu.
            • Se asignan de acuerdo al destino o propósito, no pertenecen a ningún país.

Sintaxis de nombres DNS

      • Cada TLD se divide en subdominios, y estos se pueden dividir en más subdominios y así sucesivamente.
      • Está división se hace de forma independiente en cada dominio/subdominio.
        • En algunos casos, los sitios educativos están en el subdominio .edu.es.
      • Un nombre de dominio completo, como www.uc3m.es, se denomina FQDN (Fully Qualified Domain Name):
        • Un nombre de dominio siempre se forma con un punto: www.uc3m.es..
      • Los nombres DNS están formados por etiquetas:
        • Cada etiqueta está formada por 1-63 caracteres.
        • Registros de zonas no pueden superar 255 caracteres para los nombres, donde no se incluyen los puntos (.).
      • En algunos casos, como en nombres internacionales, un FQDN completo está limitado a la internacionalización de caracteres a partir de 2010 (RFC 5890):
        • españa.com → xn--espa-a-rae.com.
      • La estructura jerárquica del espacio de nombres DNS permite que diferentes autoridades administrativas gestionen diferentes partes del espacio de nombres:
        • Por ejemplo, crear un nuevo subdominio it.uc3m.es. Requiere únicamente tratar con el propietario del subdominio uc3m.es.
          • No necesitamos molestar a los propietarios del dominio en la raíz (.).
          • Igualmente, para crear lab.it.uc3m.es solo tenemos que tratar con el propietario de it.uc3m.es.
      • Este es un aspecto clave de la escalabilidad del DNS:
        • Proporciona una sola entidad para administrar todos los cambios para todo el espacio de nombres DNS.
      • Este enfoque descentralizado fue diseñado para permitir una distribución eficiente del trabajo administrativo:
        • En un principio, una sola entidad era responsable de resolver jerárquicamente los nombres y distribuir la lista actualizada de nombres en toda la red: se llamaba servidor NIC (Network Information Center).
          • Este servidor mantenía una base de datos plana.
          • Pronto este enfoque se volvió inviable y se creó DNS (1987).

Servidores de nombres y zonas

      • Cuando se asigna la responsabilidad de administrar uno (o más) dominios a una organización, ésta debe mantener dos o más servidores de nombres (servidores DNS) que contengan información sobre ese espacio de nombres.
        • Los usuarios de Internet pueden realizar consultas sobre ese espacio de nombres a esos servidores.
      • La colección de todos los servidores de nombres forma el servicio DNS.
        • Es un sistema distribuido cuyo trabajo (original) es traducir de nombres de dominio a direcciones IP.
        • Sin embargo, también puede proporcionar una amplia gama de información adicional.
      • La unidad de delegación administrativa en DNS se llama zona.
        • Una zona es un subárbol del espacio de nombres DNS que se administra por separado de otras zonas.
        • Cada nombre de dominio existe dentro de una zona.
        • Los TLD pertenecen a la zona raíz..
      • Siempre que se agrega un nuevo registro a una zona, el administrador de DNS de la zona:
        • Asigna un nombre e información adicional (e.g., dirección IP) para la nueva entrada.
        • Introduce los datos en el servidor de nombres.
      • Un mismo servidor puede contener información de varias zonas.
      • Debe haber al menos dos servidores que contengan información sobre una zona:
        • Uno de los servidores contiene información básica de la zona.
        • Los otros servidores secundarios obtienen copias de la base de datos del servidor primario mediante un proceso llamado transferencia de zona.
          • La totalidad de la primera relación no requiere transferencias de zona, pero son posibles en casos específicos.
        • Cuando consultamos el servicio DNS, estos servidores secundarios se usan como servidores de respaldo, por ello también se les llama servidores de nombres autoritativos de la zona.
      • Servidores raíz:
        • Son los servidores autorizados (primario y secundarios) del nivel raíz.
        • Cada uno de los dominios de los TLD: almacenan los nombres y direcciones IP de los servidores primario y secundarios de todos los TLD.
      • En realidad, existen 13 nombres de la forma:
        • a.root-servers.net
        • m.root-servers.net
        • Letra de la a a la m como a root-servers.net.
      • En realidad, hay varios servidores físicos que responden con estos nombres mediante anycast:
        • Esto significa que el servidor responde más rápido es el más cercano según el usuario o servicio en cuestión.
      • En total hay 13 nombres de servidores raíz, más de 100 máquinas distribuidas en el mundo.
      • Servidores de nombres de los dominios de primer nivel (TLD):
        • Los dominios gTLD y ccTLD los administra la ICANN.
        • Determinan en qué autoridad delega cada dominio, y anotan en los servidores raíz los servidores autoritativos de cada TLD.
          • Ejemplo: .es es gestionado por RedIRIS, actualmente en la sede del Palacio, Empresarial Ireds ( https://www.dominios.es), dependiente de España.
        • Los servidores raíz almacenan en sus registros la IP de los servidores de nombres autoritativos para el dominio .es.
        • Los gTLDs de más tráfico, como COM y NET, usan los mismos servidores autoritativos, apuntados a gtd-servers.net, a m.gtd-servers.net.
          • Son administrados por Verisign.
      • Dominios de segundo nivel:
        • Son los subdominios de los dominios TLD (de primer nivel).
        • Para delegar un dominio de segundo nivel, el titular de un dominio superior debe añadir un registro de delegación en su zona.
          • Ejemplo: delegar en una empresa de .es la autoridad para uc3m.es.
        • Para cada dominio de segundo nivel el TLD anota las direcciones de los servidores que son responsables de la resolución de nombres DNS en el dominio.
        • Este proceso puede seguirse con dominios de tercer, cuarto, etc., nivel.
      • Delegación:
        • Cuando se delega un subdominio, no es obligatorio delegarlo en otra autoridad.
        • Cuando se delega en otra autoridad, tiene que mantener los servidores autoritativos de la zona. Para ello puede:
          • Mantenerlos a mano.
          • Subcontratarlos a un tercero. Esto se llama DNS gestionado:
            • Ejemplo: servicios de Amazon Web Services (AWS), Akamai, CloudFlare, etc.

Almacenamiento en caché

      • Los servidores de nombres pueden obtener la información que conocen (como asignación de nombre a dirección IP) de tres fuentes:
  1. Los administradores de la base de datos de la zona (los servidores primarios).
  2. Otro servidor autorizado.
  3. De una memoria local de resultados (almacenamiento en caché).
El primer y segundo caso se dice que el servidor contiene información autoritativa. En el tercer caso se dice que contiene información no autoritativa. La mayoría de los servidores de nombres permiten almacenamiento en caché:
  • Para evitar que las mismas consultas sean resueltas repetidamente por los servidores autoritativos.
  • Para reducir la carga de red y mejorar el rendimiento.
      • Al responder una consulta, un servidor indica si la información que está devolviendo se ha derivado de su caché o si es información obtenida directamente del servidor autoritativo.
        • Ejemplo: el servidor puede devolver un registro "A" para asociar el nombre a una dirección IP.
      • Tiempo de vida (TTL):
        • Cada registro de recursos tiene un valor llamado TTL que especifica cuánto tiempo pueden almacenarse en caché las respuestas.
        • Las entradas TTL pequeñas o registros que pueden cambiar dinámicamente deben ser consultados frecuentemente.
      • El almacenamiento en caché se aplica tanto para resoluciones exitosas como fallidas (denominado almacenamiento en caché negativo).
        • El almacenamiento en caché negativo es obligatorio (RFC2308).
      • En algunas redes, se instala un servidor de nombres cercano para caché.
        • En S.O. modernos (Windows) y derivados recientes de UNIX (por ejemplo, Linux):
          • El almacenamiento en caché está implementado a nivel del sistema operativo o puede ser activado en el sistema.
      • Servidor de nombres local:
        • Es el servidor de nombres que los clientes de una organización utilizarán para iniciar el proceso de resolución de nombres.
        • Un ISP, por ejemplo, pondrá a disposición un servidor de nombres DNS local para sus clientes.
          • Este servidor de nombres almacena en caché los resultados anteriores para obtener respuestas rápidas y reenvía las solicitudes a otros servidores.
        • Se configura manualmente o por DHCP (más habitual hoy en día).
        • El servidor de nombres local puede ser un servidor autorizado para algún dominio, o un servidor solo de caché.
      • Servidores DNS públicos:
        • En los últimos años han proliferado los servidores de nombres públicos (también denominados servidor público de resolución de DNS o DNS público recursivo).
        • Son servidores DNS gratuitos, no operados por nuestro proveedor de Internet.
        • Razones para usar estos servicios:
          • Velocidad, en comparación con el uso de servicios DNS provistos por el ISP.
          • Filtrado (seguridad, bloqueo de anuncios, bloqueo de pornografía, etc.).
          • Evitar la censura.
          • Redundancia.
          • Acceso a dominios de nivel superior alternativos no oficiales que no se encuentran en la zona raíz del DNS oficial.
        • Ejemplos:
          • Cloudflare (1.1.1.1), Google public DNS (8.8.8.8), OpenDNS.
        • Críticas:
          • Recopilación masiva de datos (nada es gratis).
          • Redirección poco eficiente en CDNs.
            • Extensión EDNS Client Subnet (ECS) → problemas de privacidad.

El protocolo DNS

      • El protocolo DNS consta de dos partes principales:
  1. Un protocolo de consulta/respuesta utilizado para realizar consultas contra el DNS.
  • Puede ser recursivo o iterativo.

Otro protocolo para que los servidores de nombres intercambien registros de bases de datos (transferencias de zona).

También tiene:

  • Una forma para notificar a los servidores secundarios que la base de datos de la zona ha cambiado y se necesita una transferencia de zona (notificación de DNS).
  • Una forma de actualizar dinámicamente una información en la zona (DNS Update).

El uso más típico es una simple consulta/respuesta para buscar la dirección IPv4/IPv6 que corresponde a un nombre de dominio.

      • Consulta/respuesta recursiva (se indica con un flag en la cabecera del mensaje):
        • El servidor, cuando carece de la información solicitada, consulta a otro servidor y retorna la respuesta.

(Ilustración de proceso recursivo con cliente, servidor local y servidores autoritativos).

Pv88zb7tg2XI0cwrEvDaevr49fXcSVlpDr8CIhg1bEkZKQ7fD8YJmJw2sIwTMzgIXkMw8QMTlsYhokZnLYwDBMzOG1hGCZmcNrCMEzM4LSFYZiYwWkLwzAx839zBqVR40LF3gAAAABJRU5ErkJggg==

      • Consulta/respuesta iterativa (no recursiva, se indica con un flag en la cabecera del mensaje):
        • El servidor, cuando carece de la información solicitada, indica a quién se le puede seguir preguntando.

(Ilustración de proceso iterativo con cliente, servidor local y múltiples servidores autoritativos).

O3kdRFKU8OK0cHNn7KIqilAenXUcX9j6KoijlwXHt3JW9j6IoSnlwunTvxd5HURSlPDg9+w5g76MoilIetNKCoijlRu+LURSl3DiEEPY+iqIo5UGvKCmKUm40i1EUpdxoFqMoSrn9Hz0z8S5o3L45AAAAAElFTkSuQmCC

      • Los clientes suelen solicitar recursividad en las consultas.
        • Es más sencillo para ellos.
      • Pero, aunque un cliente haga la consulta solicitando recursividad, el servidor de nombres, por razones de carga, puede responder de forma iterativa.
      • Por esta razón, en la práctica, las consultas son mixtas.
        • En la consulta, algunos servidores responden recursivamente y otros iterativamente.
      • En el siguiente ejemplo vemos una resolución completa típica en la que suponemos que no se puede beneficiar de entradas en caché preexistentes.
      • Un usuario de A-HOME desea conectarse al host EXAMPLE.COM (p. ej., un navegador web que acceda a la página http://EXAMPLE.COM).
        • Necesita la dirección IP de EXAMPLE.COM.

(Ilustración del proceso de resolución con cliente, servidor ISP y servidores autoritativos).

  1. El resolver de A-HOME envía una consulta DNS a su servidor de nombres local, GW-HOME, para convertir el nombre EXAMPLE.COM en una dirección IP (mensaje 1).
  2. Si GW-HOME no tiene la dirección de IP de EXAMPLE.COM en su caché, consulta a otro servidor DNS (recursividad) en el ISP.
  • El servidor de nombres del ISP no encuentra respuesta en su caché, pregunta a un servidor raíz (ROOT-SERVERS.NET, mensaje 3).

Los servidores raíz no almacenan información sobre nombres o direcciones, sino que devuelven una respuesta con el nombre y las direcciones de los servidores autorizados del dominio .COM (mensaje 4).

  1. El servidor de nombres del ISP manda la petición a un servidor de .COM, por ejemplo, a AGTLD-SERVERS (mensaje 5).
  2. Este servidor tampoco tiene la respuesta. Envía como respuesta el nombre y direcciones IP de los servidores de nombres del dominio EXAMPLE.COM (mensaje 6).
  3. El servidor de nombres del ISP envía la petición a uno de ellos, por ejemplo, ALANA-SERVERS.NET (mensaje 7).
  4. Dado que es un servidor autorizado para el dominio, responde al servidor de nombres del ISP con la dirección IP solicitada (mensaje 8).
  5. El servidor de nombres del ISP responde a GW-HOME con la dirección (mensaje 9).
  6. GW-HOME ahora puede responder la consulta inicial, dando al cliente las direcciones IPv4 o IPv6 deseadas (mensaje 10).
      • Desde la perspectiva de A-HOME, el servidor de nombres local pudo responder su solicitud.
      • Sin embargo, lo que realmente sucedió es una consulta recursiva, en la que se realizaron múltiples consultas entre servidores raíz y de TLD, así como servidores DNS adicionales para poder responder la solicitud.
      • Notas:
        • Las consultas a servidores raíz y otros servidores TLD no se realizan en cada momento, ya que las consultas (cuando es posible) se benefician del almacenamiento en caché.
        • En redes muy cargadas, soportar recursividad degradará su rendimiento.
      • Habitualmente, las empresas usan servidores DNS no recursivos o configurados para no reenviar consultas fuera de la red local.
        • En este caso, el servidor DNS del ISP solo da recursividad a clientes autorizados.
      • Cachés de respuestas:
        • Como hemos comentado, para reducir el tráfico, los servidores DNS intermedios hacen caché de las respuestas recibidas.
          • Evita solicitudes continuas a servidores remotos.
        • Un tiempo de vida (TTL) en cada respuesta indica cuánto tiempo se puede almacenar en caché la información (cuánto tarda en "caducar").
          • Pasado este tiempo, se borra de la caché.
        • Si un servidor no autorizado para el dominio que estamos consultando tiene la respuesta en caché (proveniente de una consulta anterior), responde con la información de su caché y marca esta respuesta como respuesta no autorizada con un flag en la cabecera del mensaje.
          • Indica que la información que devuelve es de "segunda mano", aunque normalmente es precisa.
        • En el ejemplo anterior, si otro cliente del mismo ISP vuelve a consultar la dirección IP de EXAMPLE.COM antes de que pase el TTL segundos, el servidor de nombres del ISP responderá al mensaje 2 con esa información.


Resumen de funcionamiento:

      • El resolver consulta a un servidor de nombres local.
      • ¿El dominio consultado cae bajo su jurisdicción (es un autorizado para ese dominio)?
        • : devuelve registros del recurso.
          • Respuesta autorizada.
        • No: ¿Lo tiene en la caché?
          • : devuelve registros del recurso.
            • Respuesta no autorizada.
          • No: dos posibilidades.
  1. Consulta recursiva (es lo habitual):
  • Envía mensaje de consulta a otro servidor (que puede a su vez preguntar a otro servidor, etc.).
  • Devuelve la respuesta obtenida.
  • Guarda copia en caché durante el "tiempo de vida" del registro.
Consulta iterativa:
  • Nos devuelve la dirección de los siguientes servidores a contactar.

fSrk9wWjNNTKq+n+7Mw8BAKRBmgVQSAQCAQCgQAAwP8B3zYmnKkzg1gAAAAASUVORK5CYII=

mKimt4nXJswAAAABJRU5ErkJggg==

j8QYgIAAAAAABmDEBMAAAAAAMgYhJgAAAAAAEDGIMQEAAAAAAAyBiEmAAAAAACQMQgxAQAAAACAjEGICQAAAAAAZAxCTAAAAAAAIGMQYgIAAAAAABn7P+uFout5MlHNAAAAAElFTkSuQmCC

8BOJ1PzcsLotwAAAAASUVORK5CYII=

Tipos de registros de recursos

      • Aunque el DNS se usa mayoritariamente para determinar la(s) dirección(es) IP que corresponden a un nombre de dominio, también se puede utilizar para otras cosas:
        • Propósito opuesto (nombre de dominio a IP).
        • Averiguar servidores de correo.
        • Saber si el remitente de un correo es alguien autorizado.
        • Gestión de alias (varios nombres para una máquina).
        • Distribución de carga (un nombre para varias máquinas).
        • Descubrimiento de servicios.
        • Etc.
      • En general, DNS proporciona una función de base de datos distribuida para almacenar información asociada a nombres de dominio.
        • Esta información que maneja DNS se llama registro de recursos (RR).
        • Un nombre de dominio (cada nodo del árbol jerárquico de DNS) puede tener 0, 1 o más RR del mismo o distintos tipos asociados.
      • Cuando el "resolver" consulta un nombre de dominio al DNS, recibe uno o más registros de recursos asociados al nombre en cuestión.
        • Por ejemplo:
  1. Un tipo "A", que contiene una dirección IP asociada al nombre.
  2. Un tipo "MX", que nos da la dirección IP asociada a un servidor de correo.

La función real del DNS es relacionar los nombres de dominio con los registros de recursos. Un registro de recurso es una tupla de cinco valores:

  • Nombre de dominio: es el nombre del objeto referenciado por el RR. Puede ser un nombre de estación o un nombre de dominio. Si se omite este campo, el registro aplica al último nombre usado.
  • TTL: es el tiempo de vida del registro (segundos). Define la cantidad de segundos que la información sobre ese registro puede mantenerse en un servidor de caché.
  • Clase: define el espacio de nombres (en la práctica, solo se usa IN para Internet). Existen otras clases de registros, pero no se usan comúnmente.
  • Tipo: identifica el tipo de RR de acuerdo a la tabla siguiente.
  • Valor: es la información específica al tipo de RR.

REGISTRO AXFR  todos los registros de recurso de la zona

dig -t  AXFR @ lab.it.uc3m.es

# 7. Registro MX (nombre Servidor de Correo)

# Consulta los servidores de correo para un dominio.

dig -t MX uc3m.es

# 6. Registro SOA (Inicio de Autoridad) (SERVIDOR PRIMARIO) ( CORREO ELECTORNICO DEL ADMINISTRADOR)

dig -t SOA uc3m.es

# 5. Registro PTR (Puntero para consultas inversas) que maquina tiene determinada ip

# Consulta inversa para obtener el nombre de dominio a partir de una IP.

dig -t PTR 115.139.117.163.in-addr.arpa

# 4. Registro NS (Servidor de Nombres)

# Consulta los servidores de nombres autorizados para un dominio/zona. PARA VER PRIMARIO SOA

dig -t NS it.uc3m.es

# 3. Registro CNAME (Nombre Canónico) si no tiene directamente un registro a sino que apunta a otro dominio si preguntas al locl host

# Consulta el alias de un dominio.

dig -t CNAME www.it.uc3m.es

# 2. Registro AAAA (Dirección IPv6 de un host)

# Consulta la dirección IPv6 de un dominio.

dig -t AAAA www.uc3m.es

# 1. Registro A (Dirección IPv4 de un host) si salen varias es que tiene balance de carga

dig -t A www.uc3m.es

Formato de mensaje DNS

      • Hay un formato de mensaje DNS básico [RFC6195] que se utiliza para todas las operaciones de DNS:
        • Consultas, respuestas, transferencias de zona, notificaciones y actualizaciones dinámicas.

(Ilustración del formato de mensaje DNS con encabezado y secciones).

      • El mensaje DNS:
        • Comienza con un encabezado fijo de 12 bytes:
          • ID de transacción (16 bits):
            • Se asocia (relaciona) entre el cliente y lo devuelto al servidor.
            • Permite al cliente relacionar las respuestas con las solicitudes.
          • Indicadores (flags) (16 bits):
            • Ver transparencias siguientes.
          • Cuatro campos de 16 bits:
            • Número de entradas en la sección de preguntas.
            • Número de entradas en la sección de respuestas.
            • Número de entradas en la sección de autoridad.
            • Número de entradas en la sección de recursos adicionales.
      • Indicadores (flags):
        • QR: 1 bit que indica si el mensaje es una consulta (0) o respuesta (1).
        • OPCODE (4 bits): Define el tipo de consulta.
          • Consulta estándar: 0.
          • Inversa: 1.
          • Notificación: 4.
        • AA: Autoridad (1 si el servidor responde con autoridad sobre el dominio consultado).
        • TC: Indica truncamiento si la respuesta excede los 512 bytes en UDP.
        • RD: Si está habilitado, solicita resolución recursiva.
        • RA: Indica si el servidor soporta consultas recursivas.SI ES AA NO USA RA (AL SER SERV AUTORIZADO NO TIENE QUE UTILIZAR RECURSION PARA OBTENER RESPUESTA)
        • Z: Reservado para futuro uso (debe valer 0).
        • AD: Autenticado.
        • CD: Deshabilita validaciones DNSSEC.
        • RCODE (4 bits): Código de retorno que indica éxito o error.
      • El encabezado va seguido de cuatro secciones de longitud variable, conteniendo cero, uno o más registros de recursos (RR):
        • Preguntas (sección de consulta).
          • Nombre que se quiere resolver.
          • Tipo de registro que se busca.
        • Respuestas.
          • Respuestas correspondientes a la consulta.
        • Autoridad.
          • Información sobre los servidores autoritativos de la zona.
        • Información adicional.
          • Registros no solicitados (prefetching).
          • Responden a consultas que no habían sido pedidas.

wogqCIAiCIP7A6AGCIAiCIP7A6AGCIAiCIP7A6AGCIAiCIP7A6AGCIAiCIP7A6AGCIAiCIP7A6AGCIAiCIP7A6AGCIAiCIP7A6AGCIAiCIP7A6AGCIAiCIP7A6AGCIAiCIP7A6AGCIAiCIP7A6AGCIAiCIP7A6AGCIAiCIP7A6AGCIAiCIP7A6AGCIAiCIP7A6AGCIAiCIP7A6AGCIAiCIP7A6AGCIAiCIP7A6AGCIAiCIP7A6AGCIAiCIP7A6AGCIAiCIP7A6AGCIAiCIP7A6AGCIAiCIP7A6AGCIAiCIP7A6AGCIAiCIP7A6AGCIAiCIP78D3kDurE2dHIfAAAAAElFTkSuQmCC

s6Li6Mm7trk0e7jD1UAwAAAICjQAc4AAAAwNEgVAMAAAAcDUI1AAAAwNEgVAMAAAAcDUI1AAAAwNEgVAMAAAAcDUI1AAAAwNEgVAMAAAAcDUI1AAAAwNEgVAMAAAAcDUI1AAAAwNEgVAMAAAAcDUI1AAAAwNEgVAMAAAAcDUI1AAAAwNEgVAMAAAAcDUI1AAAAwNEgVAMAAAAcDUI1AAAAwNEgVAMAAAAcDUI1AAAAwNEgVAMAAAAc7X+hgaFyebTDlgAAAABJRU5ErkJggg==

Formato de mensaje DNS

      • RR en respuestas, registros de autoridad y registros adicionales:
        • Cada registro consta de:
          • Nombre de dominio (cualquier número de bytes, como se ha explicado antes).
            • No necesariamente es el nombre que aparece en la consulta; puede ser un nombre relacionado o una referencia anterior.
          • Tipo (16 bits): A, MX, NS...
          • Clase (16 bits): IN (1).
          • TTL (32 bits): En segundos, especifica cuánto tiempo puede estar en la caché.
          • Longitud de datos (16 bits): en octetos.
          • Datos.
      • Respuestas:
        • En esta sección vienen los RR que responden exactamente a lo que se ha consultado.
      • Registros de autoridad:
        • En consultas iterativas, incluye los registros NS de los servidores a los que preguntar después.
        • En consultas inversas, identifica el servidor autoritativo para el nodo consultado.
      • Registros adicionales:
        • Pre-cargados datos (DNS prefetching).
        • Por ejemplo, si un registro contiene nombres en lugar de datos que se resuelven fácilmente (como las direcciones IP de los servidores en la sección de autoridad), el servidor puede tratar de obtener estos datos por adelantado.

Envío TCP o UDP

      • DNS tiene reservado el puerto 53 tanto de TCP como UDP.
      • Las consultas se envían en principio por UDP:
        • Si no hay respuesta, se implementa un temporizador de 4 segundos tras el cual se retransmite el mismo ID de consulta.
        • El tamaño máximo del mensaje en UDP es 512 bits.
          • Si la respuesta excede este tamaño, se usa TCP (bit TC = 1).
        • Esto es relevante especialmente para registros grandes o respuestas con muchos registros.
        • En el caso de DNSSEC, debido al tamaño de las respuestas, se prefiere TCP.
      • Recuerda:
        • En la práctica, las consultas DNS sobre UDP son más rápidas.
      • Cuando un secundario tiene que hacer una transferencia de zonas:
        • Puede hacerla por UDP si es incremental (IXFR).
        • Si es completa (AXFR) puede suponer muchos bytes, se hace por TCP.
      • Esto sucede también cuando debe hacer una transferencia de zonas:
        • Cuando tras el tiempo de actualización indicado en el SOA, vuelve a solicitar el registro SOA del primario y observa que el número de serie se ha aumentado.
        • Entonces recibe un mensaje DNS NOTIFY del primario.

Awc5bPQcIeO1AAAAAElFTkSuQmCC

x89wCx9ur0xyAAAAABJRU5ErkJggg==

SCBJuFr5wDYAAAAASUVORK5CYII=

D0FQB77ETSR8AAAAAElFTkSuQmCC

DNSSEC

      • Inicialmente definido sin tener en cuenta seguridad:
        • RFC 2535 propuso DNS-SEC en 1999.
        • RFC 4033-4035 actualizan en 2005.
      • Se basa en criptografía de clave pública:
        • Cada zona tiene una clave pública y otra privada.
        • Los datos DNS se firman digitalmente:
          • RRSIG: Firma digital.
          • DNSKEY: Clave pública.
      • Asegura:
        • Protección de datos: autenticidad y validez.
        • Protección contra inyecciones: evita datos falsos.
      • DNSSEC no protege contra la denegación de servicio ni protege el tráfico DNS.
      • Requiere compatibilidad entre servidores DNS y protocolos actualizados.
      • Componentes:
        • Se añaden nuevos tipos de RR (RRSIG, DNSKEY, NSEC, etc.).
        • Cada entrada DNS está firmada.

Dynamic DNS (DDNS)

      • Extensión de DNS para permitir que se pueda añadir, borrar o actualizar entradas:
        • Versión no segura: RFC 2136.
        • Versión segura: RFC 3007.
          • Añade tipo de petición UPDATE.
          • Valor 5 en los 14 tipos de parámetros.
        • Además de la información de actualización se pueden añadir pre-requisitos que verifica el servidor antes de realizar la actualización:
          • Si los RR ya existían o existían previamente.
          • Si el nombre estaba en uso.

El formato de extensión DNS (EDNS0)

      • El formato de mensaje DNS básico tiene varias restricciones:
        • Tiene campos de longitud fija.
        • La principal es la limitación a 512 bytes cuando se usa con UDP (incluido encabezados UDP e IP).
        • Espacio limitado para indicar tipos de error (el RCODE de 4 bits).
      • Un mecanismo de extensión llamado EDNS0 se especifica en RFC2671:
        • Se utiliza para expandir la seguridad del DNS (DNSSEC, por ejemplo) y en casos de uso más generalizados.
        • Especifica un tipo de pseudo-RR (OPT) que se puede añadir a la sección adicional de una solicitud o respuesta para indicar el uso de EDNS0.
        • Cuando EDNS0 se usa, estos registros pueden estar presentes en una consulta o respuesta.
        • Permite exceder los 512 bytes y contener un conjunto ampliado de códigos de error.
      • Ejemplos EDNS0:

Y9A868cNwmr7GM2rggivnDzW7ehmSsQ9O3BZA9BEARBExys6yEIgiBogoPJHoIgCIImOJjsIQiCIGiCg8kegiAIgiY4mOwhCIIgaIKDyR6CIAiCJjiY7CEIgiBogoPJHoIgCIImOJjsIQiCIGiCg8kegiAIgiY4mOwhCIIgaIKDyR6CIAiCJjiY7CEIgiBogoPJHoIgCIImOJjsIQiCIGiCg8kegiAIgiY4mOwhCIIgaIKDyR6CIAiCJjiY7CEIgiBogoPJHoIgCIImOJjsIQiCIGiCg8kegiAIgiY4mOwhCIIgaIL7PxVjhmjWbFE8AAAAAElFTkSuQmCC

DNS over TLS (DoT)

      • RFC 7858.
      • Protocolo para enviar las consultas/respuestas DNS sobre TLS.
        • Para aumentar la privacidad (escuchas) y la seguridad (manipulación de la respuesta).
      • Puerto 853.
      • También hay una versión sobre DTLS, pero menos usada en la práctica (RFC 8094).
      • Desde 2019, varios servicios públicos de resolución de DNS (Cloudflare, Quad9, Google, Quadrant Information Security y CleanBrowsing) ofrecen soporte DoT.
      • Críticas:
        • Dificulta control parental (algunos DNS públicos lo ofrecen).
        • Los servidores autorizados (habitualmente) no soportan DoT, con lo que únicamente se cifra salto a salto.
        • Algunos proveedores filtran este tráfico.

DNS over HTTPS (DoH)

      • RFC 8454.
      • Protocolo para enviar las consultas/respuestas DNS sobre HTTPS.
        • Puede usar HTTPS (1.1) o HTTP/2.
        • Envía los mensajes DNS en la carga útil de un mensaje HTTPS con el tipo MIME application/dns-message.
      • Todavía poco soportado en sistemas operativos, pero cada vez más en navegadores.
        • El navegador no usa el resolver del sistema operativo para hacer las consultas al DNS, sino que envía las consultas por HTTPS usando otro servidor DNS.
      • Soportado cada vez por más servidores DNS públicos.
      • Mismas críticas que a DoT, pero es más difícil de filtrar (es un tráfico HTTPS


SERVICIO DE CORREO ELECTRÓNICO CORREO ELECTRÓNICO

ÍNDICE

1. Introducción.

2. Arquitectura del sistema.

3. Formato del mensaje (RFC 822, MIME).

4. Transferencia mensajes (SMTP, ESMTP).

5. Entrega final (POP3, IMAPv4).

Introducción

  • Intercambio de mensajes entre usuarios.
    • Aplicación muy popular.
    • Su introducción en empresas supuso un aumento de productividad del 30 %.
  • Historia:
    • Desde hace más de 20 años.
      • Extensión del correo local en sistemas multiusuario
    • Al principio era transferencia de fichero al que se añadía primera línea con dirección destino.
      • El núcleo no tenía estructura interna.
        • Imposible enviar a varios a lo mismo.
        • Imposible enviar mezcla de texto, voz, video.
        • Interfaces de usuario pobres.
    • 1982: propuesta de e-mail de ARPANET.
      • RFC 822: formato del mensaje.
      • RFC 821: protocolo de transmisión.
    • 1984: CCITT borrador ("draft") de X.400.
      • 1988: modificaciones hacia MOTIS (OSI).
    • 1990: RFC 822/821 vence a X.400.
    • Responsable del primer "boom" de Internet.
      • (Cacares 1991): 50% conexiones TCP eran de correo.
      • Hoy en día aproximadamente el 10% tráfico correo.
    • Años 90: mejoras, extensiones y nuevos protocolos.
      • Actualmente ¿crisis por el spam?
  • Nos centraremos en el e-mail de Internet.

Arquitectura

  • Dos subsistemas:
    • Agente de usuario (UA).
      • Programa para leer y escribir correo.
      • mail, pine, mutt... MS Outlook, Mozilla Thunderbird, Apple Mail... Google gmail.
    • Agente de transferencia de mensajes (MTA).
      • Mueve los mensajes entre máquinas.
      • sendmail, exim, postfix, MS Exchange...
  • Estándares involucrados:
    • Formato de mensaje (RFC 822, MIME).
    • A quién se lo manda (DNS MX).
    • Protocolo de envío de mensajes (SMTP, ESMTP).
      • Entre UA origen y MTA, y entre MTAs.
    • Protocolo de entrega final (POP3, IMAPv4).
      • Entre MTA final y UA final.

(Diagrama inferior)

El diagrama muestra la interacción entre UA (Usuario Agente), MTA (Agente de Transferencia de Mensajes) y los protocolos implicados como SMTP, POP3/IMAP4 para la entrega final. Cada parte del flujo se etiquetó con referencias a los estándares como RFC 822 / MIME.

A48IulAo0WvsAAAAAElFTkSuQmCC

RFC 822: Algunas cabeceras

  • De traza (la pone cada MTA que pasa el mensaje):
    • Received: [“from” sending host] [by receiving host] {“with” mail protocol} [“id” msg-id] [“for” address],” date-time received
  • De identificación del mensaje (la pone el MTA origen):
    • Message-Id: Únique message id.
  • De la UA (UA):
    • Date: día y hora de envío del mensaje.
    • From: dirección origen.
      • La mayoría de los virus falsifican esta dirección.
    • Sender: quién ha enviado el mensaje si es una cabecera Sender:.
    • Reply-To: dirección a la que se responde (si no hay, se responde a la de From:).
    • To: lista de los receptores del mensaje (una o varias direcciones separadas por comas).
    • Cc: receptores en copia, pero el mail se ve su dirección.
    • Bcc: lo mismo, pero oculto.
    • Subject: asunto del mensaje.
  • Los usuarios UA o MTAs pueden inventarse sus propias cabeceras no estándar, con nombres que empiecen por X-.
  • Las direcciones de correo en las cabeceras pueden tener estos formatos:
  • Otras cabeceras:
    • In-Reply-To: (Message-Id al que se responde), References (otros Message-Id relevantes), Keywords.
    • En RFC 2076 hay dos (Status y Fcc:) pensadas para mensajes almacenados en buzones, pero no se pueden usar en mensajes enviados por SMTP.

MIME: Multipurpose Internet Mail Extensions

  • Defecto de RFC 822:
    • Sólo admite cuerpo de mensaje NVT ASCII.
      • Solo texto en inglés.
    • Tamaño máximo de línea 1000 caracteres.
  • Problemas:
    • Lenguas latinas: acentos, ñ, ¿...
    • Lenguas no latinas (hebreo, ruso, chino, japonés).
    • Imágenes, sonido, video, programas...
    • Enviar varias cosas en un mensaje.
  • Otros problemas derivados de limitaciones típicas de implementaciones de MTAs:
    • No admiten mensajes mayores de un tamaño determinado.
      • ¿Cómo fragmentar un mensaje en varios?
    • Algunas borran blancos al final del mensaje.
    • Algunas parten las líneas > 76 caracteres.
    • Algunas convierten en .
    • Algunas convierten en varios blancos.
  • MIME incluye mecanismos para resolver estos problemas:
    • Originalmente RFC 1341 (año 1992).
    • Versiones posteriores RFCs 2045-47, 2049, 4288, 4289.

MIME: Nuevas cabeceras

  • MIME compatible con RFC 822.
    • El mensaje sigue siendo NVT ASCII.
  • Define 5 nuevas cabeceras.
    • Cabecera MIME-Version:
      • Esta cabecera debe estar presente para que un mensaje sea tratado como MIME.
      • Versión actual 1.0
        • MIME-Version: 1.0
    • Otras cuatro cabeceras:
      • Content-Type
        • Define cómo interpretar un objeto en el cuerpo del mensaje.
        • Valor por defecto: text/plain; charset=us-ascii.
      • Content-Transfer-Encoding
        • Define cómo está codificado un objeto.
        • Valor por defecto 7bit (NVT ASCII).
      • Content-Description
        • Texto descriptivo del objeto.
      • Content-Id
        • Valor único que especifica el objeto (para poder referenciarlo).
  • Vamos a ver con más detalle las dos primeras.

MIME: Content-Type

  • Formato:
    • Content-Type: type/subtype; parameter=value; parameter=value...
    • Los parámetros permitidos dependen del tipo y subtipo.
      • Algunos no tienen definido parámetros, otros sólo parámetros opcionales, otros tienen alguno obligatorio...
  • Inicialmente (RFC 1521) definidos siete tipos MIME, cada uno con diversos subtipos.

MIME: Content-Type

Página 12

  • Tipos predefinidos:
  1. text: información textual
  • text/plain: texto sin formato
    • Parámetro charset= para especificar tabla de códigos:
      • us-ascii: NVT ASCII (rango 0-127). Valor por defecto.
      • iso-8859-x: Con caracteres en el rango 128-255 codificados según la tabla ISO correspondiente.
  • Otros subtipos:
    • text/richtext y text/enriched (obsoletos).
    • text/html: Definido en RFC 2854.
    • text/xml: Definido en RFC 3023 (ver también RFC 6839).

MIME: Content-Type

Tipos predefinidos

Página 13

  1. multipart: cuerpo del mensaje formado por varias partes.
  • multipart/mixed: partes independientes en el orden especificado.
  • multipart/parallel: partes sin orden especificado (pueden verse simultáneamente).
  • multipart/alternative: las partes son versiones alternativas del mismo contenido en diferentes formatos.
  • multipart/digest: cada parte es un mensaje rfc822 completo (para enviar varios mails en uno).
    • Lista de correo tipo "digest", reenvío de varios mensajes en uno...
  • Parámetro: boundary=
    • Cadena de 1-70 caracteres que no debe aparecer en el cuerpo del mensaje.
    • Límite entre partes:
      --boundary 
    • Final del multipart:
      --boundary-- 
  • Cada parte del multipart puede llevar sus propias cabeceras Content-Type, Content-Transfer-Encoding, Content-Description y Content-Id.
    • Si no las lleva, toma valores por defecto.

x8msJ1jXlW9hQAAAABJRU5ErkJggg==

MIME: Content-Type

  1. message: el cuerpo es un mensaje o una parte de un mensaje grande fragmentado.
  • message/rfc822: mensaje completo.
    • Debe tener al menos From, Subject y To.
  • message/partial: mensaje dividido para su transmisión. Parámetros:
    • id= identificador único común a todos los fragmentos.
    • number= número de secuencia de este fragmento (el primero es 1).
    • total= número total de fragmentos.
  • message/external-body: el mensaje debe obtenerse de la red.
    • Parámetro access-type= indica cómo se accede (ftp, tftp, anon-ftp, local-file, mail-server).
    • Hay más parámetros.
    • Ejemplo:
      Content-Type: message/external-body; 
       access-type="anon-ftp"; 
       site="bicycle.abc.com"; 
       directory="pub"; 
       name="birthday.snd" 
image: el cuerpo es una imagen.
  • image/jpeg, image/gif, image/tiff.
video: el cuerpo es un video.
  • video/mpeg, video/m4, video/quicktime.
audio: el cuerpo es un audio.
  • audio/basic (formato mono, 8 bit, 8 KHz, ley mu), audio/mpeg (mp3, RFC 3003).
application:
  • Está pensado para contenidos que no encajen en otros tipos.
  • Datos que tienen que ser procesados por una aplicación antes de ser mostrados al usuario.
    • application/PostScript: el cuerpo es un documento PostScript.
    • application/octet-stream: el cuerpo es datos binarios compuesto por bytes de 8 bits. Parámetro optional:
      • padding= para datos de relleno para hacer múltiplo de 8 bits.
      • type= tipo de datos.
  • Otros: application/pdf, application/zip, application/javascript...
model:
  • Añadido posteriormente para describir modelados 3D. Poco usado.
  • model/vrml.
  • Otros tipos y subtipos:
    • Empezando por x-...
    • Registrados en el IANA (RFC 2048).

MIME: Content-Transfer-Encoding

• Si el cuerpo del mensaje no es NVT ASCII, puede dar problemas en MTAs.

• MIME define:

  • Dos codificaciones:
    • Permiten transformar un mensaje no NVT ASCII en NVT ASCII.
  • Una cabecera (Content-Transfer-Encoding) que puede tomar cinco valores:
    • Tres de ellos indican que no se ha hecho ninguna codificación, por distintas razones:
      • Content-Transfer-Encoding: 7-bit
        • No se ha hecho codificación porque cumple las reglas de RFC 821 (texto NVT ASCII con líneas
      • Content-Transfer-Encoding: 8-bit
        • Líneas
        • No es necesario codificar porque MTAs de origen y destino soportan 8-bit-MIMEtransport (ver ESMTP).
      • Content-Transfer-Encoding: binary
        • Caracteres no NVT ASCII y >1000 caracteres sin .
        • No es legal usarlo con protocolos de transporte actuales (SMTP, ESMTP). Sólo para indicar codificación de mensaje message/external-body.
    • Los otros dos indican que se ha hecho una codificación:
      • Content-Transfer-Encoding: quoted-printable
      • Content-Transfer-Encoding: base64

MIME: quoted-printable

• Objetivo:

  • Que el texto codificado siga siendo legible.
  • Pensado para textos con pocos caracteres no NVT ASCII (por ejemplo, mensaje en castellano).

• Reglas de codificación:

  1. Cualquier byte con valor hexadecimal XY puede representarse en quoted-printable como tres caracteres NVT ASCII: =XY, excepto la pareja de bytes (0x0D0A) cuando representan un final de línea.
  2. Los caracteres en el rango 33-126 (0x21-0x7E) se pueden representar directamente en NVT ASCII, excepto el 61 (0x3D, que corresponde al carácter =).
  3. El tabulador (0x09) y el blanco (0x20) pueden representarse directamente en NVT ASCII excepto si son el último carácter de una línea (se representan como =09 o =20).
  4. Las líneas no pueden ser mayores de 76 caracteres (excluidos ). Si alguna es mayor, debe incluirse un final de línea "blando", esto es, la secuencia = (0x3D0D0A).

bgefwMyJFAAAAABJRU5ErkJggg==

MIME: base64

• Objetivo:

  • Codificar datos binarios (que no son texto).
  • Más eficiente que quoted-printable.

• Reglas de codificación:

  • Se introducen bytes relleno al final para que número total bytes sea múltiplo de 3.
  • Cada 3 bytes (24 bits) se divide en 4 grupos de 6 bits.
  • Cada grupo de 6 bits (valor decimal 0-63) se codifica como un carácter NVT ASCII según la tabla de la transp. siguiente (cada uno ocupará 8 bits).
  • Las líneas se fragmentan () para que no sean mayores de 76 caracteres.
  • Se añaden al final tantos caracteres = (0, 1 ó 2) como bytes de relleno se hayan introducido inicialmente.

• Ejemplo:

makefile

Copiar código

Content-Type: image/gif
Content-Transfer-Encoding: base64

JVBORw0KGgoAAAANSUhEUgAABVYAAAFYCAYAAACqzXMpAAAqkklEQVR42u2deXRT2d3mZxkbMxMb
b2hyaW7D2c0uVh3AN1s92qRAVvUj9xnXOOLtDRrrEz6sC9hC9exC9e3Cqk2bvVnhCLJb9ncg
[...]

MiAAVf1K0Lu2tmGs8AW1FKFJg4Kc3RhcRn4K4wCmCJ9T3qC1u9URUGCg==

MIME: Consideraciones sobre Content-Transfer-Encoding

• Observar que:

  • Esta cabecera aplica al cuerpo del mensaje, no al valor de las cabeceras.
    • Por ejemplo, poner una ñ en un Subject.
  • En mensajes multipartes, cada parte puede llevar una codificación distinta.
    • Si no lo lleva, se entiende el valor por defecto (7bit).
  • El tipo (Content-Type) no condiciona que se use una determinada codificación.

MIME: Valores no NVT ASCII en cabeceras

  • RFC 1342 especifica cómo enviar caracteres no NVT ASCII en el valor de una cabecera.
    • From, To, Subject...
    • Versión actualizada RFC 2047.
  • =?charset?encoding?encoded-text?=
    • charset: us-ascii, iso-8859-x
    • encoding: un carácter.
      • B: codificación base64 (igual que se ha visto).
      • Q: codificación quoted-printable.
        • Diferencia: blanco se pone como _.
    • encoded-text: texto codificado.

• Ejemplos:

ruby

Copiar código

Subject: =?ISO-8859-1?Q?Fel=EDz_a=F1o?=
From: =?US-ASCII?Q?Keith_Moore?=  
To: =?ISO-8859-1?Q?Keld_J=F8rn_Simonsen?=  
CC: =?ISO-8859-1?Q?Andr=E9_Filard?= Filard  
Subject: =?ISO-8859-1?Q?N=E9gociations_?G?E9l=E9phant=E9= 
2734BB1IrNickoWLSM1kNQRXZelq3=?= 

osd+sAAAAASUVORK5CYII=

8PJu1ASHTVzC8AAAAASUVORK5CYII=

AxnA0fA+Dix4AAAAAElFTkSuQmCC

S/MIME

  • S/MIME (Secure / Multipurpose Internet Mail Extensions) es un estándar para criptografía de clave pública y firmado de correo electrónico encapsulado en MIME.
    • RFC 2633 (1999), versión actual RFC 5751 (2010).
  • Proporciona:
    • Autenticación, integridad y no repudio (mediante el uso de firma digital).
    • Privacidad y seguridad de los datos (mediante el uso de cifrado).
  • S/MIME especifica el tipo application/pkcs7-mime:
    • La entidad MIME completa se cifra y se inserta en una entidad MIME application/pkcs7-mime.

Funcionamiento del cifrado de correos:

  1. El remitente conoce las claves públicas de los destinatarios (certificados X.509).
  2. Crea una clave simétrica de sesión.
  3. Para cada destinatario del correo:
  • Crea una copia de la clave simétrica, cifrada con:
    • La clave pública del destinatario.
    • Su certificado.
    • El algoritmo de clave simétrica usado.

Cifra el mensaje con la clave simétrica. Codifica todo el contenido cifrado en base64.

38QbvrTNbfLWFy9Ncc++9wIehsCgbzpvFKCgUAgEAhEHvBCGAKBQCBDAkwwEAgEAhkSYIKBQCAQyJAAEwwEAoFAhgSYYCAQCAQyJMAEA4FAIJAhASYYCAQCgQwJMMFAIBAIZEiACQYCgUAgQwJMMBAIBAIZEmCCgUAgEMiQ8H97RTasLOmZLQAAAABJRU5ErkJggg==

Firma de mensajes en S/MIME:

  1. Creación del resumen:
  • Para cada destinatario se crea un resumen del mensaje (hash del contenido).
Firma del resumen:
  • El resumen se firma usando la clave privada del remitente.
Inclusión de información:
  • Cada firma incluye:
    • La firma del resumen.
    • El certificado del remitente.
    • El algoritmo utilizado.
  • Esto se inserta en una entidad application/pkcs7-signature.
Empaquetado del mensaje:
  • Todo se empaqueta junto con el mensaje en un multipart/signed.

g915kFQ3LHRDwAAAABJRU5ErkJggg==

SMTP: Protocolo de transferencia de mensajes

  1. Objetivo:
  • Transferencia de mensajes desde UA origen a MTA.
  • Transferencia entre MTAs hasta llegar al MTA de destino.
Características:
  • Protocolo: SMTP (Simple Mail Transfer Protocol).
  • RFC: 821 (actualizada a RFC 2821 y RFC 5321 en 2008).
  • Puerto: TCP 25.
  • Formato:
    • Conexión establecida → Servidor envía mensaje de bienvenida (en NVT ASCII).
    • Intercambio de comandos y respuestas en NVT ASCII.
Estructura de comandos y respuestas:
  • Comandos (origen -> destino):
    • NVT ASCII (similar a FTP, pero con menos comandos).
  • Respuestas (destino -> origen):
    • Formato: 3 dígitos + espacio + texto opcional.
    • Ejemplo: 250 message accepted.
    • Significado: Solo es significativo el número (igual que FTP).

Comandos SMTP (obligatorios)

  1. HELO
  • Identifica al origen ante el destino.
MAIL FROM:
  • Comienza la transacción de un correo.
RCPT TO:
  • Especifica un destinatario del correo.
DATA
  • Inicia el envío del mensaje (RFC 822 o MIME).
QUIT
  • Termina la conexión (destino envía OK y cierra).
RSET
  • Aborta la transacción actual del correo.
VRFY
  • Verifica si existe el usuario especificado.
NOOP
  • "No operation" (el servidor responde 200 OK).

Comandos SMTP (opcionales)

  1. EXPN
  • Confirma si existe una lista de correo específica.
HELP []
  • Muestra información sobre comandos disponibles o uno específico.

Comandos obsoletos

  1. TURN
  • Intercambia los roles de origen y destino (problemas de seguridad).
SEND FROM:
  • Envía el mensaje al terminal.
SOML FROM:
  • Send or mail: Si el usuario está conectado, se envía al terminal; de lo contrario, se envía por correo.
SAML FROM:
  • Send and mail: Envía al terminal y por correo.

SMTP: Respuestas

  • Formato:
    3 dígitos + carácter blanco + texto opcional +
    • Todo en NVT ASCII.
    • El cliente solo procesa el código de 3 dígitos.
    • El texto opcional es para interpretación humana.

Clasificación de respuestas SMTP

  1. 1yz - Respuesta preliminar positiva
  • El comando ha comenzado a ejecutarse.
  • Se debe esperar a una respuesta completa antes de enviar un nuevo comando.
2yz - Respuesta completa positiva
  • El comando ha sido ejecutado correctamente.
3yz - Respuesta intermedia positiva
  • El comando fue aceptado, pero se debe enviar otro comando para completarlo.
4yz - Respuesta completa negativa transitoria
  • La acción solicitada no se ejecutó correctamente, pero la causa es temporal.
  • El comando puede reintentarse.
5yz - Respuesta completa negativa permanente
  • El comando no ha sido aceptado y no debe reintentarse.

Ejemplo de Respuestas SMTP

  • 220: Servicio listo.
  • 250: Comando aceptado y ejecutado.
  • 354: Comenzar a enviar los datos del mensaje.
  • 421: Servicio no disponible (error temporal).
  • 550: Usuario desconocido (error permanente).

wPxM4a3giFPrgAAAABJRU5ErkJggg==

SMTP: Secuencia de comandos

1. Establecimiento de conexión TCP

  1. El cliente (C) establece una conexión TCP al puerto 25 del servidor (S).
  2. Identificación:
  • El servidor envía un mensaje de bienvenida:
    • S: 220 Service ready
    • Error: 421
  • El cliente envía su nombre y espera confirmación:
    • C: HELO
    • S: 250 Requested mail action okay, completed
    • Error: 500, 501, 504, 421

2. Envío de correo

  1. Dirección origen del correo:
  • C: MAIL FROM:
  • S: 250 Requested mail action okay, completed
  • Fallo: 552, 451, 452
  • Error: 500, 501, 421
Direcciones de destino (repetido por cada destinatario):
  • C: RCPT TO:
  • S: 250 Requested mail action okay, completed
  • S: 251 User not local; will forward to
  • Fallo: 550, 551, 552, 553, 450, 451, 452
  • Error: 500, 501, 503, 421
Envío de datos:
  • C: DATA
  • S: 354 Start mail input; end with .
  • C: Contenido del correo (RFC 822, MIME)
  • C: .
  • S: 250 Requested mail action okay, completed
  • Fallo: 552, 554, 451, 452
  1. La fase 3 puede repetirse para enviar varios correos en la misma conexión.

3. Despedida

  • C: QUIT
  • S: 221 Service closing transmission channel
    • Error: 500

4. Cierre de la conexión TCP

Ejemplo 1: Transacción Normal

vbnet

Copiar código

S: 220 foo.com Simple Mail Transfer Service Ready 
C: HELO bar.com 
S: 250 foo.com greets bar.com 
C: MAIL FROM: 
S: 250 OK 
C: RCPT TO: 
S: 250 OK 
C: RCPT TO: 
S: 550 No such user here 
C: RCPT TO: 
S: 250 OK 
C: DATA 
S: 354 Start mail input; end with . 
C: Blah blah blah... 
C: ...etc. etc. etc. 
C: . 
S: 250 OK 
C: QUIT 
S: 221 foo.com Service closing transmission channel 

Ejemplo 2: VRFY antes de enviar

vbnet

Copiar código

S: 220 foo.com Simple Mail Transfer Service Ready 
C: HELO bar.com 
S: 250 foo.com greets bar.com 
C: VRFY Crispin 
S: 250 Mark Crispin  
C: SEND FROM: 
S: 250 OK 
C: RCPT TO: 
S: 250 OK 
C: DATA 
S: 354 Start mail input; end with . 
C: Blah blah blah... 
C: ...etc. etc. etc. 
C: . 
S: 250 OK 
C: QUIT 
S: 221 foo.com Service closing transmission channel 

Ejemplo 3: Abortar transacción SMTP RSET

vbnet

Copiar código

S: 220 foo.com Simple Mail Transfer Service Ready 
C: HELO bar.com 
S: 250 foo.com greets bar.com 
C: MAIL FROM: 
S: 250 OK 
C: RCPT TO: 
S: 250 OK 
C: RCPT TO: 
S: 550 No such user here 
C: RSET 
S: 250 OK 
C: QUIT 
S: 221 foo.com Service closing transmission channel 

Ejemplo 4: Listas de correo

  • Expandir una lista (respuesta multilínea):

makefile

Copiar código

C: EXPN Example-People 
S: 250-Jon Postel  
S: 250-Fred Fonebone  
S: 250 Sam Q. Smith  

  • Ejemplo de denegación de permiso para expandir lista:

vbnet

Copiar código

C: EXPN Executive-Washroom-List 
S: 550 Access Denied to You. 

SMTP: Consideraciones sobre RCPT • Los destinatarios del correo los determina el comando RCPT TO, no las cabeceras From, To, Cc, Bcc del mensaje.

kAAAAASUVORK5CYII=

SMTP: ¿Para qué el reenvío de mail?

  • Teóricamente:
    El UA del origen podría enviar el correo directamente al MTA del destinatario realizando una consulta DNS.
    • Ejemplo: Si el correo es para [email protected]:
      • Se consulta el DNS MX asociado a dominio.es.
      • Si no hay registro RR MX, se consulta RR A e intenta enviar el correo a esa máquina.
  • En la práctica, el correo pasa por varios saltos debido a:
  1. Configuración de los UAs:
  • Suelen estar configurados para enviar todo su correo a un MTA por defecto.
Organización centralizada:
  • Todas las MTAs de una organización suelen enviar el correo a una única MTA de salida.
  • Esta máquina es la única que puede establecer conexiones TCP 25 al exterior.
  • Esto evita que máquinas internas generen spam.
MTA de salida y destino:
  • La MTA de salida determina la MTA de destino mediante una consulta DNS RR MX.
  • Generalmente, una única MTA recibe todo el correo entrante y lo distribuye internamente.
    • Da una visión unitaria de la organización con direcciones tipo [email protected].
    • Proporciona mayor control ante ataques de spam.
  • Si ningún MTA de RR MX responde:
  1. Debe reintentar tras al menos 30 minutos.
  1. Si sigue fallando, debe reintentar durante 4-5 días.
  1. RFC 1123:
  • Define los requisitos para los hosts de Internet.
  • Este comportamiento también está incluido en RFC 2821/5321.

SMTP: MTAs de reenvío

  • Definición:
    Las MTAs intermedias se denominan MTAs de reenvío o MTA Relay.
  • Configuración:
    Están configuradas para aceptar:
    • Conexiones de clientes de tu organización para enviar correos (RCPT TO) a cualquier destinatario de Internet.
    • Conexiones de clientes de todo Internet que envían correos (RCPT TO) a destinatarios dentro de la organización.

SMTP: Más consideraciones sobre RCPT

  1. ¿Qué pondrá el UA en el RCPT TO?
  • Si todo su correo lo manda a un MTA por defecto, se enviará:

    vbnet
    Copiar código
    C: RCPT TO:  
    S: 250 OK 
    C: RCPT TO:  
    S: 250 OK 
    C: DATA 
    ...
  1. ¿Qué pondrá el MTA Relay en el RCPT TO en el siguiente salto?
  • El MTA Relay obtendrá por DNS el RR MX de abc.de, se conectará al puerto 25 de esa máquina y enviará:

    vbnet
    Copiar código
    C: RCPT TO:  
    S: 250 OK 
    C: DATA 
    ...
  • Cerrará la conexión, obtendrá por DNS el RR MX de uvx.yz, se conectará al puerto 25 de esa máquina y enviará:

    vbnet
    Copiar código
    C: RCPT TO:  
    S: 250 OK 
    C: DATA 
    ...
  • Detalles adicionales:
    • El mensaje que se envía en DATA será el mismo, excepto la cabecera Bcc: si alguno de los destinatarios estaba en Bcc.
    • Cada MTA destino añadirá su propia línea Received: en el correo.

ESMTP (Extended SMTP)

  1. Problemas de SMTP (RFC 821):
  • Longitud de los mensajes:
    Algunas implementaciones no soportan mensajes mayores de 64 KB.
  • Cuerpo del mensaje:
    Problemas al incluir caracteres no NVT ASCII.
  • Temporizadores (timeout):
    Cliente y servidor pueden tener diferentes configuraciones.
  • Seguridad:
    Falta autenticación y confidencialidad.
  1. Solución: ESMTP (RFC 1425):
  • Actualizaciones y RFCs posteriores:
    • RFC 5321: ESMTP
    • RFC 1652 / 6152: Soporte para 8-bit
    • RFC 1870: Soporte para SIZE
    • RFC 2554 / 5248: AUTH (autenticación)
    • RFC 3207: STARTTLS (confidencialidad)
  • Compatibilidad hacia atrás:
    • Un cliente que desee usar ESMTP comienza enviando EHLO en lugar de HELO:

      makefile
      Copiar código
      C: EHLO varpa.it.uc3m.es 
    • El servidor responde con una lista multilínea de comandos ESMTP que soporta.
    • Ejemplo respuesta:

      makefile
      Copiar código
      S: 250-EXTENDED SMTP 
      S: 250-SIZE 
      S: 250-AUTH LOGIN PLAIN 
      S: 250-STARTTLS 
  • Si el servidor no soporta ESMTP:

    makefile
    Copiar código
    C: EHLO varpa.it.uc3m.es 
    S: 500 Command unrecognized 
    C: RSET 
    S: 250 Reset state 
    C: HELO varpa.it.uc3m.es 
    ...
Extensiones de ESMTP:
  • Los comandos MAIL FROM y RCPT TO pueden incluir parámetros adicionales.

qpACCH0jXO3vyoQQgh942CoQAgh5AeGCoQQQn5gqEAIIeQHhgqEEEJ+YKhACCHkB4YKhBBCfmCoQAgh5AeGCoQQQn5gqEAIIeQHhgqEEEJ+YKhACCHkB4YKhBBCfmCoQAgh5AeGCoQQQn5gqEAIIeQHhgqEEEJ+YKhACCHkB4YKhBBCfmCoQAgh5AeGCoQQQn5gqEAIIeQHhgqEEEJ+YKhACCHkB4YKhBBCfmCoQAgh5AeGCoQQQn78f0XFn+N2rI+xAAAAAElFTkSuQmCC

ESMTP: Extensiones de seguridad

SMTPS:

  • Puerto 465:
    • Negocia TLS automáticamente después de abrirse la conexión TCP, antes de enviar comandos/respuestas SMTP.
    • Estado:
      • Obsoleto (reemplazado por STARTTLS).
      • El puerto 465 ahora está reservado para otra aplicación, pero aún existen servidores y clientes que lo utilizan.

RFC 3207 (STARTTLS):

  • Funcionamiento:
    • Durante una sesión SMTP normal, el cliente y servidor negocian TLS para asegurar la conexión.
  • Proporciona confidencialidad y seguridad sobre una conexión SMTP existente.

RFC 5248 (AUTH):

  • Autenticación del cliente:
    • El servidor ofrece una lista de mecanismos de autenticación soportados:
      • PLAIN, LOGIN, GSSAPI, DIGEST-MD5, CRAM-MD5, MD5.
    • El cliente selecciona uno para autenticarse.

Ejemplo de PLAIN:

  • El cliente envía la autenticación en formato base64:
    "authorization-id\0authentication-id\0passwd"
    • Ejemplo simplificado de flujo:
      • Primero, normalmente se habrá ejecutado STARTTLS para cifrar la conexión.
      • El cliente envía los datos de autenticación en base64.

Comportamiento del servidor:

  • Si el cliente no se autentica, el servidor puede responder a otros comandos con:

    530 Authentication required

k3gyAFBEASpBo4cEARBkGrgyAFBEASpBo4cEARBkGrgyAFBEASpBo4cEARBkGrgyAFBEASpBo4cEARBkGrgyAFBEASpBo4cEARBkGrgyAFBEASpBo4cEARBkGrgyAFBEASpBo4cEARBkGrgyAFBEASpBo4cEARBkGrgyAFBEASpBo4cEARBkGrgyAFBEASpBo4cEARBkGrgyAFBEASpBo4cEARBkGrgyAFBEASpBo4cEARBkGrgyAFBEASpBo4cEARBkGrgyAFBEASpBo4cEARBkGrgyAFBEASp5v8BOBCOdbh4issAAAAASUVORK5CYII=

SMTP: Medidas contra el spam

El problema del spam:

  • Actualmente, 9 de cada 10 mensajes enviados por correo electrónico son spam.
  • Para combatir el spam, se han implementado y estandarizado diversas medidas.

Mail Submission:

  • Objetivo:
    Los proveedores de Internet limitan el uso de sus MTA Relay a sus propios usuarios.
  • RFC 6409 (2011) define el procedimiento Mail Submission:
    • Se implementa usando ESMTP con la extensión AUTH.
    • Se utiliza preferentemente el puerto 587 en lugar del 25:
      • Puerto 587: UA -> MTA (envío de correo por usuario al servidor).
      • Puerto 25: MTA -> MTA (envío entre servidores).
    • El MTA Relay puede comprobar los campos del mensaje para verificar si son correctos.

SPF (Sender Policy Framework):

  • RFC 6652 (2012):
    Proporciona una forma de verificación de correos electrónicos mediante DNS.
  • Funcionamiento:
    • Cuando una MTA recibe un correo de otra MTA, verifica lo siguiente:
  1. Que en el DNS, la IP del MTA que envía el correo corresponde con su nombre de dominio.
  2. Si el dominio de la dirección de origen tiene una política de envío de correo definida y esta política coincide con la MTA que envía el correo.

La política SPF se configura mediante registros RR TXT en el DNS.

Ejemplo de SPF:

of8+dVLwL5zF0AAAAASUVORK5CYII=

SMTP: Medidas contra el spam (III)

DKIM (DomainKeys Identified Mail):

  • RFC 4870 (2007), actualizado en RFC 6376 (2011).
  • Mecanismo de autenticación que permite a una organización responsabilizarse del envío de un mensaje, validable por el receptor.
  • Utiliza criptografía de clave pública para firmar electrónicamente correos electrónicos legítimos.
    • Ejemplo de uso: Gmail.
  • Protección contra manipulación:
    • Asegura integridad de extremo a extremo entre un módulo firmante y un validador.
  • DKIM añade la cabecera "DKIM-Signature" con una firma digital del contenido (cabeceras y cuerpo):
    • Por defecto SHA-256 + RSA, codificando la firma con Base64.

Ejemplo:

css

Copiar código

DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; 
d=uc3m-es.20150623.gappssmtp.com; s=20150623; 
h=message-id:reply-to:from:to:cc:references:subject:date; 
b=[... Base 64 ...]

SMTP: Medidas contra el spam (IV)

DMARC (Domain-based Message Authentication, Reporting, and Conformance):

  • RFC 7489 (2015).
  • Protocolo diseñado para proteger contra phishing y suplantación de identidad (spoofing).
  • Define políticas que indican cómo manejar correos que no superen verificaciones como SPF o DKIM.

Políticas de DMARC:

  • none: Sin acción (solo monitoreo).
  • quarantine: Envía los correos no verificados a la carpeta de spam.
  • reject: Rechaza directamente los correos no autenticados.

Configuración:

  • DMARC se implementa añadiendo un registro DNS que define la política.

Ejemplo de Registro DMARC:

$ dig -t TXT _dmarc.uc3m.es
; ANSWER SECTION:
_dmarc.uc3m.es. 86400 IN TXT "v=DMARC1; 
p=quarantine; rua=mailto:[email protected]
ruf=mailto:[email protected]; pct=100; fo=1

Explicación del Registro:

  • v=DMARC1: Especifica la versión del protocolo.
  • p=quarantine: Envía correos sospechosos a la carpeta de spam.
  • rua/ruf: Direcciones donde se envían reportes agregados y detallados.
  • pct=100: Aplica la política al 100% de los correos.
  • fo: Indica qué incluir en los reportes de fallos.

SMTP: Medidas contra el spam (V)

  • DMARC protege tanto a remitentes como receptores:
    • Garantiza que solo correos autenticados puedan enviarse desde un dominio válido.
    • Prevención de ataques de phishing.

Entrega Final

  • El destinatario puede leer el mail directamente con un UA en la máquina MTA destino.
  • O bien desde otro ordenador con UA (que no necesita tener una MTA), usando un protocolo de entrega final:
    • POP3 (Post Office Protocol)
      • RFC 1081, actual 1939.
      • Protocolo ASCII (al estilo SMTP) que permite:
        • Ver qué mensajes hay en una cuenta.
        • Recoger mensajes del MTA al UA, para leerlos posteriormente.
        • Borrar mensajes.
    • IMAPv4 (Interactive Mail Access Protocol)
      • RFC 1730, actual 3501.
      • Más sofisticado.
      • Deja el correo en el servidor.
      • Mejor cuando se accede desde varios ordenadores.

POP3

  • RFC 1081 - Post Office Protocol - Versión 3.
    • Última versión RFC 1939, extensiones en 1957, 2449, 6186.
  • Sobre TCP, puerto 110.
  • Tras abrir conexión, se recibe bienvenida del servidor:
    • S: +OK POP3 server ready
  • A partir de ahí cliente y servidor mandan comandos y responden.

Respuestas:

  • S: +OK string
  • S: -ERR string

Comandos:

  • USER
    • S: +OK
  • PASS
    • S: +OK
  • STAT
    • Devuelve número de mensajes y tamaño total.
    • Ejemplo:

      makefile
      Copiar código
      C: STAT 
      S: +OK 2 320 
  • LIST
    • Lista mensajes y tamaño.
    • Ejemplo:

      makefile
      Copiar código
      C: LIST 
      S: +OK 2 messages (320 octets) 
      1 120 
      2 200 
      S: . 
  • RETR
    • Recupera mensaje indicado.
  • DELE
    • Borra el mensaje indicado.
  • NOOP
    • No hace nada.
  • QUIT
    • Cierra sesión y borra los mensajes marcados.

Ejemplo de sesión POP3:

C: USER mrc 
S: +OK 
C: PASS secret 
S: +OK 
C: STAT 
S: +OK 2 320 
C: LIST 
S: +OK 2 messages (320 octets) 
1 120 
2 200 
S: . 
C: RETR 1 
S: +OK 120 octets 
C: DELE 1 
S: +OK message 1 deleted 
C: QUIT 
S: +OK POP3 server signing off 

POP3 (y IV)

Comandos opcionales:

  • TOP []
    • Envía las cabeceras y las n primeras líneas del mensaje msg.
  • UIDL [msg]
    • Da un identificador único de mensaje (no cambia, a diferencia del de posición).
      • C: UIDL
      • S: +OK
      • S: 1 whqtswO00WBw418f9t5JxWxZ
      • S: 2 QhdPTR:00WBwP1h7x7
  • APOP
    • Permite autenticarse sin mandar el password en claro.
      • S: +OK POP3 server ready
      • C: APOP mrose c4c9334bac560ecc979e58001b3e22fb
      • S: +OK maildrop has 1 message (369 octets)
    • El final del mensaje de bienvenida es el reto.
    • El segundo parámetro de APOP es el MD5 de:
    • La terminal es tu password.
    • En la última versión de la RFC se consideran opcionales tanto APOP como USER+PASS, pero se debe implementar una de las dos.

POP3: Ejemplo

wftA5c+nGCmsAAAAABJRU5ErkJggg==

2UYAFWYx3nAAAAAElFTkSuQmCC

POP3: seguridad

  • POP3S:
    • Reservado puerto 995 (se inicia negociación TLS inmediatamente después del establecimiento de conexión TCP), pero se desaconseja en la actualidad.
  • STLS:
    • Comando opcional introducido en RFC 2595.
    • Si se acepta, se inicia negociación TLS:
      C: STLS 
      S: +OK Begin TLS negotiation 
       
      ... 
      C: STLS 
      S: -ERR Command not permitted when TLS active 

IMAP4

RFC 1730 - Internet Message Access Protocol - Version 4

  • Última versión RFC 3501, diversas extensiones en RFCs 4466, 4469, 4551, 5032, 5182, 5738, 6186, 6858, 7817.
  • Sobre TCP, puerto 143.

Características:

  • Protocolo mucho más complejo que POP3.
  • Gracias al concepto de buzón, permite manejar los mensajes en el servidor y acceder al correo desde varias máquinas.
  • Gracias al concepto de ID único de mensaje, permite acceso simultáneo de varios clientes a un mismo buzón.
  • IMAP entiende MIME: permite descargar sólo una parte de un mensaje encapsulado MIME.

IMAP4: Buzones

  • Los mensajes están almacenados en buzones.
  • Buzón de entrada: INBOX.
  • El usuario puede crear y destruir buzones (en el servidor).

Respecto al nombre de los buzones:

  • Tienen que ser NVT ASCII.
  • Pueden estar jerarquizados:
    • Ejemplo: /salida/curas/reales
    • El carácter que separa los niveles de jerarquía puede ser cualquiera.
    • Ejemplo: “/” y “.”.
  • El comando LIST nos da la raíz o el carácter usado por el servidor.

El buzón puede tener los siguientes atributos:

  • \Noinferiors: no se tiene otros por debajo en la jerarquía.
  • \Noselect: no se puede seleccionar (con SELECT).
  • \Marked: tiene mensajes nuevos desde la última vez que se seleccionó.
  • \Unmarked: no tiene mensajes nuevos desde la última vez que se seleccionó.

IMAP4: Mensajes

  • Los mensajes tienen flags que indican el estado de un mensaje:
    • \Seen: leído.
    • \Answered: respondido.
    • \Flagged: marcado como importante.
    • \Deleted: marcado para borrado.
    • \Draft: mensaje en borrador.
    • \Recent: mensajes nuevos desde su llegada.

Dos formas de identificar un mensaje en un buzón (para leerlo, moverlo, etc.):

  1. Número secuencial:
  • Es el orden del mensaje en el buzón, de orden ascendente.
  • Cambia si se eliminan mensajes en el buzón.
  • Se utiliza para acceder a todos los mensajes de un buzón:
    Ejemplo: FETCH 1:10 BODY[HEADER] accede a los primeros 10 mensajes.
UID (identificador único del mensaje):
  • No cambia aunque se eliminen otros mensajes del buzón.
  • El UIDVALIDITY indica que no han cambiado los mensajes en el buzón.
    Ejemplo: FETCH 10 UID.

IMAP4: Comandos y respuestas (I)

  • Cuando el cliente se conecta, recibe un mensaje de bienvenida:
    • Puede ser OK, PREAUTH o BYE.
    • Ejemplo:
      S: OK varpa.it.uc3m.es IMAP4rev1 v1.264 server ready
  • A partir de entonces, cliente manda comandos:
    • Cada uno precedido de un identificador único llamado etiqueta (tag) y termina con .
  • El servidor manda respuestas:
    • Compuestas de:
      • Etiqueta del comando + OK, NO o BAD.
      • Respuesta opcional en una o varias líneas (depende del comando) de resultado que servirá para el cliente.
    • "server completion result": una línea con la etiqueta del comando, la respuesta de OK, NO o BAD, y el nombre del comando y un texto.
    • Ejemplo:
      C: a047 NOOP
      S: a047 OK NOOP completed

IMAP4: Comandos y respuestas (II)

  • No es necesario que el cliente espere la respuesta para enviar el siguiente comando.
    • Dos excepciones:
  1. Durante la fase de autenticación del comando AUTHENTICATE.
  2. Cuando se envía un string literal (cuando termina con {longitud}).
  • En estos casos se debe esperar un + del servidor para seguir mandando.

Si se manda algo antes de recibir +, se recibe respuesta BAD.

  • El servidor puede mandar las respuestas en distinto orden que los comandos (primero responder a un comando que se mandó después).
  • El servidor puede mandar respuestas que no responden a ningún comando (con etiqueta *).

IMAP4: Estados

  1. Conexión sin preautenticación (mensaje de bienvenida OK).
  2. Conexión con preautenticación (mensaje de bienvenida PREAUTH).
  3. Conexión rechazada (bienvenida BYE).
  4. Comando LOGIN o AUTHENTICATE.
  5. Comando CLOSE o SELECT con éxito.
  6. Comando CLOSE, o SELECT o EXAMINE fallidos.
  7. Comando LOGOUT.

IMAP4: Comandos

En estado no autenticado

Pág. 72

Para autenticarse:

  • LOGIN: envía login y password en claro.
    • Argumentos: .
    • "Server data": ninguna.
    • "Server completion result": OK o BAD.
    • Ejemplo:
      • C: a001 LOGIN SMITH SESAME
      • S: a001 OK LOGIN completed
  • Hay otros comandos para autenticarse (transparencia siguiente).
  • No es necesario autenticarse si el servidor en mensaje de bienvenida devolvió PREAUTH.
    • Ejemplo:
      • S: * PREAUTH IMAP4rev1 server logged in as Smith

Pág. 73

En estado no autenticado (II)

  • Hay otras formas de autenticarse además del comando LOGIN:
  • AUTHENTICATE: solicita al servidor un mecanismo de autenticación. Si el servidor no lo soporta, envía error.
    • Argumentos: .
    • "Server data": +.
    • Cliente manda continuación de datos.
    • "Server completion result": OK, NO o BAD.
    • Ejemplo:

8AVL6g9AAAAAElFTkSuQmCC

  • STARTTLS: negociación TLS.

IMAP4: Comandos

En estado autenticado (I)

  • SELECT: selecciona un buzón.
    • Argumentos: .
    • "Server data" (en cualquier orden):
      • FLAGS: flags definidos en el buzón.
      • EXISTS: número de mensajes en el buzón.
      • RECENT: número de mensajes nuevos.
      • OK [UNSEEN ]: posición del primer mensaje no leído.
      • OK [UIDVALIDITY ]: identifica el buzón en el cliente (valores únicos).
      • OK [UIDNEXT ]: UID asignado al siguiente mensaje nuevo.
    • "Server completion result": OK, NO o BAD.
      Ejemplo:

      vbnet
      Copiar código
      C: a001 SELECT INBOX 
      S: * 18 EXISTS 
      S: * 2 RECENT 
      S: * OK [UNSEEN 12] First unseen message 
      S: * OK [UIDVALIDITY 3857529045] UIDs valid 
      S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft) 
      S: * OK [PERMANENTFLAGS (\Deleted \Seen \*)] Limited 
      S: a001 OK [READ-WRITE] SELECT completed 
  • EXAMINE: como SELECT, pero abre el buzón en solo lectura.
  • LIST:
    • Argumentos: .
      • Si directorio es "" devuelve el delimitador de jerarquía y nombre del raíz.
      • En nombre significa cualquier cadena de caracteres.
    • "Server data":
      • LIST () "" .
    • "Server completion result": OK, NO o BAD.
      Ejemplo:

      vbnet
      Copiar código
      C: a001 LIST "" "*" 
      S: * LIST (\Noselect) "/" "" 
      S: * LIST () "/" "INBOX" 
      S: * LIST () "/" "foo" 
      S: * LIST () "/" "foo/bar" 
      S: a001 OK LIST completed 
  • Hay otra forma:
    • SUBSCRIBE: para suscribir un buzón a una lista de buzones que nos interesan.
    • UNSUBSCRIBE: para borrar un buzón de esa lista.
    • LSUB: como LIST pero solo de los buzones que nos interesan.
  • DELETE: borra un buzón.
    • Argumentos: .
    • "Server data": ninguno.
    • "Server completion result": OK, NO o BAD.
      Ejemplo:

      vbnet
      Copiar código
      C: a683 DELETE foo 
      S: a683 OK DELETE completed 
      C: a684 DELETE foo/bar 
      S: a684 NO Can't delete mailbox with inferior hierarchical names 
  • RENAME: cambia el nombre de un buzón.
    • Argumentos: .
    • "Server data": ninguno.
    • "Server completion result": OK, NO o BAD.
      Ejemplo:

      makefile
      Copiar código
      C: a682 RENAME foo blurdybloop 
      S: a682 OK RENAME completed 
  • Para crear buzones:
    • CREATE: crea un buzón.
      • Argumentos: .
        • Soporta jerarquía mediante /.
      • "Server data": ninguno.
      • "Server completion result": OK, NO o BAD.
        Ejemplo:

        makefile
        Copiar código
        C: A003 CREATE owatagusiam/ 
        S: A003 OK CREATE completed 
        C: A004 CREATE owatagusiam/blurdybloop 
        S: A004 OK CREATE completed 
  • Para preguntar datos de estado de un buzón:
    • STATUS:
      • Argumentos: .
        • Estado puede ser MESSAGES, RECENT, UIDNEXT, UIDVALIDITY, UNSEEN.
      • "Server data": * STATUS ().
      • "Server completion result": OK, NO o BAD.
        Ejemplo:

        makefile
        Copiar código
        C: A042 STATUS blurdybloop (UIDNEXT MESSAGES) 
        S: * STATUS blurdybloop (MESSAGES 231 UIDNEXT 44292) 
        S: A042 OK STATUS completed 
  • Para añadir un mensaje nuevo a un buzón:
    • APPEND:
      • Argumentos:
        • () (opcional)
        • (opcional)
      • "Server data": +.
      • A continuación el cliente manda el mensaje de la longitud indicada.
      • "Server completion result": OK, NO o BAD.
        Ejemplo:

        vbnet
        Copiar código
        C: A003 APPEND saved-messages (\Seen) {310} 
        S: + Ready for literal data 
        C: Date: Mon, 7 Feb 1994 21:52:25 -0800 (PST) 
        C: From: Fred FooBar  
        C: Subject: afternoon meeting 
        C: To: [email protected] 
        C: Message-Id:  
        C: MIME-Version: 1.0 
        C: Content-Type: TEXT/PLAIN; 
        C:  CHARSET=US-ASCII 
        C: 
        C: Hello Joe, do you think we can meet at 3:30 tomorrow? 
        C: 
        S: A003 OK APPEND completed 

IMAP4: Comandos

En estado seleccionado (I)

  • Todos los del estado autenticado, y además:
  1. Para buscar mensajes en el buzón:
  • SEARCH:
    • Argumentos: .
      • Ejemplo: SINCE, BEFORE, FROM, TO, CC, BCC, SUBJECT, TEXT, etc.
    • "Server data": * SEARCH ...
      • Devuelve 0 o más números de mensaje que cumplen el criterio de búsqueda.
    • "Server completion result": OK, NO o BAD.
      Ejemplo:

      sql
      Copiar código
      C: A282 SEARCH SINCE 1-Feb-1994 NOT FROM "Smith" 
      S: * SEARCH 2 84 882 
      S: A282 OK SEARCH completed 

      Otro ejemplo:

      vbnet
      Copiar código
      C: A283 SEARCH TEXT "string not in mailbox" 
      S: * SEARCH 
      S: A283 OK SEARCH completed 

      Otro ejemplo con combinaciones:

      vbnet
      Copiar código
      C: A284 SEARCH TEXT "c" HEADER.FIELDS (DATE FROM) 
      S: * SEARCH 23 
      S: A284 OK SEARCH completed 
Para descargarse un mensaje:
  • FETCH:
    • Argumentos: .
      • Ejemplo: FLAGS, RFC822, BODY, HEADER.FIELDS, etc.
    • "Server data":
      • El contenido del mensaje o del campo solicitado.
    • "Server completion result": OK, NO o BAD.
      Ejemplo:

      sql
      Copiar código
      C: A202 FETCH 2:4 (FLAGS BODY[HEADER.FIELDS (DATE FROM)]) 
      S: * 2 FETCH (FLAGS (\Deleted \Seen) BODY[HEADER.FIELDS (DATE FROM)] ...) 
      S: * 3 FETCH (FLAGS (\Deleted \Seen)) 
      S: A202 OK FETCH completed 
Para cambiar las flags de un mensaje (por ejemplo, marcarlo como borrado):
  • A005 STORE:
    • Argumentos: +FLAGS ().
    • "Server data": * FETCH .
    • "Server completion result": OK, NO o BAD.
      Ejemplo:

      makefile
      Copiar código
      C: A203 STORE 2 +FLAGS (\Deleted) 
      S: * 2 FETCH (FLAGS (\Deleted)) 
      S: A203 OK STORE completed 
  1. Para borrar permanentemente un mensaje marcado como \Deleted:
  • A006 EXPUNGE:
    • Argumentos: ninguno.
    • "Server data": EXPUNGE.
    • "Server completion result": OK, NO o BAD.
      Ejemplo:

      makefile
      Copiar código
      C: A202 EXPUNGE 
      S: * 2 EXPUNGE 
      S: * 3 EXPUNGE 
      S: A202 OK EXPUNGE completed 
Para copiar un mensaje en el buzón:
  • COPY:
    • Argumentos: .
    • "Server data": ninguno.
    • "Server completion result": OK, NO o BAD.
      Ejemplo:

      makefile
      Copiar código
      C: A003 COPY 2:4 MEETING 
      S: A003 OK COPY completed 
Para usar el UID de un mensaje:
  • UID:
    • UID SEARCH para obtenerlo.
    • UID COPY / FETCH / STORE para acceder al mensaje por su UID.
      Ejemplo:

      makefile
      Copiar código
      C: A003 UID FETCH 4827314:4828442 (FLAGS) 
      S: * 23 FETCH (FLAGS (\Seen) UID 4827314) 
      S: * 24 FETCH (FLAGS (\Recent) UID 4828442) 
      S: A003 OK UID FETCH completed 
Para cerrar un buzón:
  • CLOSE:
    • Argumentos: ninguno.
    • "Server data": ninguno.
    • "Server completion result": OK o BAD.
      Ejemplo:

      makefile
      Copiar código
      C: A341 CLOSE 
      S: A341 OK CLOSE completed 
  • Nota:
    Cuando se hace un SELECT, EXAMINE o LOGOUT, se hace automáticamente un CLOSE.

IMAP4: Comandos

En cualquier estado

  1. CAPABILITY: para solicitar al servidor funciones que soporta.
  • Argumentos: ninguno.
  • "Server data": * CAPABILITY .
  • "Server completion result": OK o BAD.
    Ejemplo:

    makefile
    Copiar código
    C: A001 CAPABILITY 
    S: * CAPABILITY IMAP4rev1 STARTTLS AUTH=GSSAPI LOGINDISABLED 
    S: A001 OK CAPABILITY completed 
NOOP: no hace nada (suele resetear timer de inactividad).
  • Argumentos: ninguno.
  • "Server data": puede devolver información de estado del servidor.
  • "Server completion result": OK o BAD.
    Ejemplo:

    makefile
    Copiar código
    C: A002 NOOP 
    S: * 21 EXISTS 
    S: * 2 RECENT 
    S: * 1 FETCH (FLAGS (\Seen \Deleted)) 
    S: A002 OK NOOP completed 
LOGOUT: solicita finalizar la conexión.
  • Argumentos: ninguno.
  • "Server data": * BYE.
  • "Server completion result": OK o BAD.
    Ejemplo:

    makefile
    Copiar código
    C: A023 LOGOUT 
    S: * BYE IMAP4rev1 Server logging out 
    S: A023 OK LOGOUT completed 

mOKqSwzlz+gAAAABJRU5ErkJggg==

wOvUptVH11ixwAAAABJRU5ErkJggg==

IMAP4: Seguridad

  • Comando AUTHENTICATE:
    • Permite evitar mandar la información de autenticación en claro.
    • Varios mecanismos soportados (versiones 4, GSSAPI, S/Key).
    • El resto de la sesión IMAP sí va en claro.
  • IMAPS:
    • Reservado puerto 993 (se inicia negociación TLS inmediatamente después de establecimiento de conexión TCP), pero se desaconseja en la actualidad.
  • Comando STARTTLS:
    • RFC 2595.
    • Este comando inicia la negociación TLS.
    • Con una respuesta CAPABILITY LOGINDISABLED, el servidor puede indicarnos que es indispensable hacer STARTTLS antes de usar el comando LOGIN.

Ejemplo:

makefile

Copiar código

C: a001 CAPABILITY 
S: * CAPABILITY IMAP4rev1 STARTTLS LOGINDISABLED 
S: a001 OK CAPABILITY completed 
C: a002 STARTTLS 
S: a002 OK Begin TLS negotiation now 
 
C: a003 CAPABILITY 
S: * CAPABILITY IMAP4rev1 AUTH=EXTERNAL 
S: a003 OK CAPABILITY completed 
C: a004 LOGIN joe password 
S: a004 OK LOGIN completed 


  WORLD WIDE WEB

                            Referencias

• Referencia principal:

   – Ilya Grigorik. "High Performance Browser Networking". O'Reilly. 2013. +

     Ilya Grigorik: “HTTP/2: A New Excerpt from High Performance Browser

     Networking”, O’Reilly 2015.

       • Disponibles online en https://hpbn.co/

• Referencias adicionales:

   – “Internet Infrastructure: Networking, Web Services and Cloud

     Computing”, Richard Fox and Wei Hao, CRC Press, 2017. (Capítulos 7

     y 8).

   – “Computer Networking: A Top-Down Approach Featuring the Internet”,

     8th Ed. J.F. Kurose and K. W. Ross. Pearson. 2021. (Capítulo 2.2).

   – “Computer Networks”, (5th Ed.). A. S. Tanenbaum and D. J. Wetherall.

     Prentice Hall, 2011. (Capítulo 7.3).

   – “Computer networks: an open source approach” Y.-D. Lin, R.-H.

     Hwang, F Baker. McGraw-Hill, 2012. (Capítulo 6.4).

   – https://developer.mozilla.org/en-US/docs/Web/HTTP.

   – RFCs.

                                               Pág. 3

                            Índice

• Introducción.

• La URL.

• Descripción general de HTTP.

• HTTP/0.9.

• HTTP/1.0.

• HTTP/1.1.

• HTTP/2.

• Evolución hacia HTTP/3.

• Redes de distribución de contenidos (CDN).

• Contenidos: HTML y aplicaciones web.

                                                                          Pág. 4

                         Introducción

• World Wide Web (Tela de Araña Mundial)

   – Web:

       • “Tela de araña” de documentos (“páginas”) con referencias (“enlaces”)

         a otros documentos.

       • Hipertexto.

   – World Wide:

       • Páginas en cualquier lugar del mundo.

       • A un “click” de distancia.

• Una página web consta de objetos, cada uno de los cuales se

  puede almacenar en diferentes servidores web.

   – Cada objeto puede ser un archivo HTML, una imagen JPEG, un

     subprograma Java, un archivo de audio,…

   – La página web consta de un archivo HTML base que incluye varios

     objetos referenciados, cada uno direccionable por una URL, por

     ejemplo:

       • https://www.google.com/images/branding/googlelogo/1x/googlelogo_co

         lor_272x92dp.png

                                                                            Pág. 5

                          Introducción

• Estándares que soportan el servicio web:

   – Uniform Resource Locators (URL)

       • Identifica la localización de un recurso (objeto o servicio de la red).

   – Hypertext Transfer Protocol (HTTP)

       • Protocolo de transferencia de hipertexto (y de otros recursos web).

       • Define el formato de los mensajes que se intercambian clientes y

         servidores web.

       • Es un protocolo petición-respuesta y sin estado.

       • Cliente-servidor.

   – Hypertext Markup Language (HTML)

       • Estándar para representar documentos de hipertexto en formato

         ASCII.

       • HTML es un derivado de un lenguaje de marcado más general,

         Standard Generalized Markup Language (SGML)

       • Permite especificar formato, referencias, enlaces, etc.

                                                                                   Pág. 6

                                          La URL

•   Localizador de recursos universal (Universal Resource Locator).

     – RFC 1738, 1808. Mecanismos URI en RFC 3986.

     – Utilizado para identificar recursos web (o en general en la red, pudiendo acceder

       a ellos con distintos protocolos).

•   Sintaxis:

     – protocolo://:@servidor:puerto/ruta/nombre_de_archivo?querys

       tring#fragmento

     – Ejemplo: https://www.it.uc3m.es/docencia/docencia.htm

•   Contiene información sobre:

     – Cómo puede accederse el recurso.

     – Dónde está el recurso.

     – Cómo se llama el recurso.

•   El protocolo suele ser http o https, pero hay más, por ejemplo ftp, file, mailto,

    sip, rtsp, etc:

          •   ftp://ftp.rediris.es/ftp/docs/network/rfc/17xx/1738

          •   ftp://pedro:[email protected]/vilma.gif

          •   file:///usr/local/images/gif/jazz.gif

          •   mailto:[email protected]

          •   sip:[email protected]

          •   rtsp://media.example.com:554/twister/audiotrack

                                                                           Pág. 7

                                   La URL

•   Muchas partes la URL pueden no estar presentes:

    protocolo://:@servidor:puerto/ruta/nombre_archivo?querystri

    ng#fragmento

    – Si no hay servidor, se entiende que es la propia máquina.

    – Si no hay puerto, se entiende el puerto por defecto del protocolo.

    – Si no hay ruta, el recurso estará en el nivel DocumentRoot del servidor.

    – Si no hay un nombre de archivo, la solicitud es para un archivo de índice

       (por ejemplo, index.html) o para mostrar el directorio.

    – querystring se utiliza para hacer consultas a una base de datos.

    – El fragmento se usa para indicar una etiqueta en el documento

       html.

•   Las URL pueden ser:

    – Absolutas (completas):

        • Contienen todas las partes.

        • Ejemplo: http://www.ietf.org/meetings/meetings.html

    – Parciales:

        • Sólo contienen el camino local del recurso.

        • Ejemplo: /instructions/meeting_materials.html

                                                                  Pág. 8

         Descripción general de HTTP

• HTTP: HyperText Transfer Protocol.

   – Protocolo de transferencia no sólo de hipertexto.

• Protocolo de nivel de aplicación en el que se basa la web.

• Cliente/servidor:

   – Cliente: navegador que solicita, recibe (mediante el protocolo

     HTTP) y "muestra" objetos web.

       • Hay otros clientes HTTP, programas como robots, arañas

         (“spiders”), rastreadores (“crawlers”)…

   – Servidor: el servidor web envía (mediante el protocolo HTTP)

     objetos en respuesta a las solicitudes.

   – Puede haber sistemas intermedios (proxies).

                                                                                                      Pág. 9

            Descripción general de HTTP

•   Inventado por Tim Berners-Lee entre los años 1989-1991.

     – En 1989, mientras trabajaba en el CERN, Tim Berners-Lee escribió una

       propuesta para desarrollar un sistema de hipertexto sobre Internet.

         • Inicialmente lo llamó: 'Mesh' (malla, en inglés).

         • Posteriormente se renombró como World Wide Web (red mundial), durante su

           implementación en 1990.

         • Desarrollado sobre los protocolos existentes TCP e IP, está basado en cuatro bloques:

              – Un formato de texto para representar documentos de hiper-texto: HyperText Markup Language

                (HTML).

              – Un protocolo sencillo para el intercambio de esos documentos, del inglés: HypertText Transfer

                Protocol (HTTP) : protocolo de transferencia de hiper-texto.

              – Un cliente que muestre (e incluso pueda editar) esos documentos. El primer navegador Web,

                llamado: WorldWideWeb.

              – Un servidor para dar acceso a los documentos, una versión temprana: httpd (http daemon)

     – Los primeros servidores estaban ya funcionando fuera del CERN a principios del

       1991.

     – El 6 de Agosto de 1991 se considera actualmente como el inicio oficial de la

       Web como proyecto público.

     – La versión del protocolo HTTP usada en aquel momento, era realmente muy

       sencilla, posteriormente pasó a HTTP/0.9, referido algunas veces, como el

       protocolo de una sola línea.

     – HTTP ha evolucionado, desde un protocolo destinado al intercambio de archivos

       en un entorno de un laboratorio semi-seguro, al actual uso es Internet, con

       intercambio de imágenes, vídeos en alta resolución y en 3D.

                                                                     Pág. 10

         Descripción general de HTTP

• Versiones del protocolo HTTP:

   – 1991: versión inicial del protocolo (conocida como HTTP/0.9).

   – 1996: HTTP/1.0: RFC 1945 (RFC informativa).

   – 1997: HTTP/1.1: RFC 2068.

       • Revisiones:

       • 1999: RFC 2616.

       • 2014: RFC 7230-7235.

   – HTTPS:

       • 1994: SSL.

       • 1999: TLS 1.0 RFC 2246.

       • 2000: RFC 2818

   – HTTP/2:

       • 2010: SPDY

       • 2015: HTTP/2 RFC 7540.

   – HTTP/3:

       • 2022: RFC 9114.

                                                                                              Pág. 11

             Descripción general de HTTP

•   HTTP usa TCP:

     – El cliente inicia la conexión TCP con el servidor, puerto 80.

          • HTTPS (versión segura): puerto 443 sobre TLS.

     – En HTTP/3 cambia TCP por el protocolo de transporte QUIC.

•   Los mensajes del protocolo HTTP (peticiones/respuestas) son:

     – ASCII en versión HTTP/1.1 o inferior.

     – Binarios en versiones HTTP/2 y siguientes.

•   HTTP es "sin estado“.

     – El servidor no mantiene información sobre solicitudes anteriores de clientes.

          • Los protocolos que mantienen el "estado" son más complejos (si el servidor o cliente

            falla, sus puntos de vista del "estado" pueden ser inconsistentes, deben reconciliarse,

            esto añade complejidad).

•   Conexiones TCP no persistentes en HTTP/1.0 e inferiores

     – Como máximo un objeto enviado en una conexión TCP.

     – Descargar varios objetos requiere múltiples conexiones.

•   A partir de HTTP/1.1 las conexiones son por defecto persistentes.

     – Se pueden enviar varios objetos a través de una única conexión TCP entre el

       cliente y ese servidor.

                                                                                  Pág. 12

      HTTP/0.9: El protocolo de una línea

•   La versión inicial de HTTP, no tenía número de versión; aunque posteriormente

    se la denominó 0.9 para distinguirla de las versiones siguientes.

•   HTTP/0.9 es un protocolo extremadamente sencillo:

     – Petición consiste simplemente en una única línea, que comienza por el único

       método posible GET, seguido por la dirección del recurso a pedir (no la URL, ya

       que tanto el protocolo, el servidor y el puerto, no son necesarios una vez ya se

       ha conectado al servidor).

          GET /miPaginaWeb.html\r\n

     – La respuesta también es muy sencilla: solamente consiste el archivo pedido.


          Una pagina web muy sencilla


     – Únicamente es posible transmitir archivos HTML, y ningún otro tipo de archivos

     – Tampoco había información del estado ni códigos de error: en el caso un

       problema, el archivo HTML pedido, era devuelto con una descripción del

       problema dentro de él, para que una persona pudiera analizarlo.

•   Una petición/respuesta por conexión.

•   Al contrario que las posteriores versiones, no usa cabeceras.

                                                         Pág. 13

                   HTTP/0.9: Ejemplo

          telnet www.uc3m.es 80

          Trying 176.58.10.138...

          Connected to www.uc3m.es.

          Escape character is '^]'.

Petición  GET /

Respuesta /p>

          Transitional//EN"

          "http://www.w3.org/TR/html4/loose.dtd">



UC3M

          (...Respuesta HTML...)


         Connection closed by foreign host.

                                                                 Pág. 14

                           HTTP/1.0

• RFC 1945 (1996).

   – Es informativa.

• Funcionamiento similar a HTTP/0.9:

   –   Una transacción (petición, respuesta) por conexión TCP.

   –   Petición y respuesta NVT ASCII.

   –   Líneas terminadas en .

   –   El formato de las peticiones y respuestas es más elaborado, con

       cabeceras que refinan datos sobre lo que envían el cliente y el

       servidor.

                                                           Pág. 15

                       HTTP/1.0: Ejemplo

            ~>telnet website.org 80

            Connected to xxx.xxx.xxx.xxx

            GET /rfc/rfc1945.txt HTTP/1.0

Petición

            User-Agent: CERN-LineMode/2.15 libwww/2.17b3

            Accept: */*

            HTTP/1.0 200 OK

Respuesta

            Content-Type: text/plain

            Content-Length: 137582

            Expires: Thu, 01 Dec 1997 16:00:00 GMT

            Last-Modified: Wed, 1 May 1996 12:45:26 GMT

            Server: Apache 0.84

            (plain-text response)

            (connection closed)

                                                            Pág. 16

         HTTP/1.0: Funcionamiento (I)

• Formato de petición:

   – Línea de petición:

      GET /rfc/rfc1945.txt HTTP/1.0

      • Método de la petición:

          –   GET: devuelve el documento solicitado.

          –   HEAD: devuelve la cabecera del documento.

          –   POST: manda datos al documento.

          –   Opcionales para publicación de páginas

                • PUT: reemplaza los datos del documento.

                • DELETE: borra el documento indicado.

                • LINK, UNLINK: crea/destruye enlaces.

      • URL (normalmente parcial, absoluta con proxys).

      • Versión del protocolo HTTP (HTTP/1.0).

      (sigue)

                                                                    Pág. 17

     HTTP/1.0: Funcionamiento (II)

• 0, 1 ó más líneas de cabecera:

   – Formato Identificador: valor

   – De tres tipos: generales / de entidad / de petición

   – En peticiones en las que se manda datos obligatoria Content-

     Length, recomendable Content-Type.

   – Resto opcionales.

• Línea en blanco ()

• Datos binarios (opcional, sólo en POST y PUT)

• Ejemplo:

   GET /path/file.html HTTP/1.0

   From: [email protected]

   User-Agent: HTTPTool/1.0

   [línea en blanco]

                                                                  Pág. 18

    HTTP/1.0: Funcionamiento (III)

– Petición con método POST:

   • Pensado para enviar datos de entrada a un programa en el

     servidor identificado por la URL (CGI script)

   • El cuerpo de la petición contiene los datos de entrada del

     programa.

   • Obligatoria la cabecera Content-Length en la petición.

   • La respuesta puede opcionalmente incluir datos, por ejemplo la

     salida del programa

   • Ejemplo de petición POST:

       POST /path/script.cgi HTTP/1.0

       From: [email protected]

       User-Agent: HTTPTool/1.0

       Content-Type: application/x-www-form-urlencoded

       Content-Length: 32

       home=Cosby&favorite+flavor=flies

                                                               Pág. 19

   HTTP/1.0: Funcionamiento (V)

– Ejemplo de respuesta:

   HTTP/1.0 200 OK

   Date: Fri, 31 Dec 1999 23:59:59 GMT

   Content-Type: text/html

   Content-Length: 1354



Happy New Millennium!

   (more file contents)...



                                                                      Pág. 21

     HTTP/1.0: códigos de respuesta (I)

• 2XX Éxito:

   – 200 OK: Se encontró el URL. Sigue su contenido.

   – 201 Created: Un URL fue creado en respuesta a POST. Sigue su

     nombre.

   – 202 Accepted: Petición aceptada para una modificación tardía.

   – 203 Partial Information: Información no oficial (anotaciones).

   – 204 No response: Petición resuelta con éxito, pero no hay información

     que buscar.

• 3XX Redirección:

   – 301 Moved: El URL se ha movido de forma permanente a un nuevo

     sitio.

   – 302 Found: El URL se ha encontrado de forma temporal en un nuevo

     sitio.

• 4XX Error en el cliente:

    –   400 Bad request: Error de sintaxis en la petición.

    –   401 Unauthorized: Usado en esquemas de autentificación.

    –   402 Payment Required: Usado en un futuro sistema de tarifas.

    –   403 Forbiddden: No hay autorización de acceso.

    –   404 Not Found: El URL no está aquí

• 5XX Error en el servidor:

    –   500 Internal Error: Condición de error no esperada.

    –   501 Not Implemented: Usado para aspectos no implementados.

    –   502 Service Overloaded: Servidor sobrecargado temporalmente

    –   503 Gateway Timeout: El servidor estaba trayendo datos de otro sitio

        cuando falló el servicio remoto.

              HTTP/1.0: cabeceras (I)

• Cabeceras generales:

   – Date: Hora actual(GMT). OBLIGATORIA

   – Pragma: Directivas diversas. Define sólo el valor no-cache.

• Cabeceras de entidad:

   – Last-Modified: Fecha última actualización.

   – Expires: Fecha en la que expira el documento.

   – Content-Length: Longitud en bytes de los datos. OBLIGATORIA

   – Content-Type: Tipo MIME de los datos.

   – Content-Encoding: Método de compresión de datos.

   – Content-Language: Lenguaje en que esta escrito el

     documento.

   – Allow: Peticiones que el usuario puede hacer (como GET).

                                                            Pág. 24

            HTTP/1.0: cabeceras (II)

• Cabeceras de petición:

   – From: Dirección e-mail del usuario.

   – User-Agent: Nombre y versión del cliente.

   – Accept: Tipo de fichero que acepta el cliente.

   – Referer: URL del último documento visitado.

   – Authorization: Usado en diversos esquemas de

     autentificación.

   – If-Modified-Since: Sólo devuelve el documento si fue

     modificado después de la fecha especificada.

• Cabeceras de respuesta:

   – Server: Nombre y versión del servidor.

   – WWW-Authenticate: Usado en esquemas autenticación.

   – Location: Para redirección automática

-accept lenguaje: lenguajes q acepta cliente

-accept-encoding: codific q acepta cliente

-accept-charset: caracteres que acepta cliente

-keep-alive: tiempo q espera nuevas peticiones en la misma conexión

Connection: indicar comportamiento en la conexion

                                                                             Pág. 25

                         HTTP/1.0: Ejemplo

            ~>telnet www.it.uc3m.es 80

            Trying 163.117.139.130...

            Connected to bajo.it.uc3m.es.

            Escape character is '^]'.

Petición    GET / HTTP/1.0

            HTTP/1.0 200 OK

Respuesta   Date: Thu, 04 Nov 1999 12:24:38 GMT

            Server: Apache/1.0.0

            Content-type: text/html

            Content-length: 2248

            Last-modified: Tue, 28 Sep 1999 08:18:14 GMT





            Connection closed by foreign host.

            ~>

                                                                        Pág. 26

                         HTTP/1.0: Ejemplo

            ~>telnet www.w3.org 80

            Trying 18.29.1.22...

            Connected to www.w3.org.

            Escape character is '^]'.

Petición    GET /hypertext/WWW/TheProject.html HTTP/1.0

            HTTP/1.0 301 Moved Permanently

Respuesta   Date: Thu, 04 Nov 1999 12:17:23 GMT

            Server: Apache/1.3.6 (Unix) PHP/3.0.11

            Location: http://www.w3.org/TheProject.html

            Content-Type: text/html

            Content-length: 237



301 Moved Permanently

Moved Permanently

            The document has moved

                HREF="">here

.


            Connection closed by foreign host.

       HTTP/1.1

•   RFC 2616 (1999).

     –   Completada en RFCs 2817, 5785, 6266, 6585.

•   Multitud de nuevas cabeceras (de 16 en HTTP/1.0 a 46 en HTTP/1.1).

•   Los servidores deben ser compatibles con peticiones HTTP/1.0.

•   Métodos: GET, HEAD, POST, PUT, DELETE, OPTIONS, TRACE, CONNECT

     – Deben soportar al menos los métodos GET y HEAD.

     – Nuevos métodos de petición opcionales:

           •   OPTIONS: para determinar capacidades del servidor.

           •   TRACE: para trazar reenvío de HTTP a través de proxys, túneles...

           •   CONNECT: reservado para usarse con proxys que puedan cambiar de túnel (por ejemplo

               SSL).

•   Cambios más importantes:

     –   Cabecera Date: obligatoria en respuestas.

     –   Cabecera Host: obligatoria en peticiones.

     –   Gestión de conexiones (conexiones persistentes)

     –   Optimización de BW

     –   Datos "troceados"

     –   Caching

     –   Seguridad

     –   Negociación de contenidos

     –   Extensibilidad

     –   Otros

                                                                        Pág. 48

   HTTP/1.1: Cabecera Date: en respuestas

• En HTTP/1.1 la Cabecera Date: es obligatoria en las

  respuestas.

      HTTP/1.1 200 OK

      Date: Tue, 13 Feb 2020 08:31:50 GMT

      Content-Length: 34141

      Content-Type: text/html; charset=utf-8

   – Excepciones:

      • En repuestas 100 (las veremos después).

      • En respuestas 5xx (error en el servidor).

      • Si el servidor no tiene reloj. En este caso no puede enviar en las

        respuestas las cabeceras Expires o Last- Modified

         HTTP/1.1: Gestión de conexiones (II)

•   Ejemplo:

     telnet www.it.uc3m.es 80

     Trying 163.117.139.115...

     Connected to contrabajo.it.uc3m.es.

     Escape character is '^]'.

     GET / HTTP/1.1

     Host: www.it.uc3m.es:80

     HTTP/1.1 200 OK

     Date: Tue, 16 Feb 2021 14:44:52 GMT

     Server: Apache/2.2.22 (Debian)

     Last-Modified: Mon, 23 Nov 2020 15:50:49 GMT

     ETag: "607f3-40c8-5b4c8287f6279"

     Accept-Ranges: bytes

     Content-Length: 16584

     Vary: Accept-Encoding

     Content-Type: text/html

     Content-Language: es


     […]


     [la conexión se mantiene abierta]

                                               Pág. 52

   HTTP/1.1: Gestión de conexiones (III)

GET / HTTP/1.1

Host: www.it.uc3m.es:80

Connection: close

HTTP/1.1 200 OK

Date: Tue, 16 Feb 2021 14:44:54 GMT

Server: Apache/2.2.22 (Debian)

Last-Modified: Mon, 23 Nov 2020 15:50:49 GMT

ETag: "607f3-40c8-5b4c8287f6279"

Accept-Ranges: bytes

Content-Length: 16584

Vary: Accept-Encoding

Connection: close

Content-Type: text/html

Content-Language:

Entradas relacionadas: