Serie de programación de redes de alto rendimiento
Esta serie es una reproducción del blog de Tao Hui Daniu.
Para diferenciar funciones y reducir la competencia de bloqueos concurrentes, se organizan una variedad de colas
1.1 recepción (los datos después de que se haya eliminado el protocolo TCP se pueden copiar directamente al estado del usuario datos)
1.2 fuera de servicio
1.3 precola
1.4 atraso (colocado cuando el socket está bloqueado)
Cuándo Cuándo un socket está inactivo y esperando más datos, los paquetes recién llegados pueden ir a la cola previa a la cola, a la cola de recepción o a la cola fuera de servicio según la configuración tcp_low_latency.
El valor predeterminado de tcp_low_latency es 0, que está desactivado. En este momento, el paquete recién llegado ingresa a tcp_low_latency
Debido a que hay procesos en espera, el protocolo TCP del recién llegado. El paquete se puede completar esperando. El proceso está completo.
La semiconexión envía directamente RST
El búfer de lectura contiene dos partes:
tcp_adv_win_scale significa que 1/(2^tcp_adv_win_scale) se almacenará en caché. . Es decir, cuando la configuración predeterminada de tcp_adv_win_scale es 2, al menos 1/4 de la memoria se utiliza para el caché de lectura de la aplicación. Luego, el tamaño máximo de la ventana deslizante de recepción solo puede alcanzar 3/4 del caché de lectura.
Tomando como ejemplo el kernel Linux 2.6.18 ampliamente utilizado, en Ethernet, el tamaño de MSS es 1460 y el tamaño de la ventana inicial es 4 veces el MSS. En algunas redes, se utilizan 12 bytes como marcas de tiempo en el encabezado opcional de TCP. De esta manera, los datos válidos son MSS menos 12 y la ventana inicial es (1460-12) 4=5792*, que es la misma que la. window El significado que quiero expresar es consistente, es decir: la longitud efectiva de datos que puedo manejar.
En versiones posteriores de Linux3, la ventana inicial se ajusta a un tamaño de 10 MSS, que se basa principalmente en las sugerencias de GOOGLE. La razón es esta, aunque la ventana de recepción a menudo aumenta el tamaño de la ventana rápidamente de manera exponencial (crece exponencialmente por debajo del umbral de congestión y crece linealmente al entrar en la etapa de evitación de congestión por encima del umbral). Además, el umbral de congestión en sí aumenta cuando. recibir más de 128 paquetes de datos también puede aumentar rápidamente). Si se transmiten datos grandes, como video, a medida que la ventana aumenta hasta (cerca de) el caché de lectura máximo, los datos se transmitirán a "velocidad máxima", pero si suele ser decenas de KB. Si la ventana inicial es demasiado pequeña y no se ha aumentado a una ventana adecuada, la conexión finalizará. En comparación con una ventana inicial más grande, esto requiere más tiempo (RTT) para que el usuario complete la transmisión de datos, lo que resulta en una mala experiencia.
Entonces: tamaño del búfer de recepción = BDP*4/3
Cuando hay relativamente pocas conexiones simultáneas, aumente el límite de caché y deje que cada conexión TCP funcione a plena capacidad; Muchas veces, cuando los recursos de memoria del sistema son insuficientes, el límite de caché se reduce para que el caché de cada conexión TCP sea lo más pequeño posible para dar cabida a más conexiones.
net.ipv4.tcp_moderate_rcvbuf = 1
La configuración predeterminada de tcp_moderate_rcvbuf es 1, lo que significa que la función de ajuste automático de la memoria TCP está activada. Si se configura en 0, esta función no tendrá efecto (úsela con precaución).