TCP - Unidad de transferencia: segmento TCP. Orientado a conexión y fiable

Enviado por Programa Chuletas y clasificado en Informática y Telecomunicaciones

Escrito el en español con un tamaño de 7,24 KB

TCP - Unidad de transferencia: segmento TCP

Orientado a conexión y fiable, en fases: establecimiento, transferencia y cierre. Controla los errores: checksum, numeración de segmentos, confirmaciones, retransmisión y temporizadores. Lógica proceso-a-proceso, por número de puerto, flujo de datos, full-duplex...

Puertos

Los puertos identifican los extremos de la conexión. Números de secuencia y confirmación (bytes del flujo). Longitud de la cabecera en palabras de 32 bits. Tamaño de ventana se expresa en bytes. URG: si 1, del byte 0 al URG son datos urgentes. ACK: si 1, llevan número de ACK válido, todos los llevan menos el primero (el SYN). PUSH: si 1, los datos se deben enviar al proceso ya. RST: si 1, rechazo de conexión. SYN: utilizado para establecer conexión y números de secuencia. FIN: se usa para finalizar la conexión.

Establecimiento de conexión

El primer mensaje lleva SYN, si el servidor acepta la conexión, envía un SYN+ACK donde comunica su ventana restante (rwnd) y confirma (ack) el número de secuencia (seq). El tercer paquete ya puede llevar datos, comunica también la ventana del cliente.

SYN Flood

SYN Flood es una vulnerabilidad del protocolo que permite saturar (DoS) un servidor inundando con segmentos TCP son SYN. Se puede solucionar limitando el número de conexiones, filtrando IPs o retrasar la asignación de recursos usando cookies.

Transferencia

El tamaño del segmento, lo fija cada extremo. PUSH hace al emisor enviarlo inmediatamente (sin esperar al MSS, Maximum Segment Size), y hace al receptor pasar el buffer al proceso. TCP actúa orientado a fragmento y no a bytes.

URG

Desde el primer byte hasta el marcado por el puntero de urgente, TCP lo notifica a la aplicación con señal SIGURG, su tratamiento depende del proceso.

Finalización (3-way)

Ambos extremos dejan de enviar información. Los mensajes con FIN pueden contener datos, consumen siempre un número de secuencia mínimo para ser confirmados. El último ACK no lleva datos. Finalización (4-way) → El cliente inicia el cierre, pero el servidor no confirma el fin hasta terminar de enviar datos (confirmados por el cliente), hasta que finalmente el servidor envía un FIN, que se confirma homólogamente al 3-way. El rechazo de conexión por parte del servidor, se produce respondiendo a un SYN con un RST+ACK.

Control de errores

Se realiza mediante ventana deslizante, para gestionar paquetes duplicados, retransmisión de paquetes perdidos o erróneos y recepción de paquetes fuera de orden. Confirmaciones son acumulativas, se informa del siguiente byte que se espera recibir, solapadas con los datos (piggybacking). Los ACK se retrasan máximo 500ms en espera de datos que enviar, y se retrasan máximo dos en orden. Los paquetes duplicados o fuera de orden se confirman igual que el resto. Opcionalmente hay SACK, una opción del TCP (que reemplaza al ACK) informativa para el emisor. Hay dos mecanismos: 1. Temporizador de retransmisión (RTO), único por cada conexión, cuando expira se envía el primer elemento sin confirmar de la ventana, y existen varios algoritmos para fijar el RTO dinámicamente. 2. Retransmisión rápida por recepción de 3 ACKs duplicados, retransmite al instante, sin esperar al RTO.

Temporizadores de TCP

Aparte del ya mencionado RTO: Keepalive, evita mantener conexiones indefinidamente. Una conexión puede estar tcp_keepalive_time segundos en silencio, una vez expirado se envían máximo tcp_keepalive_probes sondas cada tcp_keepalive_intvl segundos. Si no se reciben ACK para las mismas, se cierra la conexión. TIMEWAIT, útil en dos situaciones, al volver a enviar el último ACK tras un cierre activo (recibir FIN), y para prevenir la colisión de números de secuencia de dos conexiones distintas (impidiendo reutilizar ese tiempo el puerto + número de secuencia). TIMEWAIT = 2 * MSL (Maximum Segment Life-time). Temporizador de persistencia: asociado a la recepción de tamaño de ventana 0, recupera la pérdida de un ACK posterior con nuevo tamaño, se envía una sonda que fuerza el envío de un nuevo ACK.

Algoritmos para el cálculo dinámico de RTO

Debido a la variabilidad de los retardos en la red, usan los valores: RTT_M = tiempo entre envío de segmento y recepción del ACK, puede tener grandes fluctuaciones. RTT_S[1] = RTT_M[1] ; RTT_S[k] = (1-a)RTT_S[k-1] + a·RTT_M[k] con a<> el tiempo suavizado de RTT. RTT_D[1] = RTT_M[1] / 2; RTT_D[k] = (1-b)RTT_D[k-1] + b·|RTT_S[k] - RTT_M[k]|, la desviación de RTT. Algoritmo de Jacobson, considera solo RTT_S y se calcula como RTO = g·RTT_S con g por ej. g=2. Algoritmo de Jacobson/Karels, combina todos y es: RTO = RTT_S + 4·RTT_D. Algoritmo de Karn, previene la ambigüedad del cálculo de RTT_M en retransmisiones: RTO = 2·RTO.

Control de flujo

Consiste en anunciar el tamaño de ventana restante, comunicada en cada ACK. Silly window (ventana trivial), es un problema generado por emisor y/o receptor muy lentos (incluso byte a byte). Un ejemplo es una aplicación interactiva, el emisor usa 40B mínimo (tamaño cabecera TCP) para 1 solo byte. El algoritmo de Nagle hace que envíe el primer mensaje (por corto que sea) y el resto esperan hasta recibir un ACK, acumular MSS bytes o expirar un temporizador. La ventana trivial del receptor, que consume datos muy lentamente, se soluciona según el algoritmo de Clark anunciando tamaño de ventana 0 hasta poder recibir un MSS o se libera la mitad del buffer. También se podrían retrasar los ACK, pero podría provocar retransmisiones innecesarias. Control de la congestión. A menudo los paquetes se pierden por congestión en la red. El emisor usa el ritmo de llegada de ACKs para regular el envío de datos. Se implementa mediante la Congestion Window (CW), es una ventana que reduce su tamaño ante la congestión, y aumenta si no la hay, idealmente a RW=CW, de forma que la ventana de emisión es min(RW,CW).

Fases de control de flujo

Se empieza con tamaño CW = 1, es decir, un segmento MSS máximo. Fase de arranque lento, por cada segmento enviado se aumenta en 1 el tamaño de CW (crecimiento exponencial) hasta llegar al umbral STT (Slow Start Threshold), que suele ser 32kB. Fase de evitación de congestión, a partir de STT, CW se incrementa en 1 por cada ventana confirmada (CW segmentos), provoca crecimiento lineal. Fase constante, cuando CW alcanza RW.

Detección de la congestión

Se materializa en la reducción del tamaño de la CW, en base a 2 eventos: 1. Recepción de 3 ACKs duplicados (ACK llegan tarde router no puede procesar y reexpedir paquetes al ritmo que los recibe): congestión leve. Divide CW (congestion window/umbral) a la mitad, y se pone en fase lineal. 2. Expiración de RTO (timeout): congestión elevada. Se pone STT=CW/2, luego CW=1, e inicia arranque lento.

Entradas relacionadas: