jueves, 3 de noviembre de 2016

TCP/IP (2): Funcionamiento básico

Entradas de la serie -> TCP/IP
El libro clásico e imprescindible.

FUNCIONAMIENTO BÁSICO
1) EL NIVEL TCP
TCP (Protocolo de Control de Transmisiones) se encarga de:
  • Dividir el mensaje en datagramas.
  • Reenviar los datagramas que se pierdan.
  • Reensamblarlos en su orden correcto.
El tamaño máximo del datagrama se establece al iniciar la conexión. La forma más fácil de hacerlo es que cada extremo indique el datagrama mayor que es capaz de manejar, eligiéndose el menor de ellos.
TCP deja en manos de IP un datagrama y su destinatario, siendo trabajo de éste último su transmisión. Usa un mecanismo llamado demultiplexación, que consiste en que cada datagrama "sabe" a qué conexión pertenece gracias a la información contenida en una serie de cabeceras, que se van conteniendo unas a las otras, a medida que va pasando por las manos de los diferentes protocolos y niveles.
La CABECERA TCP tiene los siguientes campos:
Cabecera TCP

Su significado es el siguiente:
  • Puertos (ports) de origen y destino: Son números que identifican cada "conversación" que mantiene un mismo nodo. Gracias a esta diferenciación, una misma máquina puede estar enviando y recibiendo varios flujos de información al mismo tiempo sin mezclarse. Un datagrama tiene que saber a qué número de puerto pertenece en origen y a cuál en destino. Una conexión es identificada unívocamente por los dos pares dirección IP/puerto TCP de origen y destino.
  • Número secuencial (sequence number): Sirve para mantener el orden de los datagramas, y así poder reordenarlos en destino. No se numeran los datagramas, sino los octetos transmitidos. P.e. si el tamaño del datagrama es 500, el primero se numera 0, el segundo 500, el tercero 1000, y así sucesivamente.
  • Checksum: La suma de todos los octetos del datagrama sirve para el control de errores.
  • Número de acuse de recibo (acknowledgement): Por cada datagrama recibido, el destinatario devuelve un datagrama con el número de confirmación, que es el número secuencial del que acaba de recibir. Si en origen no se recibe confirmación de un determinado datagrama en un tiempo razonable, se reenvía.
  • Desplazamiento al área de datos (HLEN): Indica al mismo tiempo el tamaño de la cabecera y el desplazamiento (offset), medido en múltiplos de 32 bits, hacia el lugar donde empiezan los datos. Este campo ocupa sólo tres bits.
  • Banderas de operación (Code bits): Estos seis bits diferencian entre varios tipos de datagramas (datos, asentimientos, solicitud de conexión, etc.)
  • Ventana (Window): Indica la cantidad de información que es capaz de absorber de golpe el destinatario, en forma de un número de 16 bits. El nodo origen sabe así cuántos datagramas seguidos puede enviar sin recibir confirmación. Se suele usar el mismo datagrama que el del número de confirmación, de tal manera que, a medida que se van confirmando los datagramas, el nodo origen va sabiendo la cantidad de información que puede ir enviando.
  • Puntero de urgencias (Urgent pointer): Cuando se envían órdenes de interrupción, o cualquier otra información que deba atenderse de inmediato, este puntero señala el lugar donde se encuentra, de manera que se salte inmediatamente a ella. Se usa en eventos asíncronos. Una de las banderas de operación se activa en estos casos.
  • El campo de opciones es de tamaño variable, rellenándose hasta ocupar 32 bits.
2) EL NIVEL IP
El trabajo de IP consiste únicamente en encontrar el camino y enviar el datagrama. No se preocupa ni de la información que contiene, ni de la cabecera TCP, ni de su relación con otros datagramas. Sólo tiene que saber la dirección IP a la que debe enviarlo. IP añade su propia cabecera, que contiene información que servirá a los gateways y otros sistemas que el datagrama vaya encontrando por el camino. Su formato es el de la figura.
Cabecera IP
El significado de los campos es:
  • Versión (VERS, 4 bits): Identifica la versión del protocolo IP que se utilizó para generar el datagrama. Así se evita que los equipos puedan malinterpretar el contenido de los campos al cambiar de estándar. La versión que mostramos aquí es la 4.
  • Longitud del encabezado (IHL o HLEN, 4 bits): Está medida en palabras de 32 bits. El formato más común es el de 5 palabras (el de la figura), pero puede aparecer opcionalmente una palabra más, llamada opciones IP. Si las opciones que se incluyen no completan 32 bits, se pone un campo de relleno.
  • Tipo de servicio (TOS, 8 bits): Especifica cómo debe manejarse el datagrama. Tiene subcampos que indican la prioridad y el grado de confiabilidad, retardo y capacidad que se requieren para la entrega de el datagrama. Se debe entender esta solicitud como simples indicaciones para los algoritmos de ruteo que ayuden para la selección de una ruta entre varias posibles. Una red de redes nunca garantiza el tipo de servicio solicitado.
  • Longitud total (16 bits): La longitud del datagrama, incluídos la cabecera y los datos. Los 16 bits de este campo limitan la longitud máxima posible de un datagrama IP a 65535 bytes.
  • Identificador (16 bits): Es un número entero que sirve para identificar los trozos de un datagrama fragmentado. Todos los trozos de un datagrama determinado tienen el mismo identificador.
  • Direcciones de origen y destino (Source and destination addresses): Son las direcciones IP (32 bits) de los nodos de origen y de destino. La primera sirve para que el destinatario reconozca el origen del datagrama; la segunda para el posible reenvío por gateways intermedias.
  • Número de protocolo (Protocol number): Identifica el protocolo de alto nivel que ha generado el datagrama. Éste suele ser TCP, pero, como ya se ha explicado, IP puede trabajar para diferentes protocolos, o incluso directamente con las aplicaciones. Este campo, básicamente sirve para que el receptor pueda interpretar correctamente el formato de la información que va encapsulada en el área de datos del datagrama.
  • Checksum (16 bits): Suma para control de errores. El propio campo checksum no entra en la suma (se toma como cero). IP y TCP tienen cada uno su propio checksum, que les permite realizar más eficientemente el control de errores. De hecho, el checksum IP sólo computa los campos de la cabecera IP, y deja a los protocolos de alto nivel la tarea de mantener su propio cómputo.
  • Indicadores y offset de fragmento (Flags and fragment offset): Cuando, en su recorrido, un datagrama se divide en varios fragmentos, estos campos permiten recomponerlo correctamente. Esto suele ocurrir cuando atraviesa redes que no pueden manejar datagramas de su tamaño.
  • Tiempo de vida (Time to live): Es un contador (en segundos) que se va decrementando a medida que pasa por diferentes sistemas. Cuando llega a cero, se considera que ha entrado en un bucle, y se descarta. Esto no es normal que llegue a ocurrir, pero se implementa esta protección para asegurar cualquier tipo de contingencia.
El protocolo establece específicamente el orden de los bits. Esto es importante, porque en una red de redes formada por millones de ordenadores, hay diferentes formas de representar internamente los números binarios. En general hay dos formas de hacerlo, con el octeto menos significativo en la dirección más baja de memoria, o bien con el octeto más significativo primero. Como la cabecera de los paquetes que se transmiten en la red contiene valores binarios que hay que interpretar correctamente, se ha de imponer un estándar, y dejar a cada nodo la tarea de reconvertirlo a su representación interna.
En los protocolos TCP/IP se ha establecido la norma de transmitir primero los bits más significativos (big endian).
Cuando se reciben los paquetes en destino, las diferentes capas deben actuar a la inversa, desmontando sus cabeceras, y reordenando paquetes y datagramas. El proceso que se sigue es el siguiente:
Nivel IP:
* Elimina la cabecera IP, comprobando el checksum.
* Según el número de protocolo, le pasa el datagrama a TCP, u otro al que le corresponda.
Nivel TCP:
* Elimina la cabecera TCP, comprobando el checksum.
* Retorna datagramas de confirmación aceptando o rehusando los diferentes datagramas.
* Reoganiza el mensaje según el orden marcado por los números de secuencia.

4) EL NIVEL DE APLICACION
Mientras que los protocolos básicos que se han visto se encargan de la transmisión, encaminamiento y reconstrucción de los mensajes, los protocolos de aplicación son los que permiten al usuario abrir conexiones remotas, pedir ficheros, enviar correo electrónico, etc.
Los niveles básicos que hemos visto se encargan de las tareas de transporte de los datos, proporcionando al nivel de aplicación una corriente de bytes, para que las aplicaciones la utilicen como si se tratara de una línea telefónica o un terminal.
Establecimiento de la conexión
La mayoría de los sistemas tienen programas especializados que actúan de servidores a la llamada de sistemas remotos (FTP, mail, etc.). Cuando un sistema se conecta con otro, necesita alguna manera de especificar con qué servidor quiere hablar. Para ello se establecen los llamados accesos predeterminados (well-known sockets), que no son más que determinados números de puerto que se reservan para cada servidor. Así, p.e., el puerto 21 se reserva siempre para el servidor FTP. Si existen varias conexiones FTP simultáneas, sólo se diferencian por el par dirección IP/puerto de destino (de cada máquina remota conectada), siendo el mismo puerto (el 21) en el servidor. El puerto asignado por la máquina remota no está predeterminado, y siempre será diferente a cualquier otro que tenga esa misma máquina en conexión. Generalmente, elegirá un número aleatorio superior a 1024 (es lo que se llama puerto anónimo). El servidor pedirá siempre a la máquina remota que escoja e identifique el puerto que está usando.
Las direcciones IP están en la cabecera IP, mientras que los puertos están en la cabecera TCP. Estos cuatro números en conjunto sirven para identificar unívocamente el datagrama.
Intercambio de comandos y datos
Una vez establecida la conexión, existen tres formas de trabajar a nivel de aplicación:
a) Una vez las máquinas se han identificado mutuamente y han asignado los correspondientes puertos, el nivel de aplicación comienza a funcionar intercambiando mensajes que pueden ser comandos (palabras humanas al estilo de los lenguajes de programación), o bien datos. Los datos y los comandos se diferencian sólo por el contexto. El receptor sabe que lo que está recibiendo son datos porque el último comando que vió fue "Comienza el envío de datos". Una marca especial localiza el final de los datos (p.e., en mail se usa un punto al comienzo de una línea).
b) Algunas aplicaciones (como FTP) usan conexiones diferentes para datos y para comandos. En el momento en que FTP comienza a transferir un fichero, abre una conexión con nuevos números de puerto, dejando activa la anterior para permitir que se envíen comandos mientras dure la transmisión (p.e. para abortarla).
c) Las aplicaciones de tipo terminal (como telnet) establecen una sóla conexión donde, por defecto, se envían datos. Un carácter especial sirve para "incrustar" comandos tras él. Si este carácter se llegara a teclear en la terminal, se enviaría dos veces para así dejar claro que no se trata de un comando.
Un trabajo fundamental que debe hacer el nivel de aplicación es adaptar las particularidades de los sistemas (códigos, saltos de línea, etc.), para así permitir el intercambio de información entre sistemas diferentes. TCP e IP no se preocupan de ello, sólo envían octetos tal y como se los proporcionan. Los estándares establecidos marcan las conexiones tipo para cada aplicación, de tal manera que siempre puedan conectarse dos sistemas totalmente diferentes. Sin embargo, se da libertad para que sistemas parecidos puedan ponerse de acuerdo para usar normas comunes más eficaces. Los estándares más comunes son:
* Código ASCII para la representación de caracteres.
* Las nuevas líneas se abren con un retorno de carro seguido de un salto de línea (esto se suele llamar "net ASCII").
* Las conexiones de terminal son half-duplex con eco local.
Un ejemplo de funcionamiento: SMTP (mail)
El estándar SMTP (Simple Mail Transfer Protocol) puede servir de ejemplo de cómo funcionan en general las aplicaciones de red.
SMTP asume la existencia de unas direcciones de mail al estilo usuario@máquina. La máquina que quiere enviar un mensaje, abre una conexión con el servidor de la máquina destinataria, usando el puerto 25 como acceso predeterminado. Se identifica él mismo, identifica al usuario que envía el mensaje, y al destinatario (recipiente). Luego envía el mensaje, siguiendo un esquema de cabecera identificativa, una línea en blanco y texto de mensaje, terminando con un punto al principio de una línea. Si un mensaje llegase a contener dicho punto, se envía el punto dos veces.
Los comandos son de texto normal, facilitando así el seguimiento de las conexiones. Los mensajes de respuesta del servidor van precedidos de un número que los hace identificables por el programa. La parte textual de éstos es para las personas, aunque a veces puede ser usada parte de ésta por el protocolo. Los números de los mensajes están pensados para que baste, en la mayor parte de los casos, con leer el primer dígito. Los mensajes que empiezan por 2 indican éxito; los que empiezan por 3 señalan que se espera una determinada acción; 4 indica errores "temporales", que se pueden subsanar y reintentar la transmisión; el 5 indica errores permanentes.
Un ejemplo de diálogo usando SMTP: Envío de un mensaje de lopez@inca.example.com a perez@lince.example.com:
220 lince.example.com SMTP Service at 9 May 95 18:20:35 EDT
HELO inca.example.com
250 lince.example.com - Hello, inca.example.com
MAIL From:<lopez@inca.example.com>
250 MAIL accepted
RCPT To:<perez@lince.example.com>
250 Recipient accepted
DATA
354 Start mail input; end with <CRLF>.<CRLF>
Date: Sat, 6 May 95 11:11:11 EDT
From: lopez@inca.example.com
To: perez@lince.example.com
Subject: Reunion
Te propongo una reunion a las 16:00 horas, proximo jueves
Saludos.
.
250 OK
QUIT
221 lince.example.com Service closing transmission channel
5) PROTOCOLOS QUE SUSTITUYEN A TCP
Existen casos en los que no vale la pena usar las complejas estructuras de TCP, cuando la información que se va a intercambiar cabe en un sólo datagrama. No es necesario un protocolo tan complejo. Un ejemplo típico son las búsquedas de direcciones a partir de nombres Internet (DNS). La máquina que hace la pregunta sólo manda el nombre a buscar, y el servidor de nombres no retorna más que la dirección correspondiente.
UDP (User datagram protocol) está diseñado para aplicaciones que no necesitan enviar mensajes de más de un datagrama. Sustituye a TCP, encajando exactamente en el hueco que deja éste: coloca su cabecera y pasa la información a IP (el cual pondrá el número de protocolo de UDP en su cabecera, en vez del de TCP). No divide el mensaje en datagramas, ni tampoco controla si el mensaje llega a su destino.
ICMP (Internet control message protocol) se usa para enviar mensajes de error, o de otro tipo. Es usado por el propio software TCP/IP (más que por otro tipo de aplicaciones) para comunicarse, por ejemplo, un fallo en la conexión. Es aún más simple que UDP, y también maneja mensajes de un sólo datagrama, y ni siquiera usa números de puerto.

No hay comentarios:

Publicar un comentario

Expresa tu opinión respetando a los demás y a unas mínimas reglas del lenguaje castellano.