2010-11-23 24 views
21

¿Puede explicarme qué son exactamente las opciones SO_SNDBUF y ?¿Qué son SO_SNDBUF y SO_RECVBUF

OK, por alguna razón, el sistema operativo almacena temporalmente los datos salientes/entrantes, pero me gustaría aclarar este tema.

¿Cuál es su función (en general)?

¿Son los búfers por socket?

¿Hay una conexión entre los búferes de la capa de transporte (el búfer TCP, por ejemplo) y estos búferes?

¿Tienen un comportamiento/función diferente al usar sockets de flujo (TCP) y al usar sockets sin conexión (UDP)?

Un buen artículo será genial también.

Lo busqué en Google pero no encontré ninguna información útil.

Respuesta

3

búsqueda en Google de "MSDN SO_RECVBUF" me dio ...

http://msdn.microsoft.com/en-us/library/ms740476(VS.85).aspx

que responde a su "son por socket" con estas líneas de la tabla de opciones:

SO_RCVBUF int Specifies the total per-socket buffer space reserved for receives. 
SO_SNDBUF int Specifies the total per-socket buffer space reserved for sends. 

Con más detalles más adelante:

SO_RCVBUF and SO_SNDBUF 
When a Windows Sockets implementation supports the SO_RCVBUF and SO_SNDBUF options, an application can request different buffer sizes (larger or smaller). The call to setsockopt can succeed even when the implementation did not provide the whole amount requested. An application must call getsockopt with the same option to check the buffer size actually provided. 
49

El prefijo "SO_" es para " opción de socket ", así que sí, estos son ajustes por socket para los búferes por socket. Generalmente hay valores predeterminados y valores máximos para todo el sistema.

SO_RCVBUF es más simple de entender: es el tamaño del búfer que asigna el kernel para contener los datos que llegan al zócalo dado durante el tiempo transcurrido entre la red y cuando es leído por el programa que posee este zócalo . Con TCP, si llegan datos y usted no los está leyendo, el búfer se llenará y se le indicará al remitente que reduzca la velocidad (utilizando el mecanismo de ajuste de la ventana TCP). Para UDP, una vez que el buffer está lleno, los paquetes nuevos simplemente serán descartados.

SO_SNDBUF, creo que solo importa para TCP (en UDP, lo que usted envíe va directamente a la red). Para TCP, puede llenar el búfer si el lado remoto no está leyendo (para que el búfer remoto se llene, entonces TCP comunica este hecho a su kernel, y su núcleo deja de enviar datos, en su lugar, lo acumula en el búfer local hasta que llena). O podría llenarse si hay un problema de red, y el kernel no recibe reconocimientos por los datos que envía. A continuación, disminuirá el envío de datos en la red hasta que, finalmente, se llene el búfer de salida. Si es así, las llamadas futuras a write() a este socket por la aplicación se bloquearán (o devolver EAGAIN si ha configurado la opción O_NONBLOCK).

Todo esto se describe mejor en el libro Unix Network Programming.

7

En Windows, el búfer de envío tiene un efecto en UDP. Si lanza los paquetes más rápido de lo que la red puede transmitirlos, eventualmente llenará el buffer de salida del socket y SendTo fallará con "would block". Aumentar SO_SNDBUF ayudará con esto. Tuve que aumentar los búferes de envío y recepción de una prueba que estaba haciendo para encontrar la máxima tasa de paquetes que podía enviar entre una caja de Windows y una de Linux.También podría haber manejado el tamaño de envío al detectar el código de error "bloquearía", dormir un poco y volver a intentarlo. Pero aumentar el tamaño del búfer de envío fue más simple. El valor predeterminado en Windows es 8K, lo que parece innecesariamente pequeño en esta era de PC con GB de RAM.

Cuestiones relacionadas