TCP

Transmission Control Protocol.

  • Orientado a la conexión, funciones:

    • Multiplexación.

    • Control de flujo.

    • Control de congestión: Mediante el mecanismo llamado Explicit Congestion Notification (ECN).

    • Control de errores.

    • Retransmisión de segmentos perdidos o erróneos.

  • Define un cliente que inicia la conexión y un servidor que escucha y espera conexiones.

  • Se define un socket que es un conjunto de protocolo, dirección IP y puerto. Los puertos del 0 al 1023 están reservados para servicios bien conocidos.

  • Se define una conexión que es un conjunto de dos sockets, uno local y otro de destino.

  • Puede realizarse más de una conexión desde un socket hacia sockets distintos pero no se puede establecer una doble conexión entre los mismos dos sockets.

  • Cada mensaje se denomina segmento.

  • En las conexiones sin estado como HTTP se suele usar RST en lugar de FIN.

  • Tipos de servidores:

    • Iterativo: Atiende y corta la conexión rápidamente.

    • Concurrente: Duplica el socket y sigue atendiendo a más clientes.

  • Para hacer un firewall que impida conectarse a un host en la LAN hay que bloquear los paquetes entrantes con SYN = 1 y ACK = 0.

  • Usa un saludo de tres vías para la conexión y desconexión, ver captura al final.

Capturas

Resumen de Wireshark de conexión hacia un servidor escuchando en el puerto 1234:

60684 → 1234 [SYN]      Seq=0 Win=43690 Len=0 MSS=65495 SACK_PERM=1 TSval=1769821607 TSecr=0 WS=1024
1234 → 60684 [SYN, ACK] Seq=0 Ack=1 Win=43690 Len=0 MSS=65495 SACK_PERM=1 TSval=1769821608 TSecr=1769821607 WS=1024
60684 → 1234 [ACK]      Seq=1 Ack=1 Win=44032 Len=0 TSval=1769821608 TSecr=1769821608
60684 → 1234 [PSH, ACK] Seq=1 Ack=1 Win=44032 Len=4 TSval=1769822630 TSecr=1769821608
1234 → 60684 [ACK]      Seq=1 Ack=5 Win=44032 Len=0 TSval=1769822630 TSecr=1769822630
60684 → 1234 [PSH, ACK] Seq=5 Ack=1 Win=44032 Len=4 TSval=1769822908 TSecr=1769822630
1234 → 60684 [ACK]      Seq=1 Ack=9 Win=44032 Len=0 TSval=1769822908 TSecr=1769822908
60684 → 1234 [PSH, ACK] Seq=9 Ack=1 Win=44032 Len=2 TSval=1769823673 TSecr=1769822908
1234 → 60684 [ACK]      Seq=1 Ack=11 Win=44032 Len=0 TSval=1769823673 TSecr=1769823673
60684 → 1234 [FIN, ACK] Seq=11 Ack=1 Win=44032 Len=0 TSval=1769824716 TSecr=1769823673
1234 → 60684 [FIN, ACK] Seq=1 Ack=12 Win=44032 Len=0 TSval=1769824716 TSecr=1769824716
60684 → 1234 [ACK]      Seq=12 Ack=2 Win=44032 Len=0 TSval=1769824716 TSecr=1769824716

Funciones

El sistema operativo define ciertas funciones para trabajar con sockets:

  • socket: Crea un socket, recibe el tipo y protocolo.

  • bind: Asocia el socket a una dirección IP y puerto.

  • listen: Inicia la escucha en el socket, usado por el servidor.

  • connect: Inicia la conexión a un servidor, usado por el cliente.

  • accept: Aceptar conexión entrante, usado por el servidor.

  • send, write: Enviar datos.

  • receive, read: Recibir datos.

  • close: Cerrar conexión.

Control de flujo

  • Se utiliza para impedir que un host envíe datos demasiado rápido de tal forma que el dispositivo receptor no llega a procesarlos.

  • Utiliza una ventana deslizante, cuyo tamaño es informado al otro host en el campo Window Size.

Control de congestión

  • Se utiliza para impedir congestionar la red con demasiados segmentos.

  • Se utilizan algoritmos específicos, que generalmente contienen una segunda ventana deslizante que no es informada en los segmentos. Este tamaño de ventana es interno a cada host y se calcula a partir de los ACKs, el RTT, etc.

  • Algunos algoritmos usados son Reno, NewReno, Tahoe, Cubic, etc.

  • Funciona bien cuando el Bandwidth-delay Product (BDP) es bajo. Se calcula como la capacidad de la red (en bits por segundo) y el RTT (en segundos).