La capa de transporte en Internet : TCP a fondo. Volumen IV

Escrito por Sergio De Luz
Redes
2

Os hemos enseñado el funcionamiento básico de la capa de transporte, cómo funciona, y sus protocolos más usados.

En este último volumen hablaremos sobre TCP, un servicio orientado a conexión y fiable.

Para que TCP pueda proporcionar un servicio de transferencia fiable, debe detectar los errores, encargarse de las retransmisiones, los reconocimientos acumulativos provenientes del receptor, los temporizadores por si algún paquete se ha perdido volver a reenviar el mismo, TCP incluye los campos de cabecera para los números de secuencia y de reconocimiento.

Denominamos a TCP un protocolo orientado a conexión porque antes de que un proceso de la capa de aplicación pueda comenzar a enviar datos a otro, primero deben establecer una comunicación. Por tanto, antes de iniciar la transferencia de verdad, estamos mandando datos únicamente de establecimiento de la conexión.

TCP únicamente está presente en los host, no en los routers o switches, estos dispositivos sólo procesan los datagramas pero no las conexiones que se realizan.

TCP proporciona un servicio full-dúplex, si existe una conexión TCP en el proceso A y en el proceso B de cada uno de los hosts, entonces los datos de la capa de aplicación pueden fluir desde A hasta B y viceversa de forma simultánea.

En TCP las conexiones casi siempre son punto a punto, no hay multidifusión (para ello está UDP).

Establecimiento de la conexión

El establecimiento de la conexión se denomina “acuerdo en tres fases”. El cliente envía un segmento TCP para establecer la conexión, a continuación el servidor responde con otro segmento TCP de establecimiento y a continuación el cliente le responde con otro segmento TCP de establecimiento que podría contener los datos que deseamos transpotar.

Una vez establecida la conexión, se pueden enviar datos en los dos sentidos. La cantidad máxima de datos que puede transportar en cada segmento está limitada por el MSS (tamaño máximo del segmento), normalmente TCP ajusta la longitud de este segmento al de la trama más larga de la capa de enlace (el famoso MTU).

TCP une los datos del cliente con las cabeceras TCP formando los segmentos TCP. Estos segmentos se pasan a la capa de red para que sean encapsulados dentro de datagramas IP. Estos datagramas IP se envían a la red.

Cuando TCP recibe un segmento en el otro extremo, los datos del mismo se colocan en el buffer de recepción de la conexión TCP, entonces la aplicación lee el flujo de datos del buffer para procesarlos.

Estructura del segmento TCP

El segmento TCP tiene campo de datos y la cabecera. Los datos que se introducen en el segmento, están limitados por el MSS. Si necesitamos enviar archivos mayores al tamaño del MSS, TCP divide el archivo en fragmentos para adaptarse al MSS. Normalmente la cabecera de TCP ocupa 20bytes.

La cabecera consta de:

– Número de puerto origen y número de puerto destino.
– Número de secuencia de 32bits.
– Número de reconocimiento de 32bits
– Campo de longitud de la cabecera, es de 4 bits y especifica la longitud de la propia cabecera TCP ya que podemos tener una cabecera de tamaño variable, normalmente este campo está vacío por tanto son los 20bytes que dijimos anteriormente).
– Campo opciones: se usa para fijar un tamaño máximo de segmento (MSS).
– Campo indicador: tiene 6 bits, se encarga de todo lo relacionado con los reconocimientos, establecimiento y cierre de conexiones.

Os recomiendo que miréis esto: http://www.redeszone.net/2010/11/20/taller-de-practicas-cliente-y-servidor-tcp-en-java/

Próximamente control de congestión y control de flujo en TCP


Continúa leyendo
  • Zim_Zum

    Está muy bien resumido y explicado, aunque vendría bien una pequeña explicación en la diferencia de segmentos y datagramas… aunque tal vez se pueda extender mucho. También estaría bien hacer un taller de sockets en C, como el de cliente servidor que ya hay en java, ya que me parece más interesante… Solo son propuestas!! Muchas gracias por el trabajo que haceis!!

    • Muchas gracias por el comentario.

      Lo de diferencia entre segmento y datagrama, en principio no tiene una gran extensión, aunque sí es algo lioso porque la gente tiende a confundirlo. Gracias por la idea! a ver si puedo hacerlo 🙂 Si te prestas voluntario a escribir algo ya sabes 😀

      Respecto a los sockets en C miraré cómo hacerlo, pronto publicaré un simulador de bit alternante en C aunque se puede encontrar por la red, pero no está mal dar con uno que sé que funciona 🙂

      Saludos