2010-07-08 15 views
10

Tengo una aplicación de lector Java que lee desde un socket de multidifusión en una plataforma Linux de 64 bits (2.6.18). El tamaño del socket se ha establecido en 2 MB. Cuando el lector no puede leer lo suficientemente rápido, el socket "se desborda", es decir, los paquetes se eliminan del búfer.¿Cómo se desborda un buffer de socket Linux?

Lo que me gustaría saber es cómo el kernel de Linux elimina los paquetes del búfer del zócalo. Supongo que el buffer de socket en sí es un buffer FIFO. Sin embargo, si está lleno ¿qué sucede? ¿Se descartará el próximo paquete (y el contenido del buffer no cambia)? ¿O reemplazará el nuevo paquete un paquete viejo en el búfer? En caso afirmativo, ¿qué paquete (el más antiguo ?, ¿el más joven ?, ¿un paquete elegido al azar?)?

Gracias por cualquier idea.

Respuesta

8

Cuando el búfer está lleno, los paquetes entrantes se descartan. Los paquetes que ya están en el búfer no se modifican o reemplazan.

+0

Gracias. ¿Tienes un enlace/fuente que respalde esta afirmación? – AtomicJake

+0

@AtomicJake: esta es una práctica estándar de diseño de red. O bien: ¿qué más puede hacer el sistema operativo? IIRC cuando el búfer de socket está lleno, la pila TCP establece el tamaño de la ventana en 0. Todos los paquetes entrantes en el estado simplemente se considerarán no válidos (no se ajustan a la ventana) y, por lo tanto, se descartarán. Lea el RFC793, busque la "ventana de recepción". – Dummy00001

+0

Tiene razón para TCP, pero estaba solicitando específicamente un socket de lectura UDP de multidifusión. Hasta donde sé, cada paquete entrante de la red se copia en un buffer de socket independiente (un buffer por lector). El zócalo es vaciado por cada lector a un ritmo diferente. En Linux, cuando un buffer está lleno, ¿se descarta simplemente un nuevo paquete o (como en el buffer circular) sobrescribe la entrada más antigua? Supongo que ambas implementaciones son legales. – AtomicJake

2

Simplemente una adición a la respuesta de JS Bangs.

Este no es el único lugar en la pila de red donde se pueden descartar paquetes. El búfer de recepción de zócalos es alto en la jerarquía y es específico para el zócalo del usuario. Otro lugar más cercano al hardware (al menos en Linux) es la cola entre el controlador del dispositivo y el NET_RX softirq (consulte netif_rx()). Estas caídas contribuirán a la columna RX-DRP en la salida netstat -i.

+0

Gracias. Establecí con 'sar' que de hecho pierdo paquetes en el búfer de sockets que lee la aplicación. Puedo ver los contadores cuando los paquetes se pierden debido a que la aplicación es demasiado lenta para leer. – AtomicJake

Cuestiones relacionadas