2010-11-12 9 views
21

Al utilizar el comportamiento predeterminado (bloqueo) en un socket UDP, ¿en qué caso se bloqueará una llamada a sendto()? Estoy interesado esencialmente en el comportamiento de Linux.¿Cuándo se bloquea un UDP sendto()?

Para TCP Entiendo que el control de la congestión hace que el bloqueo de la llamada a send() esté lleno, pero ¿qué pasa con el UDP? ¿Incluso bloquea algunas veces o simplemente deja que los paquetes se descarten en las capas inferiores?

Respuesta

14

Esto puede suceder si llena el búfer del zócalo, pero es altamente dependiente del sistema operativo. Como UDP no proporciona ninguna garantía, su sistema operativo puede decidir hacer lo que quiera cuando su búfer de socket esté lleno: bloquear o descartar. Puede intentar aumentar SO_SNDBUF para alivio temporal.

Esto incluso puede depender del ajuste fino de su sistema, por ejemplo, también puede depender del tamaño del anillo TX en el controlador de su interfaz de red. Hay algunas discusiones sobre esto en el iperf mailing list, pero realmente desea discutir esto con los desarrolladores de su sistema operativo.

+1

Ok, siguiendo su enlace encontré una explicación específica de Linux en [este hilo] (http://www.mail-archive.com/[email protected]/msg00113.html).Respuesta simplificada tan breve: _Linux do block sendto en un buffer de envío completo_. –

+2

OK, pero ahora la pregunta se ha llevado un paso más allá: ¿bajo qué condiciones Linux permitirá que el buffer del socket se llene? (en lugar de dejar caer paquetes) Desafortunadamente esta es una pregunta muy difícil. – MarcH

+0

@MarcH, ¿qué tal recv, enviar cuando el socket está bloqueando? Creo que en este caso send y recv bloquearán de todos modos? – Bionix1441

9

Esto puede deberse a que su sistema operativo está intentando realizar una solicitud ARP para obtener la dirección de hardware del host remoto.

Básicamente cuando un paquete se apaga, el encabezado requiere la dirección IP del host remoto y la dirección MAC del host remoto. 192.168.1.34 y AB: 32: 24: 64: F3: 21.

Su comportamiento de "bloqueo" podría ser que ARP está funcionando.

He oído en versiones anteriores de Windows (2k creo), que el primer paquete a veces se descarta si la solicitud es demasiado larga y está enviando demasiados datos. Un service pack probablemente lo arregló desde entonces.

+0

Ok, buen elemento para responder, interesante; pero lo que me interesa es principalmente el bloqueo (o la ausencia de bloqueo) relacionado con la congestión/buffer completo. –

+0

ARP solo se usa para ubicar hosts en la misma subred, generalmente el enrutador. Y los resultados se almacenan en caché para envíos posteriores. – selbie

+2

Cuando un paquete IP se apaga, requiere la dirección IP del host remoto y la dirección MAC del ** siguiente salto ** ... –

Cuestiones relacionadas