Definición
Es un protocolo de capa de transporte que implementa un protocolo de entrega confiable
Para proveer una entrega confiable, utiliza
- Un segmento ACK para indicarle al otro extremo de la conexión que recibió correctamente el segmento
- Un handshake
- Una secuencia de cierre
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
- Utilizamos en la secuencia de inicio y la secuencia de cierre de la conexión
- CWR, ECE bit
- Utilizados en las notificaciones explícitas de congestión
- 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
- ACK bit
Parámetros del protocolo
El protocolo TCP tiene los siguientes parámetros
size
: Que indica el tamaño del archivo que se debe enviarMSS (Maximum segment size)
: Es el tamaño máximo de los segmentos. Se usa este valor como unidad para el análisisLW
: 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 de1 MSS
.IW
: Es el valor que toma la ventana de congestión al inicio del protocoloRTO
: Es el tiempo establecido para los timer interrupts del ACK de los paquetesssthresh
: Es el valor en el que el protocolo pasa a la etapa de congestion avoidancecwnd
: Es el valor de la ventana de congestión. Representa la cantidad de paquetes que puede a lo sumo tener en vuelorwnd
: 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 vueloversion
: 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
- Retransmisión después de un timeout
- Duplicar el timeout por cada perdida, y reducirla cuando lleguen más rápido
- El uso de fast retransmit
- El uso de Go-Back N
- El uso de Selective Repeat
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
- El emisor envía un close command, con el FIN bit prendido
- El receptor lo recibe y envía un ACK para el segmento recibido
- El receptor envía su propio segmento de cierre, con el Fin bit prendido
- 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