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.
Gracias. ¿Tienes un enlace/fuente que respalde esta afirmación? – AtomicJake
@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
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