2011-08-10 11 views
6

He visitado tantos sitios web y tutoriales (y documentos), pero todavía tengo una pregunta sin respuesta. ¿Qué sucede, si llega el paquete UDP, cuando no estoy ejecutando socket.receive (...)? ¿Se amortiguará de alguna manera hasta que invoque socket.receive (...) o se pierda por completo?¿Se eliminan los paquetes si no estoy recibiendo activamente de un DatagramSocket?

también consiste en la realización de DatagramSocket Android flujos seguros en su significado, que se puede escribir a la toma cuando se escucha a ella, o no?

Respuesta

9

La pila de red del kernel mantiene un buffer de recepción por socket. Usted tiene el control sobre el tamaño de la misma con la opción SO_RCVBUF de la llamada al sistema setsockopt(2) (deberá averiguar cuál es la API de Java para ella).

Así que los paquetes entrantes en cola en el núcleo, siempre y cuando no hay suficiente espacio en ese búfer. Es no requerido para que la aplicación ejecute la función "recibir" en ese momento particular. Si la aplicación no está desactivando (es decir, leyendo) los paquetes lo suficientemente rápido, el búfer se desborda y el núcleo comienza a soltar los paquetes. En Linux (y generalmente en Unix) debería poder ver el conteo de paquetes con el comando netstat -s.

también quisiera señalar que este búfer no es el único lugar donde los paquetes pueden quedar afuera. El hardware puede soltar paquetes si no hay suficiente espacio en su memoria NIC activa. Luego, el controlador del dispositivo puede soltar paquetes si el kernel está demasiado ocupado y no está procesando su cola de entrada de red general. Sin embargo, necesita tasas de mensajes serias para que esto suceda.

TCP intenta conseguir alrededor de todo esto con la secuenciación total y, si es necesario, retransmisión. UDP, al ser un simple "enviar y olvidar", no hace nada por ti (excepto en casos de esquina donde obtienes un error del segundo send(2) en un socket UDP conectado y solo si ICMP funciona correctamente).

La conclusión es que los paquetes se almacenan temporalmente, pero hasta el punto, entonces se desecha.

+1

Felicitaciones a usted! Comprueba los documentos de Android, el tamaño del búfer de sockets predeterminado es 4098 Bytes. Esto hace que el concepto de socket sea realmente más claro. – LordTwaroog

Cuestiones relacionadas