Hablemos de TPC y UDP, hablemos de transporte.

Protocolos de la capa de transporte

Las principales funciones de los siguientes dos protocolos son: Rastreo de comunicación de principio a fin, división de los datos en segmentos para su administración y reunificación de dichos datos en la aplicación de destino y además identifican la aplicación correspondiente para cada stream de comunicación.

  • TCP: protocolo que proporciona confiabilidad de que los paquetes llegaran, ya que es orientado a conexión.
    • Seguimiento de segmentos de datos transmitidos
    • Acuse de recibo de datos
    • Retransmisión de cualquier dato sin acuse de recibo
    • También se podría decir que TCP provoca una sobrecarga adicional con el acuse de recibido y demás..
    • Protocolos que se sirven de TCP: HTTP, Telnet, FTP, SMTP, DNS(ambos), SNMP(ambos)…
  • UDP: protocolo que no proporciona confiabilidad, ya que no es orientado a conexión.
    • Conocido como protocolo de máximo esfuerzo.(Es decir, poco confiable)
    • No hay acuses que notifique al emisor de que el receptor recibio los paquetes enviados
    • Protocolos que se sirven de UDP: DHCP, TFTP, VoIP, IPTV, DNS(ambos), SNMP(ambos)…

Nota: se debe elegir entre un tipo de protocolo u otro dependiendo de la finalidad que tenga la aplicación, hay aplicaciones que prefieren sacrificar confiabilidad (no recibir acuse de recibo TCP) para aumentar la velocidad de transmisión (UDP), como por ejemplo videos en streaming o la radio, en cambio hay otros que prefieren sacrificar velocidad de transmisión a tener que sacrificar  confiabilidad.

Ya que la capa de transporte puede administrar varias comunicaciones a la vez, por ejemplo, mensajería instantánea, navegador web, telefonía IP, correo electrónico, etc… debe saber diferenciar cada tipo de aplicación para pasar los paquetes de datos correspondientes, para esto se utilizan los puertos, para identificar cada aplicación.

Transmission Control Protocol (TCP)

TCP es confiable por que se establece un sesión antes de la emisión de paquetes, lo cual certifica que el host receptor se encuentra a la escucha de los paquetes, y que por tanto los va a recibir, o al menos lo intentará. También garantiza que los paquetes se van a armar en el orden correcto, ya que los paquetes pueden haber tomado rutas distintas en su camino hacía el host receptor, por las cuales se pudieron haber retrasado y no llegar en el orden en el que fueron emitidos, además TCP controla el flujo de transmisión lo cual es una característica muy importante ya que de esta forma asegura que, por ejemplo, si se detecta en la red que hay un cierto nivel congestión, controla el flujo de paquetes, haciendo que los paquetes salgan del host emisor más lentamente y así se evite que lleguen paquetes distorsionados/dañados y que tengan que ser reenviados. Ya hablaremos más adelante de esta caracteristica.

A continuación pasemos a analizar un segmento TCP:

Captura de pantalla 2016-02-27 a las 21.12.45En la imagen superior podemos detallar los siguientes campos:

  • Puerto origen: El puerto origen.
  • Puerto destino: El puerto destino.
  • Número de secuencia: Se utiliza para rearmar los datos.
  • Número de acuse de recibo: Indicar los datos que se recibieron.
  • Longitud del encabezado: Conocido como desplazamiento de datos. Indica la longitud del encabezado del segmento TCP.
  • Reservado: Un campo reservado para el futuro.
  • Bits de control: Indica el propósito y la función del segmento.
  • Tamaño de la ventana: Indica la cantidad de segmentos que se pueden aceptar cada vez.
  • Checksum: Se utiliza para la verificación de errores en el encabezado y los datos del segmento.
  • Urgente: Indica si la información es urgente.

 

User Datagram Protocol (UDP)

El protocolo UDP trabaja sin conexión, es decir no sabe si el host receptor estará disponible para la escucha de los paquetes, por lo tanto se empieza a transmitir con desconocimiento. Los paquetes corruptos o no entregados no se vuelven a enviar, ya que se desconoce cuales no fueron entregados porque no existe el acuse de recibo. La reconstrucción de los datos se realiza de forma desordenada, y mucho menos tiene control de flujo como TCP, es decir que no controla la cantidad de paquetes de datos enviados, y si el host receptor llegase a estar ocupado descartaría todos los paquetes que le llegasen, siendo esto totalmente transparente para el host emisor.

Analicemos pues un Segmento de UDP:

Captura de pantalla 2016-02-27 a las 21.19.56
Con respecto a este segmento tampoco hay mucho que comentar, podeis ver que es muy simple y los campos se describen solos, el campo Checksum, y solo por profundizar un poco más lo que contiene es un valor determinado que se establece en la maquina emisora, este se consigue mediante el CRC (Cyclic Redundancy Check) o Check de redundancia ciclica, que es una operación realizada con la cabecera y los datos del segmento. El host receptor realiza el mismo proceso con los mismos datos y compara el CRC obtenido con el que se establece en este campo, de esta manera se puede saber si el paquete esta integro o no.

Puertos

Si hay algo importantisimo para la capa de Transporte son los puertos usados por los protocolos, estos se utilizan para que una maquina puede tener varios servicios que ofrecer, o recibir. En el encabezado de cada segmento o datagrama hay un puerto origen y uno de destino. El número de puerto origen es el número asociado con la aplicación que origina la comunicación en el host local. Cuando un host envía un paquete establece un puerto de destino, el cual tendrá que observar el host receptor y entregar la información que por ese puerto se le solicita, por ejemplo el puerto 80 haría referencia a una página web y el puerto de origen es generado aleatoriamente para identificar una conversación entre dos dispositivos.

Los puertos de origen y de destino se colocan dentro del segmento. Los segmentos se encapsulan dentro de un paquete IP. El paquete IP contiene la dirección IP de origen y de destino. La combinación de las direcciones IP de origen y de destino y de los números de puerto de origen y de destino se conoce como “socket”. El socket se utiliza para identificar el servidor y el servicio que solicita el cliente.

Un socket de cliente podria ser así: “192.168.0.1:1099″ y el socket de un servidor podría ser el siguiente:” 192.168.0.8:443“, estos dos sockets se juntan para formar un par de sockets: 192.168.0.1:1099 y 192.168.0.8:443. Con los sockets se conocen los extremos de la comunicación, de modo que los datos pueden moverse desde una aplicación en un host hacia una aplicación en un servidor y de esta forma se permite que varios procesos se ejecuten en una misma máquina y se distingan entre sí.

El puerto de origen de la solicitud de un cliente se genera de manera aleatoria. El número de puerto actúa como dirección de retorno para la aplicación que realiza la solicitud. La capa de transporte hace un seguimiento de este puerto y de la aplicación que generó la solicitud de manera que cuando se devuelva una respuesta, esta se envíe a la aplicación correcta. El número de puerto de la aplicación que realiza la solicitud se utiliza como número de puerto de destino en la respuesta que vuelve del servidor.


Numeros de puertos

Existen 65535 puertos disponibles, pero este numero no es aleatorio, si nos fijamos en el valor del campo Puerto Origen y Puerto Destino, de los diferentes protocolos, veremos que su tamaño es de 16bits o 2 bytes, con este campo y esa capacidad se puede llegar hasta 65535. El puerto origen se genera aleatoriamente, pero que numero de puerto origen debe elegir una aplicación (?), pues para ello los 65535  puertos estan divididos en 3 grupos, aquí os dejo una tabla:

 

De 0 a 1023 Denominados puertos bien conocidos:

  • FTP 21
  • TELNET 23
  • HTTP 80
  • SMTP 25
  • IMAP 143
  • IRC 194
  • DNS 53
  • HTTPS 443

Puertos UDP bien conocidos:

  • TFTP 69
  • RIP 520

Puerto TCP/UDP bien conocidos:

  • DNS 53
  • SNMP 161
  • AOL Instant Messenger, IRC 531
De 1024 a 49151 Denominados puertos registrados:

    • MSN Messenger 1863
    • Cisco SCCP (VoIP) 2000
    • Puerto alterno de HTTP 8080
    • Puerto alterno de HTTP 8008

Puertos UDP registrados

  • Protocolo de autenticación RADIUS 1812
  • RTP 5004
  • SIP 5040

Puertos TCP/UDP registrados:

  • MS SQL 1433
  • WAP (MMS) 2948
De 49152 a 65535 Denominados puertos privados y/o dinámicos
  • Bien conocidos: Estos son los puertos reservados para servicios y aplicaciones comunes como HTTP, Telnet, IMAP, etc…
  • Puertos registrados: Estos son asignados a procesos o aplicaciones de usuarios.
  • Puertos dinámicos o privados: Son también conocidos como puertos efímeros, generalmente se los asigna de forma dinámica a las aplicaciones cliente cuando el cliente inicia una conexión a un servicio. El puerto dinámico suele utilizarse para identificar la aplicación cliente durante la comunicación, mientras que el cliente utiliza el puerto bien conocido para identificar el servicio que se solicita en el servidor y conectarse a dicho servicio.

 

Estableciendo y finalizando conexiones (TCP)

Como comentamos antes cuando dos hosts se comunican utilizando TCP, se establece una conexión antes de que puedan intercambiarse los datos. Luego de que se completa la comunicación, se cierran las sesiones y la conexión finaliza. Los mecanismos de conexión y sesión habilitan la función de confiabilidad de TCP.

Los hosts hacen un seguimiento de cada segmento de datos dentro de una sesión e intercambian información sobre qué datos se reciben mediante la información del encabezado TCP. TCP es un protocolo full-duplex, en el que cada conexión representa dos streams de comunicación unidireccionales, o sesiones. Para establecer la conexión los hosts realizan un protocolo de enlace de tres vías. Los bits de control en el encabezado TCP indican el progreso y estado de la conexión. Enlace de tres vías:

  • Establece que el dispositivo de destino se presente en la red
  • Verifica que el dispositivo de destino tenga un servicio activo y que acepte solicitudes en el número de puerto de destino que el cliente de origen intenta utilizar para la sesión
  • Informa al dispositivo de destino que el cliente de origen intenta establecer una sesión de comunicación en dicho número de puerto

Protocolo de enlace de tres vías – Establecimiento de conexión (TCP)

El protocolo de enlace de tres vías es un proceso por el cual se debe pasar antes de establecer y antes de finalizar una conexión. Al establecer la conexión se realizan los siguientes tres pasos:

  1. El cliente envia un segmento TCP marcando en el campo BITS DE CONTROL el valor SYN, con ello se empieza a establecer la conexión a través de ‘X’ puerto en el servidor. Además el cliente, en el campo NUMERO DE SECUENCIA genera un numero aleatorio para empezar a sincronizar con el servidor, supongamos que envia el numero 100.
  2. El servidor recibe el segmento TCP con el valor SYN, y el NUMERO DE SECUENCIA 100. Si el puerto por el que se intenta realizar la conexión esta disponible, el servidor envia un segmento TCP con el valor SYN en el campo BITS DE CONTROL y además el valor ACK. En el campo NÚMERO DE ACUSE DE RECIBO se establece el numero siguiente al de la secuencia enviada por el cliente, es decir, si el numero de secuencia del cliente es 100, en el campo NUMERO ACUSE DE RECIBIDO se establecera el numero 101, de esta manera el cliente entenderá que el servidor ha recibido correctamente los datos. El servidor también genera un numero de secuencia, supongamos 300.
  3. El cliente recibe el segmento TCP con los valores SYN y ACK establecidos en el campo BITS DE CONTROL, por tanto envia como respuesta un segmento TCP con el NUMERO DE SECUENCIA 101 y el NUMERO DE ACUSE DE RECIBO 301, además en el cambo BITS DE CONTROL establece el valor ACK.

Y asi termina el proceso de enlace de tres vías.

Los siguientes son los bits de control que utiliza el protocolo TCP. Como vimos anteriormente en el encabezado tiene dedicado un campo de 6 bits, llamado de Bits de Control, que se utilizan para representar el propósito del paquete

  • URG: campo indicador urgente importante
  • ACK: campo de acuse de recibo importante
  • PSH: función de empuje
  • RST: restablecer la conexión
  • SYN: sincronizar números de secuencia
  • FIN: no hay más datos del emisor

Os dejo una imagen con el proceso descrito arriba, de esta forma quizá no nos hagamos la picha un lio.

Captura de pantalla 2016-02-27 a las 23.17.53

Finalización de la conexión (TCP)Captura de pantalla 2016-02-27 a las 23.54.23

  1. Cuando el cliente no tiene más datos para enviar entonces envia un segmento con el valor FIN establecido
  2. El servidor responde con un segmento con el valor ACK y otro con el valor FIN establecido.
  3. El cliente envia un segmento con el valor ACK establecido.

Reordenamiento de segmentos (TCP)

Cuando se envían los segmentos se les establece un valor inicial llamado ISN (Número de Secuencia Inicial), este ISN representa el valor inicial para los bytes que se transmitirán en la sesión, a medida que se transmiten los datos, se incrementa el número de la secuencia en el número de bytes que se han transmitido (Como vemos en la imagen inferior). Estos números en el encabezado se utilizan para reordenar los paquetes en el host receptor.

Captura de pantalla 2016-02-28 a las 0.04.18

Acuse de recibo (TCP)

Captura de pantalla 2016-02-28 a las 0.12.48

Como antes, con la explicación dada en el proceso del enlace de tres vías pudo quedar un poco difuso, ahora os lo explico un poco mejor, bien, pues los campos acuse de recibo y número de secuencia varían entre ellos, de esta forma se juega con los valores, si el número de secuencia empieza por 1 y se enviarán 10 bytes desde el cliente al servidor éste devolverá un acuse de recibo número 11, diciendo así que recibió los 10 bytes, el número de secuencia será dos, entonces ese número de secuencia se aumentará en 1 para el acuse de recibo del cliente.   

A continuación se explica como funciona un acuse de recibo en la imagen anterior:

  1. El host de la izquierda envía un segmento que contiene 10 bytes de datos para esta sesión y un número de secuencia igual a 1 en el encabezado.
  2. El host receptor recibe el segmento en la capa 4 y determina que el número de secuencia es 1 y que tiene 10 bytes de datos. Luego el host envía un segmento de vuelta al host de la izquierda para acusar recibo de estos datos. En este segmento, el host establece el número de ACK en 11 para indicar que el siguiente byte de datos que espera recibir en esta sesión es el byte número. Cuando el host emisor recibe este acuse de recibo, puede enviar el próximo segmento que contiene datos para esta sesión a partir del byte 11.
    1. Nota: se utilizan los acuses de recibos conjuntos, es decir como vemos en el paso anterior se avisa de que los 10 bytes llegaron enviando solo un acuse de recibo, ya que si se enviará un acuse para cada byte la red sufriría un exceso de congestión y sobrecarga.
  3. El host emisor envía la siguiente tanda de segmentos empezando por el número de secuencia 11.

Segmentos perdidos (TCP)

Cuando se envían segmentos se inicia un temporizador que establece un tiempo determinado en el cual deberá recibir del host receptor el acuse de recibo, si el segmento ACK con el número de secuencia siguiente (acuse de recibo) no es recibido en ese lapso de tiempo, el host emisor reenvía el  segmento.

TCP tiene una característica concreta que se basa en que cuando se reciben paquetes solo mandara el acuse de recibo de que aquellos que han seguido una secuencia y no tienen un corte o salto de por medio, es decir si se envían los segmentos con número de secuencia inicial 300 hasta 600 y luego le llegan al host receptor 700 800, responderá con un paquete ACK 601, diciendo así que solo recibio hasta el numero 600 a pesar de que haya recibido los otros paquetes, pero ya que perdió del 601 hasta el 699 lo hace de esa forma

Control de flujo – Tamaño de ventana (TCP)

El control de flujo se realiza cuando se establece la conexión TCP, en ese momento se establece cuando va a ser la cantidad máxima de segmentos que podrán recibir los host, este valor se establece en el protocolo de enlace de tres vías y en el encabezado TCP hay 16 bits dedicados a esta característica.

Captura de pantalla 2016-02-28 a las 0.25.00

TCP controla el flujo y la congestión a través de tamaños de ventanas dinámicos, de esta forma consigue que si el host receptor esta con poco espacio en buffer para la recepción de segmentos con un tamaño de ventana, por ejemplo de 3000, lo disminuya a 1500 y cuando se encuentre con mayor espacio de memoria lo vuelva a aumentar.
Captura de pantalla 2016-02-28 a las 0.28.53

Podemos observar en la imagen anterior como cuando responde el acuse de recibo lo hace estableciendo el valor 3001 es decir, que no ha recibido el stream de segmentos anteriores, y además establece el nuevo valor de tamaño de ventana.


Datagramas (UDP)

UDP envía datagramas a diferencia de TCP que envía segmentos, UDP no tiene todo los campos en el encabezado como TCP, lo cual lo hace mas ligero y rápido, pero a la vez menos confiable, ya que no realiza conexión con el host receptor, no realiza acuses de recibos ni control de flujo y mucho menos reordenación de datagramas. Cuando UDP envía datagramas al host receptor lo hace de manera ordenada, pero si por motivos de la distribución de la red y la ruta tomada por los paquetes, llegasen desordenados, se pasarían de tal forma a la capa de aplicación y esa sería la encarga de reordenar las datagramas si fuese necesario.

¿TCP o UDP?, he ahí la cuestión

Para terminar hacemos un resumen de lo que nos ofrece cada protocolo, sus beneficios y sus deficits.

TCP

Muchas aplicaciones requieren confiabilidad y otros servicios que proporciona TCP. Estas son aplicaciones que pueden tolerar cierto grado de demora o pérdida de rendimiento debido a la sobrecarga que impone TCP. Esto hace que TCP sea más adecuado para las aplicaciones que necesitan transporte confiable y que pueden tolerar cierta demora. Debido a que el protocolo de la capa de transporte TCP maneja todas las tareas asociadas con la segmentación del stream de datos, la confiabilidad, el control del flujo y el reordenamiento de segmentos, este libera a la aplicación de la tarea de administrar cualquiera de estas tareas. La aplicación simplemente puede enviar el stream de datos a la capa de transporte y utilizar los servicios de TCP.

UDP

Muchas aplicaciones de video y multimedia, como VoIP y la televisión por protocolo de Internet (IPTV), utilizan UDP. Estas aplicaciones pueden tolerar cierta pérdida de datos con un efecto mínimo o imperceptible. Las cualidades de TCP para estas aplicaciones haria que estas se vieran afectadas en el tiempo de recepción para el audio o el video, todos hemos visto videos en Streaming, por ejemplo, que se quedaban pausados y a los pocos segundos volvía la imagen y el audio, pero ya habiamos perdido el audio y video de esos segundos de pausa, en estos casos es lo más correcto usar UDP, ya que es preferible esto, a tener que someter a estas aplicaciones a un proceso de enlace de tres vías y todo lo que conlleva el uso de TCP.

Otros tipos de aplicaciones adecuadas para UDP son las que utilizan transacciones de solicitud y respuesta simples. Esto se da cuando un host envía una solicitud y existe la posibilidad de que reciba una respuesta o no. Estos tipos de aplicaciones incluyen las siguientes:

  • DHCP
  • DNS: también puede utilizar TCP
  • SNMP
  • TFTP

Algunas aplicaciones se ocupan de la confiabilidad por sí mismas. Estas aplicaciones no necesitan los servicios de TCP y pueden utilizar mejor UDP como protocolo de capa de transporte. TFTP es un ejemplo de este tipo de protocolo. TFTP tiene sus propios mecanismos para el control del flujo, la detección de errores, los acuses de recibo y la recuperación de errores. Este protocolo no necesita depender de TCP para esos servicios.


Analicemos un caso real

Para poder observar un caso real, voy a abrir Wireshark y acto seguido abriré una página web. Despues analizaremos todo el protocolo de enlace de tres vías en este ejemplo.

  • Como podemos detallar en este caso mi PC asigna como puerto Origen el 50671, y se dirige al Puerto Destino 80.
  • El numero de secuencia es 0.
  • El campo flags, o bits de control como lo hemos visto en esta entrada tiene el valor SYN establecido.
  • El valor del tamaño de la ventana en esta caso es el máximo, 65535.

Ahora analicemos el segmento que nos envia el servidor:

Captura de pantalla 2016-04-02 a las 23.40.55

  • El puerto origen es el 80.
  • El puerto destino como veis es el 50671, que en el segmento anterior era el Puerto Origen.El numero ACK es 1. Un numero más grande que el numero de secuencia de nuestro segmento anterior (0).
  • Los bits de control tienen los valores SYN y ACK establecidos.
  • El servidor modifica el tamaño de la ventana a: 42540

Analicemos el siguiente segmento devuelta al servidor y el final del proceso del enlace de tres vias:

Captura de pantalla 2016-04-02 a las 23.41.07

  • Como hemos dicho los puertos se intercambian, y vuelven a ser los mismos del primer segmento, logicamente.
  • El numero de secuencia es 1.El valor de ACK es 1.
  • Y el bit de control de ACK esta establecido.

De esta manera se establece la conexión con el servidor, y se pueden a empezar a transmitir los datos pertinentes, en esta caso como podremos observar en la imagen inferior, y ya que visitabamos una pagina web, el siguiente mensaje que mi equipo envia va a través del Protocolo HTTP :

Captura de pantalla 2016-04-02 a las 23.48.26
Eso ha sido todo de momento chicos, a seguir bien!;)

 

 

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s