¿Por qué las conexiones TCP pequeñas tienen éxito pero las grandes fallan?

¿Por qué las conexiones TCP pequeñas tienen éxito pero las grandes fallan?

A veces, desde el sistema Linux veo el siguiente comportamiento extraño:

Puedo hacer ping a cosas y, a veces, utilizar algunos servicios, pero la conexión en red es muy mala.

Por ejemplo, ahora enruté la conexión a través de mi computadora portátil ( -j MASQUERADE) y observé lo siguiente: Si hago poca conexión TCP (el servidor me envía pocos datos), procede:

# nc 86.57.151.3 80
GET /404
<html>
<head><title>404 Not Found</title></head>
<body bgcolor="white">
<center><h1>404 Not Found</h1></center>
<hr><center>nginx</center>
</body>
</html>

/proc/net/ip_conntrack lo hizo tcp 6 431998 ESTABLISHED src=192.168.99.9 dst=86.57.151.3 sport=49104 dport=80 src=86.57.151.3 dst=93.125.21.218 sport= 80 dport=49104 [ASSURED] mark=0 use=2antes de escribir "GET /404".

Pero cuando hago una gran conexión:

root@localhost:~# nc 86.57.151.3 80
GET /

Se detiene. Antes de ingresar "OBTENER /", muestra ESTABLECIDO ASEGURADO, como de costumbre, pero después de presionar Intro va a tcp 6 0 CLOSE_WAIT src=192.168.99.9 dst=86.57.151.3 sport=56991 dport=80 src=86.57.151.3 dst=93.125.21.218 sport=80 dpo rt=56991 [ASSURED] mark=0 use=2. No se recibe ningún paquete. Cuando finalmente presiono Ctrl+C, envía FIN al servidor y Wireshard se queja de que el FIN del servidor está "fuera de servicio". Como si la respuesta empaquetada cayera en alguna parte.

Cuando hago lo mismo nc 86.57.151.3 80/ GET /desde el enrutador, funciona.

¿Cómo depurar lo que está mal?

Respuesta1

Este es el problema con MTU y los mensajes ICMP filtrados en alguna parte.

La solución alternativa es configurar MTU en el dispositivo cliente o utilizar la sujeción TCP MSS en el enrutador:

iptables -t mangle -A FORWARD -o ppp4 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

información relacionada