DOKK / manpages / debian 10 / manpages-es / tcp.7.es
TCP(7) Manual del Programador de Linux TCP(7)

tcp - Protocolo TCP.

#include <sys/socket.h>
#include <netinet/in.h>
tcp_socket = socket(PF_INET, SOCK_STREAM, 0);

Ésta es una implementación del protocolo TCP definido en RFC793, RFC1122 y RFC2001 con las extensiones NewReno y SACK. Proporciona una conexión bidireccional, fiable y orientada a conexión entre dos conectores (``sockets'') encima de ip(7), tanto para la versión 4 como para la versión 6. TCP garantiza que los datos llegan en orden y retransmite los paquetes perdidos. Genera y comprueba una suma de verificación por paquete para detectar errores de transmisión. TCP no conserva los límites entre registros.

Un conector TCP recién creado no tiene ni dirección remota ni local y no está totalmente especificado. Para crear una conexión TCP de salida use connect(2) para establecer una conexión con otro conector TCP. Para recibir nuevas conexiones de entrada, primero enlace el conector a una dirección local y puerto mediante bind(2) y a continuación llame a listen(2) para colocar el conector en estado de escucha. Después de esto, se puede aceptar un nuevo conector para cada conexión de entrada usando accept(2). Un conector sobre el que se han ejecutado con éxito accept o connect está totalmente especificado y puede transmitir datos. No se pueden transmitir datos a través de conectores en estado de escucha o no conectados todavía.

La versión 2.2 de Linux soporta las extensiones RFC1323 para TCP de alto rendimiento. Estas incluyen protección contra la repetición de números de secuencia (PAWS, ``Protection Against Wrapped Sequence Numbers''), ampliación de ventana (``Window Scaling'') y fechados (``Timestamps''). La ampliación de ventana permite el uso de grandes ventanas TCP (> 64K) para dar soporte a enlaces con una alta latencia o un gran ancho de banda. Para usarlas, se deben incrementar los tamaños de los buffers de envío y recepción. Se pueden configurar globalmente con las variables sysctls net.ipv4.tcp_wmem y net.ipv4.tcp_rmem, o para cada conector individual mediante las opciones de conector SO_SNDBUF y SO_RCVBUF con la llamada setsockopt(2).

Los tamaños máximos de los buffers de los conectores declarados a través de SO_SNDBUF y SO_RCVBUF están limitados por las sysctls globales net.core.rmem_max y net.core.wmem_max. Dese cuenta que TCP realmente asigna dos veces el tamaño del buffer solicitado en la llamada setsockopt(2), por lo que una llamada con éxito a getsockopt(2) no devolverá el mismo tamaño de buffer que el solicitado en la llamada setsockopt(2). TCP usa esto para propósitos administrativos y estructuras internas del núcleo, y las variables sysctl reflejan los tamaños mayores comparados con las ventanas TCP actuales. Para las conexiones individuales, el tamaño del buffer del conector se debe establecer antes de las llamadas listen() o connect() para que tenga efecto. Vea socket(7) para más información.

TCP soporta datos urgentes. Los datos urgentes se usan para indicar al receptor que algún mensaje importante es parte del flujo de datos y que debe ser procesado tan pronto como sea posible. Para enviar datos urgentes, especifique la opción MSG_OOB en send(2). Cuando se reciben datos urgentes, el núcleo envía una señal SIGURG al proceso lector o al proceso o grupo de procesos que han sido configurados para el conector usando la ioctl SIOCSPGRP o FIOSETOWN. Cuando la opción de conector SO_OOBINLINE está activa, los datos urgentes se colocan en el flujo normal de datos (y se pueden examinar mediante la ioctl SIOCATMARK). En otro caso, sólo se pueden recibir cuando se ha configurado la opción MSG_OOB en sendmsg(2).

La versión 2.4 de Linux introdujo varios cambios para mejorar el rendimiento y la escalabilidad, además de una funcionalidad mejorada. Algunas de estas características incluyen soporte para llamadas sendfile(2) sin copias internas de datos, Notificación Explícita de Congestión, nueva gestión de conectores TIME_WAIT, opciones ``keep-alive'' y soporte para extensiones de SACK Duplicados.

TCP está construido encima de IP (vea ip(7)). Los formatos de dirección definidos por ip(7) se aplican a TCP. TCP sólo soporta comunicaciones punto a punto. La difusión y el envío multidestino no están soportados.

Estas variables pueden ser accedidas mediante los ficheros /proc/sys/net/ipv4/* o con la interfaz sysctl(2). Además, las mayoría de las sysctls de IP también se aplican a TCP. Vea ip(7).

Activa el reinicio de conexiones si el servicio que escucha es demasiado lento y es incapaz de continuar y aceptarlas. No está activo por omisión. Significa que si se produjera un desbordamiento debido a una ráfaga de datos, la conexión se recuperará. Active esta opción «sólo» si verdaderamente está seguro de que el demonio que escucha no puede ser ajustado para aceptar conexiones más rápidamente. Activar esta opción puede perjudicar a los clientes de su servidor.
Considera que el gasto del almacenamiento temporal es bytes/2^tcp_adv_win_scale (si tcp_adv_win_scale > 0) o bytes-bytes/2^(-tcp_adv_win_scale) si el valor es <= 0. El valor por omisión es 2.

El espacio del buffer de recepción del conector se comparte entre la aplicación y el núcleo. TCP mantiene parte del buffer como ventana TCP; éste es el tamaño de la ventana de recepción que se comunica al otro extremo. El resto del espacio se usa como ``buffer de aplicación'', usado para aislar a la red de latencias de planificación y de la aplicación. El valor 2 por omisión de tcp_adv_win_scale implica que el espacio usado para el buffer de aplicación es un cuarto del total.

Esta variable define cuántos bytes de la ventana TCP se reservan para el gasto del almacenamiento temporal.

La cantidad de bytes de la ventana que se reservan para el buffer de la aplicación es el máximo de (window/2^tcp_app_win, mss). 0 significa que no se reserva ninguna cantidad. El valor por omisión es 31.

Activa el soporte para SACK Duplicados TCP según se describen en RFC2883. Está activo por omisión.
Activa la Notificación Explícita de Congestión (ECN, Explicit Congestion Notification), descrita en el RFC2884. No está activa por omisión. Cuando está activa, se podría ver afectada la conectividad a algunos destinos debido a la existencia a lo largo de la ruta de enrutadores antiguos con un comportamiento defectuoso, los cuales provocarían la pérdida de conexiones.
Activa el soporte para el Reconocimiento Adelantado (``Forward Acknowledgement'') TCP. Por omisión, está activo.
Cantidad de segundos a esperar un paquete FIN final antes de que el conector se cierre por la fuerza. Éstas es estrictamente una violación de la especificación TCP, pero se necesita para evitar ataques de denegación de servicio (DoS). El valor por omisión en los núcleos 2.4 es 60, por debajo de los 180 segundos de la versión 2.2.
Número de segundos entre dos sondas ``keep-alive'' TCP. El valor por omisión es 75 segundos.
Número máximo de sondas ``keep-alive'' TCP a enviar antes de abandonar y acabar con la conexión si no se obtiene respuesta desde el otro extremo. El valor por omisión es 9.
Número de segundos que una conexión necesita estar inactiva antes de que TCP comience a enviar sondas ``keep-alive''. Estas sondas sólo se envían cuando la opción de conector SO_KEEPALIVE está activa. El valor por omisión es 7200 segundos (2 horas). Una conexión inactiva se termina después de aproximadamente otros 11 minutos (9 sondas a intervalos de 75 segundos) cuando está activo el envío de sondas ``keep-alive''.

Dese cuenta que los mecanismos subyacentes de seguimiento de conexiones y los plazos de tiempo de las aplicaciones pueden ser mucho más pequeños.

Número máximo de conectores TCP huérfanos (no conectados a ningún manejador de fichero de usuario) que se permiten en el sistema. Cuando se sobrepasa este número, la conexión huérfana se reinicia y se muestra un aviso. Este límite existe sólo para evitar ataques DoS sencillos. No se recomienda reducir este límite. Las condiciones de la red podría hacer necesario que incremente el número de huérfanos permitidos, pero dese cuenta que cada huérfano puede gasta hasta ~64K de memoria no intercambiable. El valor por omisión inicial es igual al parámetro del núcleo NR_FILE. Este valor se ajusta dependiendo de la memoria del sistema.
Número máximo de peticiones de conexión encoladas que todavía no han recibido un reconocimiento desde el cliente que se está conectando. Si este número se supera, el núcleo comenzará a eliminar peticiones. El valor por omisión de 256 se incrementa a 1024 cuando la memoría que hay en el sistema es adecuada o grande (>= 128Mb) y se reduce a 128 en aquellos sistemas con muy poca memoria (<= 32Mb). Si se necesita incrementar este valor por encima de 1024, se recomienda que se modifique TCP_SYNQ_HSIZE para mantener TCP_SYNQ_HSIZE*16<=tcp_max_syn_backlog y que se recompile el núcleo.
Número máximo de conectores en el estado TIME_WAIT admitidos por el sistema. Este límite existe sólo para evitar ataques DoS sencillos. El valor por omisión de NR_FILE*2 se ajusta dependiendo de la memoria que haya en el sistema. Si este número se supera, se cierra el conector y se muestra una aviso.
Este es un vector de 3 enteros: [low, pressure, high]. Estos límites los usa TCP para hacer un seguimiento de su uso de memoria. Los valores por omisión se calculan durante el arranque a partir de la cantidad de memoria disponible.

low - TCP no regula su asignación de memoria cuando el número de páginas que ha asignado globalmente está por debajo de este número.

pressure - cuando la cantidad de memoria asignada por TCP supera este número de páginas, TCP modera su consumo de memoria. Este estado de presión de memoria se termina una vez que el número de páginas asignadas cae por debajo de la marca low.

high - número máximo de páginas que TCP asignará de forma global. Este valor invalida cualquier otro límite impuesto por el núcleo.

Número máximo de intentos realizados para sondear el otro extremo de una conexión que ha sido cerrada por nuestro extremo. El valor por omisión es 8.
El máximo que un paquete puede ser reorganizado en un flujo de paquetes TCP sin que TCP asuma pérdida de paquetes y sin que se ponga a hacer un lento inicio. El valor por omisión es 3. No es aconsejable cambiar este número. Ésta es una métrica de detección de reorganización de paquetes diseñada para minimizar retrocesos y retransmisiones innecesarios provocados por la reorganización de paquetes en una conexión.
Intentar enviar paquetes de tamaño máximo durante las retransmisiones. Esto está activo por defecto.
Número de veces que TCP intentará retransmitir un paquete en una conexión establecida normalmente, sin el esfuerzo extra de que se involucren las capas de red. Una vez se supera este número de retransmisiones, primero hacemos que la capa de red actualice la ruta si es posible antes de cada nueva retransmisión. El valor por omisión es 3, el mínimo especificado en el RFC.
Número máximo de veces que un paquete TCP se retransmite con estado ``establecido'' antes de abandonarlo. El valor por omisión es 15, que corresponde a una duracción de, aproximadamente, entre 13 y 30 minutos, dependiendo del plazo de retransmisión. El límite mínimo de 100 segundos especificado por RFC1122 normalmente se considera demasiado pequeño.
Activa el comportamiento TCP que se ajusta al RFC 1337. Esto no está activo por omisión. Cuando no está activo, si se recibe un RST en un estado TIME_WAIT, cerramos el conector inmediatamente sin esperar el fin del periodo TIME_WAIT.
Éste es un vector de 3 enteros: [min, default, max]. Estos parámetros los usa TCP para regular los tamaños de los buffers de recepción. TCP ajusta dinámicamente el tamaño del buffer de recepción a partir de los valores por omisión listados más abajo, en el rango de estas variables sysctl, dependiendo de la memoria disponible en el sistema.

min - tamaño mínimo del buffer de recepción usado por cada conector TCP. El valor por omisión es 4K y se reduce a PAGE_SIZE bytes en sistemas con poca memoria. Este valor se usa para asegurar que, en el modo de presión de memoria, las asignaciones de memoria por debajo de este tamaño todavía tendrán éxito. Esto no se usa para limitar el tamaño del buffer de recepción declarado usando SO_RCVBUF en un conector.

default - el tamaño por omisión del buffer de recepción de un conector TCP. Este valor sobrescribe el tamaño por omisión inicial del buffer que viene dado por el valor genérico global net.core.rmem_default, definido para todos los protocolos. El valor por omisión es de 87380 bytes y se reduce a 43689 en sistemas con poca memoria. Si se desean tamaños de buffers de recepción mayores, se debería incrementar este valor (para que afecte a todos los conectores). Para que se empleen ventanas TCP grandes, se debe activar (valor por omisión) net.ipv4.tcp_window_scaling.

max - tamaño máximo del buffer de recepción usado por cada conector TCP. Este valor no invalida el valor global net.core.rmem_max. Esto no se usa para limitar el tamaño del buffer de recepción declarado usando SO_RCVBUF sobre un conector. El valor por omisión de 87380*2 bytes se reduce a 87380 en sistemas con poca memoria.

Activa los Reconocimientos Selectivos TCP descritos por el RFC2018. Esto está activo por omisión.
Activa la interpretación estricta RFC793 del campo puntero-urgente de TCP. El valor por omisión es usar la interpretación compatible con BSD del puntero urgente, que apunta al primer byte tras los datos urgentes. La interpretación RFC793 es hacer que apunte al último byte de los datos urgentes. Activar esta opción puede conducir a problemas de interoperatividad.
Número máximo de veces que se retransmitirá un segmento SYN/ACK para una conexión TCP pasiva. Este número no debería ser mayor que 255. El valor por omisión es 5.
Activa los ``syncookies'' TCP. Se debe compilar el núcleo con CONFIG_SYN_COOKIES. Envía ``syncookies'' cuando la cola de paquetes syn pendientes de un conector se desborda. Los ``syncookies'' intentan proteger a un conector de un ataque por la llegada en avalancha de paquetes SYN. Esto se debería usar como último recurso o nunca. Esto es una violación del protocolo TCP y entra en conflicto con otras áreas de TCP como las extensiones TCP. Puede producir problemas para clientes y nodos repetidores. No se recomienda como mecanismo de ajuste para ayudar a servidores muy cargados en condiciones de sobrecarga o de mala configuración. Para alternativas recomendadas, vea tcp_max_syn_backlog, tcp_synack_retries, tcp_abort_on_overflow.
Número máximo de veces que se retransmitirán SYNs iniciales para un intento activo de conexión TCP. Este valor no debería ser mayor que 255. El valor por omisión es 5, que se corresponde a, aproximadamente, 180 segundos.
Activa fechados TCP según el RFC1323. Esto está activo por omisión.
Activa el reciclado rápido de conectores TIME-WAIT. No está activo por omisión. No se recomienda activar esta opción ya que produce problemas cuando se trabaja con NAT (Network Address Translation).
Activa la ampliación de ventanas TCP según el RFC1323. Esto está activo por omisión. Esta característica permite el uso de una ventana grande (> 64K) en conexiones TCP, aunque el otro extremo debería soportarla. Normalmente, el campo de 16 bit de longitud de ventana en la cabecera TCP limita el tamaño de ventana a menos de 64K bytes. Si se desean ventanas mayores, las aplicaciones pueden incrementar el tamaño de sus buffers de conectores y se empleará la opción de ampliación de ventanas. Si tcp_window_scaling se desactiva, TCP no negociará el uso de la ampliación de ventanas con el otro extremo durante el establecimiento de la conexión.
Éste es un vector de 3 enteros: [min, default, max]. Estos parámetros los usa TCP para regular los tamaños de los buffers de envío. TCP ajusta dinámicamente el tamaño del buffer de envío a partir de los valores por omisión listados más abajo, en el rango de estas variables sysctl, dependiendo de la memoria disponible en el sistema.

min - tamaño mínimo del buffer de envío usado por cada conector TCP. El valor por omisión es de 4K bytes. Este valor se usa para asegurar que, en el modo de presión de memoria, las asignaciones de memoria por debajo de este tamaño todavía tendrán éxito. Esto no se usa para limitar el tamaño del buffer de envío declarado usando SO_SNDBUF en un conector.

default - el tamaño por omisión del buffer de envío un conector TCP. Este valor sobrescribe el tamaño por omisión inicial del buffer que viene dado por el valor genérico global net.core.wmem_default, definido para todos los protocolos. El valor por omisión es de 16K. Si se desean tamaños de buffers de envío mayores, se debería incrementar este valor (para que afecte a todos los conectores). Para que se empleen ventanas TCP grandes, se debe activar (valor por omisión) la variable sysctl. net.ipv4.tcp_window_scaling.

max - tamaño máximo del buffer de envío usado por cada conector TCP. Este valor no invalida el valor global net.core.wmem_max. Esto no se usa para limitar el tamaño del buffer de envío declarado usando SO_SNDBUF sobre un conector. El valor por omisión de 128K bytes. Se reduce a 64K dependiendo de la memoria disponible en el sistema.

Para establecer u obtener la opción de un conector TCP, llame a getsockopt(2) para leerla o a setsockopt(2) para escribirla, asignando SOL_TCP. al argumento del nivel de opción. Además, la mayoría de las opciones de conector SOL_IP son válidas para conectores TCP. Para más información vea ip(7).

Si se activa, no se envían tramas parciales. Todas las tramas parciales encoladas se envían cuando esta opción se desactiva de nuevo. Es útil para añadir cabeceras antes de llamar a sendfile(2) o para optmizar el rendimiento. Esta opción no se puede combinar con TCP_NODELAY. No debería usar esta opción si desea que su código sea transportable.
Permite despertar a un proceso oyente sólo cuando lleguen datos al conector. Toma un valor entero (segundos). Puede limitar el número máximo de intentos que hará TCP para terminar de establecer la conexión. No debería usar esta opción si desea que su código sea transportable.
Se usa para recoger información sobre este conector. El núcleo devuelve una estructura tcp_info como la que se define en el fichero /usr/include/linux/tcp.h. No debería usar esta opción si desea que su código sea transportable.
Número máximo de sondas ``keep-alive'' que TCP debería enviar antes de abandonar la conexión. No debería usar esta opción si desea que su código sea transportable.
Tiempo (en segundos) que la conexión necesita estar ociosa antes de que TCP empiece a enviar sondas ``keep-alive'' si la opción de conector SO_KEEPALIVE se ha activado en este conector. No debería usar esta opción si desea que su código sea transportable.
Tiempo (en segundos) entre sondas ``keep-alive''. No debería usar esta opción si desea que su código sea transportable.
Tiempo de vida de conectores que han quedado huérfanos en estado FIN_WAIT2. Esta opción se puede usar para invalidar la sysctl global del sistema tcp_fin_timeout en este conector. No confundir con la opción SO_LINGER del nivel de conectores (socket(7)). No debería usar esta opción si desea que su código sea transportable.
Tamaño máximo de segmento para los paquetes TCP de salida. Si se establece esta opción antes del establecimiento de conexiones, también cambia el valor MSS anunciado al otro extremo en el paquete inicial. Valores mayores que la MTU de la interfaz que finalmente se use no tienen efecto. TCP también impondrá sus límites mínimo y máximo sobre el valor dado.
Si se usa, desactiva el algoritmo de Nagle. Esto significa que los segmentos siempre se envían tan pronto como sea posible, aunque sólo haya una pequeña cantidad de datos. Cuando no se usa, los datos se almacenan temporalmente hasta que haya una cantidad suficiente para ser enviada, evitando así el envío frecuente de pequeños paquetes que ocasiona una pobre utilización de la red. Esta opción no se puede usar a la misma vez que la opción TCP_CORK.
Activa el modo ``quickack'' cuando se pone a 1 y lo desactiva cuando se pone a 0. En el modo ``quickack'', los reconocimientos se envían inmediatamente, antes de retrasarlos si es necesario conforme a un funcionamiento normal de TCP. Esta opción no es permanente, sólo permite un cambio a o desde el modo ``quickack''. Las operaciones posteriores del protocolo TCP entrarán/saldrán otra vez del modo ``quickack'' dependiendo del procesamiento interno del protocolo y de factores tales como la expiración de plazos de reconocimientos retrasados y la transferencia de datos. No debería usar esta opción si desea que su código sea transportable.
Establece el número de retransmisiones SYN que debe enviar TCP antes de abortar el intento de conexión. No puede exceder de 255. No debería usar esta opción si desea que su código sea transportable.
Limita el tamaño de la ventana anunciada a este valor. El núcleo impone un tamaño mínimo de SOCK_MIN_RCVBUF/2. No debería usar esta opción si desea que su código sea transportable.

Estas ioctls pueden ser accedidas usando ioctl(2). La sintaxis correcta es:

int value;
error = ioctl(tcp_socket, ioctl_type, &value);
Devuelve la cantidad de datos encolados sin leer en el buffer de recepción. El argumento es un puntero a un entero. El conector no debe estar en estado LISTEN, de lo contrario se devolverá un error (EINVAL).
Devuelve cierto cuando el programa de usuario ya ha recibido todos los datos urgentes. Esto se usa junto con SO_OOBINLINE. El argumento es un puntero a un entero para el resultado de la comprobación.
Devuelve la cantidad de datos sin enviar en la cola de envío del conector en el puntero a un valor entero pasado. El conector no debe estar en estado LISTEN, de lo contrario se devolverá un error (EINVAL).

Cuando se produce un error de red, TCP intenta reenviar el paquete. Si no tiene éxito después de un cierto tiempo, informa o bien de un error ETIMEDOUT o bien del último error recibido sobre esta conexión.

Algunas aplicaciones necesitan una notificación más rápida del error. Esto se puede hacer con la opción de conector IP_RECVERR del nivel SOL_IP. Cuando se activa esta opción, todos los errores de entrada son pasado inmediatamente al programa de usuario. Use esta opción con cuidado (hace que TCP sea menos tolerante a cambios de enrutamiento y a otras condiciones de red normales).

Cuando se produce un error, al configurar una conexión, durante la escritura en un conector, sólo se produce una señal SIGPIPE cuando está activa la opción de conector SO_KEEPALIVE.

TCP no posee verdaderos datos fuera de orden, posee datos urgentes. En Linux esto significa que si el otro extremo envía datos fuera de orden recientes, los anteriores datos urgentes se insertarán como datos normales en el flujo (incluso cuando SO_OOBINLINE no está activa). Esto difiere de las pilas de protocolo basadas en BSD.

Linux usa por defecto una interpretación del campo puntero urgente compatible con BSD. Esto viola el RFC1122 pero se necesita por interoperatividad con otras pilas. Se puede cambiar con la sysctl tcp_stdurg.

El otro extremo ha cerrado el conector inesperadamente o se ha intentado leer de un conector desconectado.
El otro extremo no ha reconocido los datos retransmitidos después de cierto tiempo.
El tipo de dirección de conector pasado en sin_family no es AF_INET.

TCP también puede devolver cualquier error definido por ip(7) o la capa de conectores genéricos.

No se han documentado todos los errores.
No se ha descrito IPv6.

El soporte para la Notificación Explícita de la Congestión, sendfile sin copias internas de datos, la reorganización de paquetes y algunas extensiones SACK (DSACK) se introdujo en la versión 2.4. El soporte para el Reconocimiento Adelantado (FACK), el reciclado de conectores en estado TIME_WAIT, opciones ``keep-alive'' para conexiones individuales y las sysctls se introdujo en la versión 2.3.

Los valores por omisión y las descripciones de la variables sysctl dados más arriba son aplicables para la versión 2.4 del núcleo.

Esta página de manual fue escrita originariamente por Andi Kleen. Nivedita Singhvi la actualizó para la versión 2.4 de Linux con la información del documento Documentation/networking/ip-sysctls.txt de Alexey Kuznetsov.

socket(7), socket(2), ip(7), bind(2), listen(2), accept(2), connect(2), sendmsg(2), recvmsg(2), sendfile(2), sysctl(2), getsockopt(2).

RFC793 para la especificación de TCP.
RFC1122 para los requisitos de TCP y una descripción del algoritmo Nagle.
RFC1323 para las opciones TCP de fechado y de ampliación de ventana.
RFC1644 para una descripción de los peligros que conlleva el ``asesinato'' de los conectores TIME_WAIT.
RFC2481 para una descripción de la Notificación Explícita de la Congestión.
RFC2581 para los algoritmos TCP de control de la congestión.
RFC2018 y RFC2883 para SACK y sus extensiones.

20 abril 2002 Página man de Linux