Scroll to navigation

tcp(7) Miscellaneous Information Manual tcp(7)

NOMBRE

tcp - Protocolo TCP

SINOPSIS

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

DESCRIPCIÓN

Ésta es una implementación del protocolo TCP definido en RFC 793, RFC 1122 y RFC 2001 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 socket TCP recién creado no tiene dirección remota ni local ni está completamente definido. Para crear una conexión TCP saliente con otro socket TCP, se utiliza connect(2). Para recibir nuevas conexiones entrantes, primero conecte el socket con bind(2) a una dirección y puerto locales y luego invoque a listen(2) para que esté a la escucha. Posteriormente, se puede aceptar un nuevo socket para cada conexión entrante mediante accept(2). Un socket al que se le ha llamado correctamente accept(2) o connect(2) está completamente definido y ya puede transmitir datos. No se podrán transmitir datos en sockets que estén a la escucha o que aún no están conectados.

Linux admite extensiones TCP de alto rendimiento RFC 1323. Estas incluyen la Protección contra Números de Secuencia Encapsulados (PAWS), el Escalado de Ventanas y las Marcas de Tiempo. El escalado de ventanas permite el uso de ventanas TCP grandes (por ejemplo, 64 kB) para admitir enlaces con alta latencia o gran ancho de banda. Para aprovecharlas, será necesario aumentar el tamaño del búfer de envío y recepción. Estos se pueden configurar globalmente con los archivos /proc/sys/net/ipv4/tcp_wmem e /proc/sys/net/ipv4/tcp_rmem, o en sockets individuales mediante las opciones de socket SO_SNDBUF y SO_RCVBUF con la llamada setsockopt(2).

Los tamaños máximos de los búferes de socket declarados mediante los mecanismos SO_SNDBUF y SO_RCVBUF están limitados por los valores de los archivos /proc/sys/net/core/rmem_max e /proc/sys/net/core/wmem_max. Tenga en cuenta que TCP asigna el doble del tamaño del búfer solicitado en la llamada setsockopt(2), por lo que una llamada getsockopt(2) posterior no devolverá el mismo tamaño de búfer solicitado en la llamada setsockopt(2). TCP utiliza el espacio adicional para fines administrativos y para las estructuras internas del núcleo. Los valores del archivo /proc reflejan los tamaños mayores en comparación con las ventanas TCP reales. En conexiones individuales, el tamaño del búfer del socket debe configurarse antes de las llamadas listen(2) o connect(2) para que surta efecto. Consulte socket(7) para obtener más información.

TCP admite datos urgentes. Los datos urgentes se utilizan para indicar al receptor que algún mensaje importante forma parte del flujo de datos y que debe procesarse lo antes posible. Para enviar datos urgentes, debe indicarse la opción MSG_OOB en send(2). Cuando se reciben datos urgentes, el núcleo envía una señal SIGURG al proceso o grupo de procesos configurado como «propietario» del socket mediante las ioctls SIOCSPGRP o FIOSETOWN (o la operación fcntl(2) F_SETOWN definida en POSIX.1). Cuando la opción de socket SO_OOBINLINE está habilitada, los datos urgentes se introducen en el flujo de datos normal (un programa podrá comprobar su ubicación mediante la ioctl SIOCATMARK que se describe más adelante); de lo contrario, solo se pueden recibir cuando el indicador MSG_OOB está configurado para recv(2) o recvmsg(2).

Cuando existan datos obsoletos, select(2) señala el descriptor de archivo como en condiciones ecepcionales y poll (2) indica un evento POLLPRI.

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.

Formato de las direcciones

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.

Interfaces /proc

Es posible acceder a los parámetros TCP aplicables a todo el sistema a través del archivo /proc/sys/net/ipv4/. También muchas interfaces IP en /proc son aplicables también a TCP, consulte ip(7). Las variables de tipo Booleano pueden tomar un valor entero distinto de cero ("verdadero") para indicar que la opción correspondiente está activada o un valor cero ("falso") para indicar que está inactiva.

Controla el recuento de bytes apropiado (ABC), definido en el RFC 3465. ABC es una forma de aumentar la ventana de congestión (cwnd) más lentamente en respuesta a acuses de recibo parciales. Los valores posibles son:
0
Incrementa cwnd una vez por cada confirmación (sin ABC)
1
Incrementa cwnd una vez por cada confirmación de segmento completo
2
Permite incrementar cwnd en dos si la confirmación es de dos segmentos para compensar las confirmaciones con retraso.
Activa el reinicio de conexiones si el servicio que escucha es demasiado lento y es incapaz de continuar y aceptarlas. 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.
Contabiliza la sibrecarga del buffer como bytes/2^tcp_adv_win_scale, si tcp_adv_win_scale es mayor que cero o bien bytes-bytes/2^(-tcp_adv_win_scale), si tcp_adv_win_scale es menor o igual a cero.
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.
Muestra/configura las opciones del algoritmo de control de congestión disponibles para procesos sin privilegios (consulte la descripción de la opción de socket TCP_CONGESTION). Los elementos de la lista se separan por espacios en blanco y terminan con un carácter de nueva línea. La lista es un subconjunto de las que se listan en tcp_available_congestion_control. El valor predeterminado de esta lista es «reno» más la configuración predeterminada de tcp_congestion_control.
Si esta opción está habilitada, el núcleo intenta fusionar mensajes pequeños (de llamadas consecutivas a write(2) y sendmsg(2)) tanto como sea posible para reducir el número total de paquetes enviados. La fusión se realiza si al menos un paquete previo del flujo está esperando en las colas de Qdisc o en la cola de transmisión del dispositivo. Las aplicaciones aún pueden usar la opción de socket TCP_CORK para obtener un comportamiento óptimo cuando saben cómo/cuándo desconectan sus sockets.
Muestra una lista de los algoritmos de control de congestión registrados. Los elementos de la lista están separados por espacios en blanco y terminan con un carácter de nueva línea. Esta lista limita la lista en tcp_allowed_congestion_control. Es posible que haya más algoritmos de control de congestión disponibles como módulos, pero no cargados.
Esta variable define cuántos bytes de la ventana TCP se reservan para el gasto del almacenamiento temporal.
Un máximo de (window/2^tcp_app_win, mss) bytes en la ventana están reservados para el búfer de la aplicación. Un valor de 0 implica que no se reserva ninguna cantidad.
El valor inicial de search_low que utilizará la capa de paquetización para el descubrimiento de la MTU de ruta (sondeo de MTU). Si el sondeo de MTU está habilitado, éste será el MSS inicial utilizado por la conexión.
Habilita el algoritmo de control de congestión BIC-TCP. BIC-TCP es un cambio exclusivo del lado del emisor que garantiza una equidad lineal de RTT en ventanas grandes, a la vez que ofrece escalabilidad y compatibilidad con TCP. El protocolo combina dos esquemas: aumento incremental y aumento de búsqueda binaria. Cuando la ventana de congestión es grande, el aumento incremental con un incremento grande garantiza una equidad lineal de RTT, así como una buena escalabilidad. En ventanas de congestión pequeñas, el aumento de búsqueda binaria proporciona compatibilidad con TCP.
Establece el umbral de ventana (en paquetes) donde BIC TCP comienza a ajustar la ventana de congestión. Por debajo de este umbral, BIC TCP se comporta igual que el TCP Reno predeterminado.
Fuerza a BIC TCP a responder más rápidamente a los cambios en la ventana de congestión. Permite que dos flujos que comparten la misma conexión converjan más rápidamente.
Establece el algoritmo de control de congestión predeterminado que se utilizará en las nuevas conexiones. El algoritmo «reno» siempre está disponible, pero pueden darse opciones adicionales según la configuración del núcleo. El valor predeterminado de este archivo se establece como parte de la configuración del núcleo.
Límite inferior, en bytes, del tamaño de las lecturas de socket que se transferirán a un motor de copia DMA, si existe uno en el sistema y se configuró el núcleo con la opción CONFIG_NET_DMA.
Activa el soporte para SACK Duplicados TCP según se describen en RFC 2883.
Habilita la compatibilidad con la Apertura Rápida RFC 7413. El indicador se utiliza como un mapa de bits con los siguientes valores:
0x1
Activa el soporte Fast Open en la parte del cliente
0x2
Activa el soporte de Fast Open en la parte del servidor
0x4
Permite al cliente transmitir datos en SYN sin la opción Fast Open
0x200
Permite al servidor aceptar datos SYN sin la opción Fast Open
0x400
Activa Fast Open en todos los que están a la escucha sin la opción TCP_FASTOPEN
Establece la clave de Apertura Rápida RFC 7413 del servidor para generar una cookie cuando la compatibilidad con Apertura Rápida del servidor esté habilitada.
Activa la Notificación Explícita de la Congestión (RFC 3168).
Este archivo puede tener uno de los siguientes valores:
0
Desactiva ECN. Ni se inicia, ni se acepta ECN. Predeterminado a partir de Linux 2.6.30.
1
Habilita ECN cuando lo soliciten las conexiones entrantes y también lo solicita en los intentos de conexión salientes.
2
Habilita ECN cuando lo soliciten las conexiones entrantes, pero no lo solicita en las conexiones salientes. Este valor es compatible y predeterminado desde Linux 2.6.31.
Al habilitarse, la conectividad a algunos destinos podría verse afectada debido a la presencia de módulos intermedios antiguos y con un deficiente funcionamiento a lo largo de la ruta, lo que provoca la pérdida de conexiones. Sin embargo, para facilitar y fomentar la implementación con la opción 1 y solucionar este tipo de equipos con errores, se ha introducido la opción tcp_ecn_fallback.
Habilita la opción de respaldo según RFC 3168, Sección 6.1.1.1. Al habilitarse, los SYN salientes de configuración ECN que agoten el tiempo de espera dentro del tiempo de espera normal de retransmisión de SYN se reenviarán con CWR y ECE desactivados.
Activa el soporte para el Reconocimiento Adelantado (“Forward Acknowledgement”) TCP.
Esto especifica cuántos segundos se debe esperar para un paquete FIN final antes de que el socket se cierre forzosamente. Esto constituye una violación estricta de la especificación TCP, pero es necesario para evitar ataques de denegación de servicio. En Linux 2.2, el valor predeterminado era 180.
Habilita F-RTO, un algoritmo de recuperación mejorado para agotamientos de tiempos de espera de retransmisión TCP (RTO). Resulta especialmente beneficioso en entornos inalámbricos donde la pérdida de paquetes suele deberse a interferencias de radio aleatorias, en lugar de a la congestión del enrutador intermedio. Consulte RFC 4138 para obtener más información.
Este archivo puede tener uno de los siguientes valores:
0
Deshabilitado. Este era el valor predeterminado hasta Linux 2.6.23 inclusive.
1
La versión básica del algoritmo F-RTO está habilitada.
2
Habilita F-RTO mejorado con SACK si el flujo utiliza SACK. La versión básica también se puede usar cuando se utiliza SACK, aunque en ese caso existen escenarios en los que F-RTO interactúa de forma deficiente con el conteo de paquetes del flujo TCP con SACK habilitado. Este valor es el predeterminado desde Linux 2.6.24.
Antes de Linux 2.6.22, este parámetro era un valor booleano, compatible únicamente con los valores 0 y 1 superiores.
Cuando F-RTO detecta que un agotamiento de tiempo de espera de retransmisión de TCP es falso (es decir, el agotamiento se habría evitado si TCP hubiera establecido un tiempo de espera de retransmisión mayor), TCP tiene varias opciones para proceder. Los valores posibles son:
0
Basada en la reducción a la mitad de la tasa; una respuesta suave y conservadora resulta en la reducción a la mitad de la ventana de congestión (cwnd) y del umbral de inicio lento (ssthresh) después de un RTT.
1
Respuesta muy conservadora. No se recomienda porque -aunque es válida- interactúa mal con el resto de TCP de Linux; reduce inmediatamente a la mitad cwnd e ssthresh.
2
Respuesta agresiva. Deshace las medidas de control de congestión que ahora se consideran innecesarias (ignorando la posibilidad de una retransmisión perdida que requeriría mayor precaución por parte de TCP); cwnd e ssthresh se restauran a los valores previos al agotamiento del tiempo de espera.
Número de segundos entre dos sondas “keep-alive” TCP.
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.
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.
Si está habilitada, la pila TCP toma decisiones que priorizan una latencia menor en lugar de un mayor rendimiento. Si esta opción está deshabilitada, se prioriza un mayor rendimiento. Un ejemplo de una aplicación donde se debería cambiar este valor predeterminado sería un clúster de cómputo Beowulf. A partir de Linux 4.14, este archivo aún existe, pero su valor se ignora.
Número máximo de sockets TCP huérfanos (no asociados a ningún identificador de archivo de usuario) permitidos en el sistema. Cuando se supera este número, la conexión huérfana se restablece y se muestra una advertencia. Este límite existe únicamente para evitar ataques de denegación de servicio simples. No se recomienda reducirlo. Las condiciones de red podrían requerir un incremento en el número de huérfanos permitidos, pero tenga en cuenta que cada uno puede ocupar hasta ~64 kB de memoria no intercambiable. El valor inicial predeterminado es igual al parámetro del kernel NR_FILE. Este valor inicial predeterminado se ajusta según 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 (>= 128 MB) y se reduce a 128 en aquellos sistemas con muy poca memoria (<= 32 MB).
Antes de Linux 2.6.20, se recomendaba que, si era necesario aumentar este valor por encima de 1024, se modificara el tamaño de la tabla hash SYNACK (TCP_SYNQ_HSIZE) en include/net/tcp.h para mantenerlo y se recompilara el núcleo. En Linux 2.6.20, se eliminó el tamaño fijo de TCP_SYNQ_HSIZE en favor de un tamaño dinámico.

TCP_SYNQ_HSIZE * 16 <= tcp_max_syn_backlog
    

Y el núcleo debe recompilarse. En Linux 2.6.20, se eliminó el tamaño fijo TCP_SYNQ_HSIZE en favor de un tamaño dinámico.
Número máximo de conectores en el estado TIME_WAIT admitidos por el sistema. Este límite existe sólo para evitar ataques denial-of-service 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.
Si está habilitado, TCP realiza el ajuste del búfer de recepción, intentando cuadrar automáticamente su tamaño (no mayor que tcp_rmem[2]) para que coincida con el tamaño requerido por la ruta para un rendimiento completo.
Es un vector de 3 enteros: [bajo, presión, alto]. Estos límites, medidos en unidades del tamaño de página del sistema, son utilizados por TCP para rastrear el uso de memoria. Los valores predeterminados se calculan al arrancar a partir de la cantidad de memoria disponible. TCP solo puede usar poca memoria para esto, limitada a unos 900 megabytes en sistemas de 32 bits. Los sistemas de 64 bits no tienen esta limitación.
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.
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.
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.
Este parámetro controla el descubrimiento de la MTU de la ruta de la capa de empaquetamiento de TCP. Se pueden asignar los siguientes valores al archivo:
0
Desactivado
1
Deshabilitado por defecto, habilitado al detectar un agujero negro ICMP.
2
Siempre habilitado, usa el MSS inicial de tcp_base_mss.
Por defecto, TCP guarda varias métricas de conexión en la caché de ruta cuando se cierra la conexión, de modo que las conexiones que se establezcan próximamente puedan emplearlas para establecer las condiciones iniciales. Esto suele mejorar el rendimiento general, pero en ocasiones puede reducirlo. Si tcp_no_metrics_save está habilitado, TCP no almacenará en caché las métricas al cerrar las conexiones.
Número máximo de intentos realizados para sondear el otro extremo de una conexión que ha sido cerrada por nuestro extremo.
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. 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.
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 RFC 1122 normalmente se considera demasiado pequeño.
Activa el comportamiento TCP que se ajusta al RFC 1337. 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 valores, dependiendo de la memoria disponible en el sistema.
Tamaño mínimo del búfer de recepción utilizado por cada socket TCP. El valor predeterminado es el tamaño de página del sistema. (En Linux 2.4, el valor predeterminado es 4 kB, reducido a PAGE_SIZE bytes en sistemas con poca memoria). Este valor se utiliza para garantizar que, si se dispone de poca memoria, las asignaciones por debajo de este tamaño se realicen correctamente. No se utiliza para limitar el tamaño del búfer de recepción declarado mediante SO_RCVBUF en un socket.
Tamaño predeterminado del búfer de recepción para un socket TCP. Este valor sobrescribe el tamaño predeterminado inicial del búfer del net.core.rmem_default global genérico definido para todos los protocolos. El valor predeterminado es 87380 bytes. (En Linux 2.4, este valor se reducirá a 43689 en sistemas con poca memoria). Si se desean tamaños de búfer de recepción mayores, se deberá aumentar este valor (para que afecte a todos los sockets). Para emplear ventanas TCP grandes, se debe habilitar net.ipv4.tcp_window_scaling (valor predeterminado).
Tamaño máximo del búfer de recepción utilizado por cada socket TCP. Este valor no anula el valor global net.core.rmem_max. No se utiliza para limitar el tamaño del búfer de recepción declarado mediante SO_RCVBUF en un socket. El valor predeterminado se calcula mediante la fórmula:

max(87380, min(4 MB, tcp_mem[1]*PAGE_SIZE/128))
    

(En Linux 2.4, el valor predeterminado es 87380*2 bytes, reducido a 87380 en sistemas con poca memoria).
Activa los Reconocimientos Selectivos TCP descritos por el RFC 2018.
Si está habilitado, se ciñe a lo indicado en el RFC 2861 y agota el tiempo de espera de la ventana de congestión tras un período de inactividad. Un período de inactividad se define como el RTO (tiempo de espera de retransmisión) actual. Si está deshabilitado, no se agota el tiempo de espera de la ventana de congestión tras un período de inactividad.
Si esta opción está habilitada, se utiliza la interpretación RFC 1122 del campo de puntero urgente de TCP. Según esta interpretación, el puntero urgente apunta al último byte de los datos urgentes. Si está deshabilitada, se utiliza la interpretación compatible con BSD del puntero urgente: el puntero urgente apunta al primer byte después de los datos urgentes. Habilitar esta opción puede causar problemas de interoperabilidad.
El número máximo de veces que se retransmitirán los SYN iniciales en un intento de conexión TCP activo. Este valor no debe ser superior a 255. El valor predeterminado es 6, lo que corresponde a un tiempo de reintento de hasta aproximadamente 127 segundos. Antes de Linux 3.7, el valor predeterminado era 5, que, sumando al cálculo basado en otros parámetros del núcleo, correspondía a aproximadamente 180 segundos.
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.
Habilita las TCP syncookies. El núcleo debe compilarse con CONFIG_SYN_COOKIES. La función syncookies intenta proteger un socket de un ataque de inundación SYN. Debe usarse como último recurso, si es que se usa. Esto constituye una violación del protocolo TCP y entra en conflicto con otras áreas de TCP, como las extensiones TCP. Puede causar problemas a clientes y relés. No se recomienda como mecanismo de ajuste para servidores con mucha carga, para ayudar con condiciones de sobrecarga o configuración incorrecta. Para alternativas recomendadas, consulte tcp_max_syn_backlog, tcp_synack_retries e tcp_abort_on_overflow. Establézcalo en uno de los siguientes valores:
0
Desactiva TCP syncookies.
1
Envía cookies de sincronización cuando la cola de sincronización pendiente de un socket se desborda.
2
(desde Linux 3.12) Envía cookies de sincronización incondicionalmente. Esto puede ser útil para pruebas de red.
Establece uno de los siguientes valores para habilitar o deshabilitar las marcas de tiempo TCP según el RFC 1323:
0
Deshabilita las marcas de tiempo.
1
Habilita las marcas de tiempo según la definición de RFC 1323 y utiliza un desplazamiento aleatorio para cada conexión en lugar de usar solo la hora actual.
2
Igual que el valor 1, pero sin desplazamientos aleatorios. Establecer tcp_timestamps con este valor es relevante desde Linux 4.10.
Este parámetro controla el porcentaje de la ventana de congestión que puede consumir una sola trama de Descarga de Segmentación TCP (TSO). La configuración de este parámetro busca un equilibrio entre la capacidad de ráfaga y la creación de tramas TSO más grandes.
Habilita el reciclaje rápido de sockets TIME_WAIT. No se recomienda habilitar esta opción, ya que la IP remota podría no usar marcas de tiempo que aumenten de forma previsible (dispositivos con NAT, dispositivos con desplazamientos de marca de tiempo por conexión). Consulte los RFC 1323 (PAWS) y RFC 6191.
Permite reutilizar los sockets TIME_WAIT para nuevas conexiones cuando sea seguro desde el punto de vista del protocolo. No debe modificarse sin el asesoramiento o la solicitud de expertos técnicos.
Habilita el algoritmo de prevención de congestión TCP Vegas. TCP Vegas es una modificación de TCP que solo afecta al remitente y que anticipa la aparición de congestión estimando el ancho de banda. TCP Vegas ajusta la velocidad de envío modificando la ventana de congestión. TCP Vegas debería proporcionar una menor pérdida de paquetes, pero no es tan agresivo como TCP Reno.
Habilita el algoritmo de control de congestión TCP Westwood+. TCP Westwood+ es una modificación de la pila de protocolos TCP Reno, que solo afecta al remitente, y que optimiza el rendimiento del control de congestión TCP. Se basa en la estimación del ancho de banda de extremo a extremo para establecer la ventana de congestión y un umbral de inicio lento tras una congestión. Con esta estimación, TCP Westwood+ establece de forma flexible un umbral de inicio lento y una ventana de congestión que tiene en cuenta el ancho de banda utilizado en el momento de la congestión. TCP Westwood+ aumenta significativamente la equidad con respecto a TCP Reno en redes cableadas y el rendimiento en enlaces inalámbricos.
Activa la ampliación de ventanas TCP según el RFC 1323. Esta característica permite el uso de una ventana grande (> 64 kB) 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 64 kB. 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 valores, dependiendo de la memoria disponible en el sistema.
Tamaño mínimo del búfer de envío utilizado por cada socket TCP. El valor predeterminado es el tamaño de página del sistema. (En Linux 2.4, el valor predeterminado es 4 kB). Este valor se utiliza para garantizar que, cuando se dispone de escasa memoria, las asignaciones inferiores a este tamaño se realicen correctamente. No se utiliza para limitar el tamaño del búfer de envío declarado mediante SO_SNDBUF en un socket.
Tamaño predeterminado del búfer de envío para un socket TCP. Este valor sobrescribe el tamaño predeterminado inicial del búfer del valor genérico global /proc/sys/net/core/wmem_default definido para todos los protocolos. El valor predeterminado es 16 kB. Si se desean tamaños de búfer de envío mayores, se debe aumentar este valor (para que afecte a todos los sockets). Para emplear ventanas TCP grandes, /proc/sys/net/ipv4/tcp_window_scaling debe establecerse en un valor distinto de cero (predeterminado).
Tamaño máximo del búfer de envío utilizado por cada socket TCP. Este valor no sobrescribe el valor de /proc/sys/net/core/wmem_max. No se utiliza para limitar el tamaño del búfer de envío, declarado mediante SO_SNDBUF, en un socket. El valor por defecto se calcula mediante la fórmula:

max(65536, min(4 MB, tcp_mem[1]*PAGE_SIZE/128))
    

(En Linux 2.4, el valor predeterminado es 128 kB, que se reduce a 64 kB en sistemas con poca memoria).
Si está habilitado, se asume que la ausencia de una opción de escalado de ventana significa que el TCP remoto está roto y trata la ventana como una cantidad con signo. Si está deshabilitado, se asume que el TCP remoto no está roto incluso si no recibimos una opción de escalado de ventana.

Opciones de los conectores

Para establecer u obtener una opción de socket TCP, invoque a getsockopt(2) para leer o a setsockopt(2) para escribir la opción con el argumento de nivel de opción establecido en IPPROTO_TCP. A menos que se indique lo contrario, optval es un puntero a un int. Además, la mayoría de las opciones de socket IPPROTO_IP son válidas en sockets TCP. Consulte ip(7) para más información.

A continuación, se muestra una lista de opciones de socket específicas de TCP. Consulte sockets(7) para obtener más información sobre otras opciones de socket que también son aplicables a sockets TCP.

El argumento de esta opción es una cadena. Esta opción permite al usuario configurar el algoritmo de control de congestión TCP que se utilizará por lossockets. Los procesos sin privilegios de administrador solo pueden elegir uno de los algoritmos en tcp_allowed_congestion_control (descrito anteriormente). Los procesos con privilegios (CAP_NET_ADMIN) pueden elegir cualquiera de los algoritmos de control de congestión disponibles (véase la descripción de tcp_available_congestion_control anteriormente).
Si se configura, no se envían tramas parciales. Todas las tramas parciales en cola se envían al desactivar la opción. Esto resulta útil para anteponer encabezados antes de invocar a sendfile(2) o para optimizar el rendimiento. En la implementación actual, existe un límite de 200 milisegundos para el tiempo durante el cual TCP_CORK bloquea la salida. Si se alcanza este límite, los datos en cola se transmiten automáticamente. Esta opción solo se puede combinar con TCP_NODELAY a partir de Linux 2.5.71. No debe utilizarse en código pretenda ser portable.
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 utiliza para recopilar información sobre este socket. El núcleo devuelve un struct tcp_info, tal como se define en el archivo /usr/include/linux/tcp.h. No debe utilizarse si se desea que el código portable.
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 portable.
Tiempo de vida de los sockets huérfanos con estado FIN_WAIT2. Esta opción puede utilizarse para anular la configuración general del sistema en el archivo /proc/sys/net/ipv4/tcp_fin_timeout para este socket. No debe confundirse con la opción de nivel socket(7) SO_LINGER. No debe utilizarse si se considera la portabilidad del código.
Tamaño máximo del segmento para los paquetes TCP salientes. En Linux 2.2 y anteriores, y en Linux 2.6.28 y posteriores, si esta opción se configura antes de establecer la conexión, también cambia el valor MSS anunciado al otro extremo en el paquete inicial. Los valores superiores a la MTU de la interfaz (eventual) no tienen efecto. TCP también impondrá sus límites mínimo y máximo sobre el valor indicado.
Si se configura, se deshabilita el algoritmo de Nagle. Los segmentos siempre se enviarán lo antes posible, incluso con una pequeña cantidad de datos. Si no se configura, los datos se almacenan en búfer hasta que haya suficiente cantidad para enviar, evitando así el envío frecuente de paquetes pequeños, lo que resulta en una mala utilización de la red. Esta opción se sobrescribe con TCP_CORK; sin embargo, al configurarla, se fuerza a un vaciado de la salida pendiente, incluso si TCP_CORK está configurado.
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 interrumpir 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.
Esta opción toma un entero sin signo como argumento. Cuando el valor es mayor que 0, dará el tiempo máximo en milisegundos que los datos transmitidos pueden permanecer sin confirmar, o que los datos almacenados en búfer pueden permanecer sin transmitir (debido al tamaño de ventana cero), antes de que TCP cierre forzosamente la conexión correspondiente y retorne ETIMEDOUT a la aplicación. Si el valor de la opción es 0, TCP utilizará el valor predeterminado del sistema.
El aumento de los tiempos de espera del usuario permite que una conexión TCP previva durante periodos prolongados sin conectividad de extremo a extremo. Reducir los tiempos de espera del usuario permite que las aplicaciones den error rápidamente, si así se desea. De lo contrario, el fallo puede tardar hasta 20 minutos con los valores predeterminados del sistema en un entorno WAN normal.
Esta opción se puede configurar en cualquier estado de una conexión TCP, pero solo es efectiva durante los estados sincronizados de una conexión (ESTABLISHED, FIN-WAIT-1, FIN-WAIT-2, CLOSE-WAIT, CLOSING y LAST-ACK). Además, al usar la opción de mantenimiento de conexión TCP (SO_KEEPALIVE), TCP_USER_TIMEOUT sobrescribirá el mantenimiento de conexión para determinar cuándo cerrar una conexión debido a un fallo de mantenimiento de conexión.
Esta opción no afecta a la retransmisión TCP de un paquete ni al envío de un paquete sonda de mantenimiento de conexión.
Esta opción, como muchas otras, será heredada por el socket devuelto por accept(2), si se configuró en el socket de escucha.
Para más detalles sobre la función de tiempo de espera del usuario, consulte los RFC 793 y RFC 5482 «Opción de tiempo de espera del usuario TCP».
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.
Esta opción habilita la apertura rápida (RFC 7413) en el socket de escucha. El valor especifica la longitud máxima de los SYN pendientes (similar al argumento de retraso en listen(2)). Una vez habilitado, el socket de escucha otorga la cookie de Apertura Rápida TCP al SYN entrante con la opción de Apertura Rápida TCP.
Más importante aún, acepta los datos en SYN con una cookie de Apertura Rápida válida y responde con un SYN-ACK, confirmando tanto los datos como la secuencia SYN. accept(2) devuelve un socket disponible para lectura y escritura cuando el protocolo de enlace aún no se ha completado. Por lo tanto, el intercambio de datos puede comenzar antes de que se complete el protocolo de enlace. Esta opción requiere habilitar la compatibilidad del lado del servidor en sysctl net.ipv4.tcp_fastopen (véase más arriba). Para obtener información sobre la compatibilidad del lado del cliente con Apertura Rápida TCP, consulte send(2), MSG_FASTOPEN o TCP_FASTOPEN_CONNECT más adelante.
Esta opción habilita una forma alternativa de realizar Apertura Rápida en el lado activo (cliente). Cuando esta opción está habilitada, connect(2) se comportará de manera diferente dependiendo de si hay una cookie de apertura rápida disponible para el destino.
Si no hay una cookie disponible (es decir, el primer contacto con el destino), connect(2) actuará como de costumbre enviando un SYN inmediatamente, aunque este SYN incluiría una opción de cookie de Apertura Rápida vacía para solicitar una cookie.
Si hay una cookie disponible, connect(2) devolvería 0 inmediatamente, pero la transmisión del SYN se aplaza. Un write(2) o sendmsg(2) posterior activaría un SYN con datos más una cookie en la opción de Apertura Rápida. Es decit, la operación de conexión se aplaza hasta que se proporcionen los datos.
Observe: Aunque esta opción está diseñada para mayor comodidad, habilitarla modifica el comportamiento y ciertas llamadas del sistema podrían establecer valores errno diferentes. Con una cookie presente, se debe llamar a write(2) o sendmsg(2) inmediatamente después de connect(2) para enviar SYN + datos para completar el 3WHS (acrónimo que significa «saludo de 3 partes») y establecer la conexión. Si se llama a read(2) justo después de connect(2) sin write(2) provocará que el socket bloqueador se bloquee indefinidamente.
La aplicación debe configurar la opción de socket TCP_FASTOPEN_CONNECT antes de write(2) o sendmsg(2), o llamar directamente a write(2) o sendmsg(2) con el indicador MSG_FASTOPEN, en lugar de usar ambos en la misma conexión.
Este es el flujo de llamada típico con esta nueva opción:

s = socket();
setsockopt(s, IPPROTO_TCP, TCP_FASTOPEN_CONNECT, 1, ...);
connect(s);
write(s); /* write() debería ir siempre después de connect()

* para hacer que SYN salga. */ read(s)/write(s); /* ... */ close(s);

API de sockets

TCP ofrece compatibilidad limitada con datos fuera de banda, en forma de datos urgentes (un solo byte). En Linux, esto significa que si el otro extremo envía datos fuera de banda más recientes, los datos urgentes más antiguos se insertan como datos normales en el flujo (incluso si SO_OOBINLINE no está configurado). Esto difiere del comportamiento de las pilas basadas en BSD.

Por defecto, Linux utiliza la interpretación compatible con BSD del campo de puntero urgente. Esto incumple lo dispuesto en el RFC 1122, pero es necesario para la interoperabilidad con otras pilas. Se puede modificar en /proc/sys/net/ipv4/tcp_stdurg.

Es posible acceder a datos fuera de banda mediante el indicador MSG_PEEK de recv(2).

Desde Linux 2.4, Linux admite el uso de MSG_TRUNC en el argumento flags de recv(2) (y recvmsg(2)). Este indicador hace que los bytes de datos recibidos se descarten, en lugar de devolverse a un búfer proporcionado por el emisor. Desde Linux 2.4.4, MSG_TRUNC también tiene este efecto cuando se utiliza junto con MSG_OOB para recibir datos fuera de banda.

Ioctls

Las siguientes llamadas a ioctl(2) devuelven información en valor. La sintaxis correcta es:

int valor;
error = ioctl(tcp_socket, ioctl_type, &valor);

ioctl_type es una de las siguientes:

Devuelve la cantidad de datos no leídos en cola en el búfer de recepción. El socket no debe estar en estado LISTEN, de lo contrario se devuelve un error (EINVAL). SIOCINQ se define en <linux/sockios.h>. Como alternativa, puede emplearse el sinónimo FIONREAD, definido en <sys/ioctl.h>.
Devuelve verdadero (es decir, valor es distinto de cero) si el flujo de datos entrante se encuentra en la marca de urgencia.
Si la opción de socket SO_OOBINLINE está activada y SIOCATMARK devuelve verdadero, la siguiente lectura del socket devolverá los datos urgentes. Si la opción de socket SO_OOBINLINE no está establecida y SIOCATMARK devuelve verdadero, la siguiente lectura del socket devolverá los bytes posteriores a los datos urgentes (para leer los datos urgentes se requiere el indicador recv(MSG_OOB)).
Una lectura nunca sobrepasa la marca de urgencia. Si se informa a una aplicación de la presencia de datos urgentes mediante select(2) (mediante el argumento exceptfds) o mediante la entrega de una señal SIGURG, puede avanzar hasta la marca mediante un bucle que prueba repetidamente SIOCATMARK y realiza una lectura (solicitando cualquier número de bytes) siempre que SIOCATMARK devuelva falso.
Devuelve la cantidad de datos no enviados en la cola de envío del socket. El socket no debe estar en estado LISTEN; de lo contrario, se devuelve un error (EINVAL). SIOCOUTQ se define en <linux/sockios.h>. Como alternativa, puede usar el sinónimo TIOCOUTQ, definido en <sys/ioctl.h>.

Gestión de errores

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 requieren una notificación de errores más rápida. Esto se puede habilitar con la opción de socket IP_RECVERR de nivel IPPROTO_IP. Cuando esta opción está habilitada, todos los errores entrantes se pasan inmediatamente al programa de usuario. Use esta opción con precaución, ya que reduce la tolerancia de TCP a los cambios de enrutamiento y otras condiciones normales de red.

ERRORES

El tipo de dirección de conector pasado en sin_family no es AF_INET.
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.

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

VERSIONES

La compatibilidad con la Notificación Explícita de Congestión, en sendfile(2), soporte para reordenamiento y algunas extensiones SACK (DSACK) se introdujeron en Linux 2.4. La compatibilidad con el acuse de recibo de reenvío (FACK), el reciclaje TIME_WAIT y las opciones de socket keepalive por conexión se introdujeron en Linux 2.3.

ERRORES

No se han documentado todos los errores.

No se ha descrito IPv6.

VÉASE TAMBIÉN

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

Documentación del código fuente del núcleo Documentation/networking/ip-sysctl.txt.

RFC 793 para la especificación de TCP.
RFC 1122 para los requisitos de TCP y una descripción del algoritmo Nagle.
RFC 1323 para las opciones TCP de fechado y de ampliación de ventana.
RFC 1337 para una descripción de los peligros que conlleva el “asesinato” de los conectores TIME_WAIT.
RFC 3168 para una descripción de la Notificación Explícita de la Congestión.
RFC 2581 para los algoritmos TCP de control de la congestión.
RFC 2018 y RFC 2883 para SACK y sus extensiones.

TRADUCCIÓN

La traducción al español de esta página del manual fue creada por Juan Piernas <piernas@ditec.um.es> y Marcos Fouces <marcos@debian.org>

Esta traducción es documentación libre; lea la GNU General Public License Version 3 o posterior con respecto a las condiciones de copyright. No existe NINGUNA RESPONSABILIDAD.

Si encuentra algún error en la traducción de esta página del manual, envíe un correo electrónico a debian-l10n-spanish@lists.debian.org.

2 Mayo 2024 Páginas de Manual de Linux 6.9.1