# Segmento TCP

Se llama segmento TCP a los paquetes de bits que constituyen las unidades de datos del protocolo TCP

## Introducción

La aplicación traslada los datos a TCP y éste sitúa los datos en un buffer de envío. TCP toma un trozo de esos datos y le añade una cabecera, creando de esta forma un segmento. Este segmento es trasladado a IP para que lo entregue como un único datagrama. El empaquetado de estos datos en trozos de tamaño adecuado permite usar de una manera eficiente miniaturadeimagen

## Formato del segmento TCP

El segmento TCP está compuesto por los datos enviados desde la capa de aplicación y la cabecera añadida por el protocolo de transporte. El segmento TCP es luego encapsulado en un datagrama IP para ser enviado por la capa de red.
El formato de la cabecera TCP se detalla a continuación:

## Campos de la cabecera TCP

* Puerto origen (16 bits): Identifica el puerto emisor.
* Puerto destino (16 bits): Identifica el puerto receptor.
Estos dos valores identifican la aplicación receptora y la emisora, junto con las direcciones IP del emisor y receptor identifican de forma unívoca cada conexión. La combinación de una dirección IP y un puerto es llamado socket. Es el par de sockets (dirección IP + puerto del emisor y dirección IP+ puerto del receptor) dos puntos finales que unívocamente se corresponden con cada conexión TCP en internet.
* Número de secuencia (32 bits): Identifica el byte del flujo de datos enviado por el emisor TCP al receptor TCP que representa el primer byte de datos del segmento.
Cuando una conexión está siendo establecida el flag SYN se activa y el campo del número de secuencia contiene el ISN (initial sequence number) elegido por el host para esa conexión. El número de secuencia del primer byte de datos será el ISN+1 ya que el flag SYN consume un número de secuencia.
* Número de acuse de recibo (32 bits): Contiene el valor del siguiente número de secuencia que el emisor del segmento espera recibir.
Una vez que la conexión ha sido establecida, este número se envía siempre y se valida con el flag ACK activado. Enviar ACKs no cuesta nada ya que el campo de acuse de recibo siempre forma parte de la cabecera, al igual que el flag ACK. TCP se puede describir como un protocolo sin asentimientos selectivos o negativos ya que el número de asentimiento en la cabecera TCP significa que se han recibido correctamente los bytes anteriores pero no se incluye ese byte.
No se pueden asentir partes selectivas del flujo de datos (suponiendo que no estamos usando la opción SACK de asentimientos selectivos). Por ejemplo si se reciben correctamente los bytes 1-1024 y el siguiente segmento contiene los bytes 2049-3072, el receptor no puede asentir este último segmento. Todo lo que puede enviar es un ACK con 1025 como número de asentimiento, al igual que si llega el segmento 1025-2048 pero con un error de cheksum.
* Longitud de cabecera (4 bits): especifica el tamaño de la cabecera en palabras de 32 bits.
Es requerido porque la longitud del campo “opciones” es variable. Por lo tanto el tamaño máximo de la cabecera está limitado a 60 bytes, mientras que sin “opciones” el tamaño normal será de 20 bytes. A este campo también se le suele llamar “data offset” por el hecho de que es la diferencia en bytes desde el principio del segmento hasta el comienzo de los datos.
* Reservado (3 bits): para uso futuro. Debe estar a 0.
* Flags (9 bits):
   * NS (1 bit): ECN-nonce concealment protection. Para proteger frente a paquetes accidentales o maliciosos que se aprovechan del control de congestión para ganar ancho de banda de la red.
   * CWR (1bit): Congestion Window Reduced. El flag se activa por el host emisor para indicar que ha recibido un segmento TCP con el flag ECE activado y ha respondido con el mecanismo de control de congestión.
* Tamaño de ventana o ventana de recepción (16 bits): Tamaño de la ventana de recepción que especifica el número máximo de bytes que pueden ser metidos en el buffer de recepción o dicho de otro modo, el número máximo de bytes pendientes de asentimiento. Es un sistema de control de flujo.
* Suma de verificación (16 bits): Checksum utilizado para la comprobación de errores tanto en la cabecera como en los datos.
* Puntero urgente (16 bits): Cantidad de bytes desde el número de secuencia que indica el lugar donde acaban los datos urgentes.
* Opciones: Para poder añadir características no cubiertas por la cabecera fija.
* Relleno: Se utiliza para asegurarse que la cabecera acaba con un tamaño múltiplo de 32 bits.

## Algunas opciones de la cabecera

* Opción de tamaño máximo de segmento (MSS)
Los segmentos enviados a través de una conexión no son todos del mismo tamaño. Sin embargo, los dos extremos pueden acordar un tamaño máximo para los segmentos que serán transferidos en la conexión. En TCP se utiliza el campo "opciones" para conseguir negociar ciertos parámetros con la capa de transporte del otro extremo. Una de ellas permite que el protocolo especifique un tamaño máximo de segmento (MSS), éste será el número máximo de bytes que está dispuesto a recibir en un mismo segmento. Es importante por ejemplo cuando se conectan computadores con distintas capacidades de memoria ya que alguna de ellos puede ser más restrictiva.
En computadores conectados a una misma red física, TCP computará un MSS de tal forma que los datagramas IP se correspondan con la MTU de la red. Si los computadores no están en la misma red física, se puede intentar descubrir cuál es la MTU mínima en el camino que hay entre los dos extremos.
La elección de un tamaño máximo de segmento apropiado puede llegar a ser bastante difícil ya que si se escoge demasiado grande o demasiado pequeño no se conseguirá una utilización apropiada de la red. Si es muy pequeño la gran proporción entre las cabeceras y los datos hará que se produzca un uso ineficiente del ancho de banda. Por otro lado, si es demasiado grande y viajan a través de una red con MTU pequeña, IP deberá fragmentarlos y a diferencia de un segmento TCP, un fragmento no se puede confirmar o retransmitir de forma independiente por lo que todos los fragmentos deberán llegar correctamente o se tendrá que retransmitir todo el datagrama de nuevo. Teóricamente el tamaño óptimo de segmento ocurre cuando los datagramas IP llevan segmentos lo más grande posibles sin que haya necesidad de fragmentarlos.
* Opción de escalado de ventana
Como el campo "ventana" de la cabecera TCP tiene longitud 16 bits, el tamaño máximo de la ventana sería de 64 Kbytes. Aunque ese tamaño era suficiente para las primeras redes, llegó la necesidad de utilizar tamaños más grandes en las redes más avanzadas. Para conseguirlo se propuso la opción de escalado de ventana. Consiste en tres octetos, un tipo, una longitud, y un valor de desplazamiento. Esencialmente el valor de desplazamiento especifica un factor de escalado que se le aplica al valor de la ventana. La opción puede ser negociada cuando la conexión es inicialmente establecida, en ese caso toda la comunicación se asume con el tamaño de ventana negociado. Por otra parte, la opción puede ser especificada para cada segmento, en este caso el factor de escalado de la ventana varía de un segmento a otro.
* Acuse de recibo selectivos
Aunque se puede decir que TCP es un protocolo bastante robusto tiene alguna que otra debilidad, una de ellas tiene que ver con los acuses de recibo, por ello ha sido incluida esta opción. Como vimos anteriormente los asentimientos corrientes solo podían especificar hasta que número de secuencia se había recibido de forma correcta. Con este nuevo servicio se pueden utilizar acuses de recibo selectivos y para comprobar que los dos extremos son capaces de llevar a cabo este servicio, se comprueba en la fase de establecimiento de la conexión
* Opción timestamp
Esta opción fue inventada para hacer un cómputo del tiempo que tarda un paquete por la red entre los extremos de la conexión. Para TCP, el tiempo medio que tarde un paquete en llegar al otro extremo determinará cuanto tendrá que esperar antes de retransmitir un paquete que no ha sido acusado de recibo. Puesto que las características de latencia en redes distintas son únicas, TCP deberá adaptarse a ellas modificando convenientemente el valor de sus temporizadores de asentimiento.