2010-06-25 15 views
6

en un proyecto en el que estoy trabajando, estamos viendo problemas fuera de orden en ciertas circunstancias en un sistema SMP cuando estamos leyendo un flujo UDP desde la red. Podemos ver que llega de la red en orden olfateando un hub conectado entre el emisor y el receptor. Sin embargo, a veces parece llegar fuera de orden cuando se lee desde el zócalo. ¿Hay alguna garantía para los paquetes UDP en este caso o debería la aplicación implementar un buffer de reorden? No estamos estableciendo la afinidad de la CPU aquí, sospecho que podría ayudar pero, idealmente, me gustaría que todos los subprocesos de CPU/hw manejen el tráfico de la red.¿El kernel de Linux en un sistema SMP garantiza que los paquetes UDP que llegan de una red en orden se leerán desde un socket en orden?

Respuesta

9

UDP no garantiza ninguna orden en absoluto. Es responsabilidad de la aplicación. De hecho, ni siquiera garantiza que los paquetes no se repitan/suelten, etc. Sugiero que lea: http://en.wikipedia.org/wiki/User_Datagram_Protocol

No tiene sentido que el kernel haga tales garantías, especialmente si los paquetes entrantes podrían estar fuera de servicio, ya que el kernel puede (razonablemente) esperar que la aplicación se encargue de él, si la aplicación requiere un pedido.

+0

Entiendo eso, y entiendo que debería haber un búfer de reordenación, pero lo que estoy diciendo es que vienen en orden, pero parece que el kernel está revolviendo el orden. ¿Es esto aceptable para el kernel? – tylernol

+0

@tylernol: Sí, es aceptable que kernel pueda darle a la aplicación los paquetes udp en cualquier orden. ¿Por qué deberíamos siquiera esperar eso? El protocolo en sí mismo no lo garantiza, y hacer que el kernel se asegure de que proporciona los paquetes en el orden en que lo obtiene solo complicaría las cosas (en el kernel) sin ningún tipo de uso. –

+1

@tylernol: Tal vez esto te ayude: http://lkml.indiana.edu/hypermail/linux/net/0211.2/0036.html –

0

No se puede garantizar que un paquete UDP no se descarte durante la transmisión, por lo que no puede tener ninguna garantía de pedido. Cuando el sistema recibe, por ejemplo, paquete # 14 y paquete # 16, no tiene manera de saber si debe esperar a que el paquete # 15 entre antes de entregar el paquete # 16, o si el paquete # 15 se cayó y nunca vendrá pulg. El sistema simplemente le dará un montón de paquetes, y le toca a usted ponerlos en orden.

+0

sí, eso es lo que obtenemos con UDP, lo maneja como lo hace, pero debería el kernel introducir la secuencia fuera de orden mientras maneja los paquetes saliendo de la red? – tylernol

+0

@ tylernol- ¿Importa si el kernel cambia el orden? Su aplicación no sabe el orden en que el kernel recibió los paquetes, por lo que la pregunta es irrelevante. Todo lo que su aplicación sabe es que debe estar preparado para volver a ordenar los paquetes, independientemente de la razón por la cual podrían estar fuera de servicio. – bta

+0

muy cierto, ahora si solo puedo persuadir al autor de esta interfaz en particular en la aplicación para que haga lo que se supone que debe hacer ... ¡gracias! – tylernol

Cuestiones relacionadas