¿Cómo puedo detectar conexiones de larga duración y marcarlas para darles forma?

¿Cómo puedo detectar conexiones de larga duración y marcarlas para darles forma?

Me gustaría detectar conexiones TCP que han estado abiertas durante más de un minuto (o por más de N bytes o M paquetes), para poder clasificarlas como tráfico masivo ("descargas") y quitarles prioridad.

¿Puedo detectar transmisiones de larga duración con iptables/netfilter/conntrack y marcarlas para darles forma mediante tc?

Pensé que podría utilizar el "número de secuencia" de TCP como una medida de la longitud de una secuencia, ¡pero desafortunadamente no comienza en cero! Quizás el seguimiento de la conexión con netfilter/conntrack podría determinar el número de secuencia correcto, o el número total de bytes, y la duración de la conexión, y elegir si se marca el paquete.

(También podría mencionar que estoy haciendo esto eningresoutilizando una interfaz virtual ifb0. Actualmente estoy usando colas tbf (con sfq) para limitar los datos de baja prioridad. En cualquier caso, cualquier solución también podría aplicarse asalida, por ejemplo, para un servidor web con una conexión limitada que desea quitarle prioridad a las descargas para acelerar las solicitudes pequeñas).


Actualización: al usar conntrackd puedo ver una lista de conexiones y cuánto tiempo hace que se inició cada una. Comencé a usar esta lista para detectar pares de IP/puerto que quiero limitar (después de 60 segundos). Sin embargo, hay una serie de problemas:

  • ¡conntrack(d) no parece borrar las conexiones de la lista rápidamente cuando se han cerrado! Así que termino marcando todas las conexiones para limitar, incluso las que han terminado.
  • Establecer marcas en conntrack no parece establecer marcas en los paquetes (hasta donde tc puede ver). (Esto no se debe solo a que conntrack ve los paquetes después de ifb0: tampoco puedo ver ninguna marca en los paquetes de salida). Así que acabo de agregar nuevos filtros a tc para limitar, lo cual está lejos de ser ideal a largo plazo.
  • conntrack(d) no me dice cuánto ancho de banda ha utilizado cada conexión. Por lo tanto, no puedo distinguir las sesiones intermitentes (por ejemplo, iosocket) de las descargas intensas. (En cualquier caso, este es un problema difícil: si ya tenemos 5 descargas y comienza una nueva descarga, ¿cómo podemos saber que está intentando inundar? No alcanzará la velocidad máxima).

Se agradecería cualquier sugerencia con lo anterior.

(Lo bueno es que incluso si no puedo clasificar las descargas correctamente, el simple hecho de usar tfb para limitar los datos entrantes al 80% de mi tasa de reducción máxima ha evitado la sobrecarga de la conexión y ha permitido que se establezcan nuevas conexiones mucho más fácilmente que antes).

Respuesta1

La esperanza de vida y la longevidad real de una conexión tienen CERO relación con si una conexión debe tener una forma especial o no.

Algunos ejemplos:

SSH, posiblemente de larga duración, minutos, horas, días, semanas e incluso meses. Todavía se necesita una alta prioridad para responder a la interacción del usuario.

Bittorrent (o protocolos similares), vividos aleatoriamente, algunos durante segundos y luego desconectados, otros durante minutos u horas, luego desconectados. Pocos duran más de un día a la vez.

Resumen: La longitud de una conexión NO TIENE NADA que ver con si la conexión es "masiva" o no, ni con si la conexión debe tratarse como masa o no.

No necesariamente relacionado directamente, pero sí útil:

Al utilizar la configuración del tráfico, ¿limitar el tráfico de descargas es útil o perjudicial?

información relacionada