Se la llama como “orientada a conexión” dado que los procesos afectados deberán enviarse segments previos a la comunicación de modo que se establezcan ciertos parámetros antes de la misma. Este tipo de conexión provee un servicio full-duplex donde los datos de ambos procesos van y vienen entre uno y otro, siempre habiendo dos partes en la comunicación.
Llamaremos al proceso que inicia la conexión como el proceso cliente (PC) mientras el otro es el proceso servidor (PS) a este procedimiento de establecimiento de conexión se lo llama “three way handshake”. Ahora ambos procesos pueden enviarse información, consideremos que el cliente envía datos mediante el socket con lo cual TCP dirige estos datos al send buffer de la conexión (inicializado durante el handshake). De vez en cuando TCP toma bloques de datos de este buffer y los pasa a la capa de red. La máxima cantidad de datos a ubicar en un segment se limita por el MSS (maximum segment size). TCP agrega un encabezado, formando así segmentos TCP que se transmiten a la capa de red, donde se encapsulan por separado dentro de datagramas IP de la capa de red que luego se envían. Cuando TCP recibe un segmento en el otro extremo, los datos de este se almacenan en el receive buffer de la conexión TCP (cada lado de ella cuenta con ambos buffers), luego la aplicación lee datos de este buffer.


TCP considera los datos como un flujo de bytes ordenado. Los seq# se asignan al flujo de bytes transmitidos y no a la serie de segmentos transmitidos. Por lo tanto, el seq# de un segmento es el número de flujo de bytes del primer byte del segmento. Si un proceso en el host A desea enviar un flujo de datos a un proceso en el host B mediante una conexión TCP, en el host A se numerará implícitamente cada byte del flujo de datos. Supongamos que el flujo de datos consiste en un archivo de 500 000 bytes, que el MSS es de 1000 bytes y que el primer byte del flujo de datos tiene el número 0. Por lo tanto TCP construye 500 segmentos a partir del flujo de datos donde al primero se le asigna el seq# 0, al segundo, el 1000, al tercero, el 2000, y así sucesivamente.

Dado que el host A puede recibir datos del host B mientras envía datos al host B. Cada segmento que llega del host B tiene un número de secuencia para los datos que fluyen de B a A. El ack# que el host A coloca en su segmento es el número de secuencia del siguiente byte que el host A espera del host B. Por ejemplo supongamos que el host A ha recibido todos los bytes del 0 al 535 de B y que está a punto de enviar un segmento al host B. El host A espera el byte 536 y todos los bytes subsiguientes en el flujo de datos del host B. Por lo tanto, el host A coloca 536 en el campo de ack# del segmento que envía a B.
Denotamos SampleRTT como la cantidad de tiempo entre el envío de un segmento y la recepción de su ACK. Los valores de SampleRTT fluctuarán entre segmentos debido a la congestión en los enrutadores y a la carga variable en los sistemas finales. Debido a esta fluctuación, cualquier valor de SampleRTT puede ser atípico. TCP mantiene un promedio, llamado EstimatedRTT, de los valores de SampleRTT. Al obtener un nuevo SampleRTT, TCP actualiza el EstimatedRTT según la siguiente fórmula: