Definición


Es un protocolo de capa de transporte que implementa un protocolo de entrega confiable

Para proveer una entrega confiable, utiliza

Además suma un control de congestión

Estructura del protocolo


El protocolo TCP tiene la siguiente estructura

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |     Puerto de origen          |      Puerto de destino        |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |                     Número de secuencia                       |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |                   Número de acknowledgment                    |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 | Posic |           |U|A|P|R|S|F|                               |
 | de los| Reservado |R|C|S|S|Y|I|           Ventana             |
 | datos |           |G|K|H|T|N|N|                               |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |            Checksum           |        Puntero urgente        |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |                    Opciones                   |    Relleno    |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |                            Datos                              |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Como el protocolo UDP, el header de TCP contiene los puertos de origen y destino, y un campo de checksum. Además, contiene los siguientes campos

  • Número de secuencia
  • Número de acknowledgment
  • Campo de receive window
  • Campo de header length
  • Campos opcionales
  • Campo de flags
    • ACK bit
      • Indica que el valor almacenado en el campo de acknowledgment es válido
    • RST, SYN, FIN bit
    • CWR, ECE bit
    • PSH bit
      • Indica que el receptor de enviar los datos de la capa de arriba de forma inmediata
    • URG bit
      • Indica que hay información en el segmento que es marcada como segmento. La dirección del último bit de información urgente es indicado en el urgent data pointer field

Parámetros del protocolo


El protocolo TCP tiene los siguientes parámetros

  • size: Que indica el tamaño del archivo que se debe enviar
  • MSS (Maximum segment size): Es el tamaño máximo de los segmentos. Se usa este valor como unidad para el análisis
  • LW: Es el valor que toma la ventana de congestión luego de una perdida, al volver a la etapa de slow start. En general toma un valor de 1 MSS.
  • IW: Es el valor que toma la ventana de congestión al inicio del protocolo
  • RTO: Es el tiempo establecido para los timer interrupts del ACK de los paquetes
  • ssthresh: Es el valor en el que el protocolo pasa a la etapa de congestion avoidance
  • cwnd: Es el valor de la ventana de congestión. Representa la cantidad de paquetes que puede a lo sumo tener en vuelo
  • rwnd: Es el valor de la ventana de recepción del host del otro lado de la conexión. Representa la cantidad de paquetes que puede a lo sumo tener en vuelo
  • version: Puede ser Tahoe o Reno

Entrega confiable


TCP entonces crea un servicio confiable de transferencia de datos encima del servicio best-effort del IP

Si bien conceptualmente podemos asumir la utilización de un timer por paquete, en la práctica esto es muy costoso, por lo que se suele utilizar un único timer de retransmisión para múltiples paquetes transmitidos no todavía confirmados

Usa alguno de los siguientes métodos para asegurar este servicio

Three-Way Handshake


Debido a que se envían tres segmentos de información al establecer la conexión, se refiere usualmente como three-way handshake. Los primeros dos segmentos no contienen información de la aplicación, mientras que el último puede hacerlo

En el primer mensaje tiene la flag de SYN prendido, por eso se lo llama mensaje SYN, y también se manda el número de secuencia, el tamaño de la ventana, el MSS, entre otras cosas.

El recibe el segundo mensaje, el flag de SYN y de ACK están prendido, por eso se lo llama mensaje SYN ACK, y el receptor envía la información necesaria, los mencionados anteriormente

El último mensaje de los tres, el flag de ACK está prendido, y este se llama mensaje ACK ACK

Secuencia de cierre


Cualquiera de los dos procesos puede elegir terminar la conexión, al ocurrir esto, se liberan los recursos utilizados en la misma

  1. El emisor envía un close command, con el FIN bit prendido
  2. El receptor lo recibe y envía un ACK para el segmento recibido
  3. El receptor envía su propio segmento de cierre, con el Fin bit prendido
  4. Finalmente, el cliente envía el ACK para el segmento de cierre y ambos hosts liberan los recursos utilizados

Diagrama de estado del emisor


El último estado del cliente se utiliza para reenviar un ACK en caso de que este se haya perdido en la red

Cuando un cliente envía un SYN SEGMENT a una dirección y puerto en el que no hay ningún listening socket, este le reenviará un segmento especial de reset con el RST bit prendido

Diagrama de estado del receptor


Control de flujo


Cuando una conexión TCP recibe información correcta y en secuencia, la coloca en el receive buffer. Si la aplicación es relativamente lenta en leer esta información, el receptor puede fácilmente causar un overflow en el buffer de lectura. El servicio de control de flujo elimina la posibilidad de que esto ocurra, provee un servicio de speed-matching para emparejar la velocidad de lectura con la velocidad de bajada. Este servicio el distinto al de control de congestión, ambos producen el mismo efecto, pero por razones distintas

Para implementar este mecanismo, un host mantener la siguiente información

  • LastByteRead
    • El número del último byte que fue leído por la aplicación
  • LastByteRcvd
    • El número del último byte que fue recibido a través de la red
  • rwnd
    • También conocida como receiver window. Definida a partir de las anteriores variables como el espacio libre en el buffer

El host agregará este último campo a los paquetes transferidos a través de la red, para comunicarle al otro host del estado actual del buffer. Este a su vez deberá mantener las siguientes variables

  • LastByteSend
    • El número del último byte que fue enviado a través de internet
  • LastByteAck
    • El número del último byte que fue confirmado por el host

A partir de estos dos valores, podremos calcular la cantidad de datos sin verificar que fueron enviados. El protocolo tratará de que esta cantidad nunca sea mayor al tamaño de la ventana del receptor

Para permitir que un host que únicamente recibe información le comunique al otro host su window, entonces este valor también se agregara a los mensajes de ACK

Socket programming


El protocolo TCP, por otro lado, es orientado a conexiones. Antes de que dos hosts pueden comunicarse entre sí, está la fase de handshake

Cuando se crea una conexión TCP, debe indicarse la dirección y el puerto de destino. De esta forma, para enviar información una vez creado el socket no es necesario indicar el destinatario

Una vez creado el socket, el cliente inicia un handshake de tres pasos y establece una conexión con el servidor. Primero el cliente le envía un mensaje a un servidor, que contiene un listening socket esperando a establecer conexiones con los clientes. Este, al recibir el mensaje, creará una conexión TCP particular para este cliente

Desde el punto de vista de la aplicación, los sockets están directamente conectados a través de una tubería