udp(7) Miscellaneous Information Manual udp(7) NOMBRE udp - Protocolo UDP sobre IPv4 SINOPSIS #include #include #include udp_socket = socket(AF_INET, SOCK_DGRAM, 0); DESCRIPCION Esta es una implementacion del protocolo UDP (User Datagram Protocol) descrito en RFC 768. Implementa un servicio de paquetes de datagramas no fiable y sin conexion. Los paquetes pueden ser reordenados o duplicados antes de que lleguen. UDP genera y comprueba sumas de verificacion (checksums) para detectar errores de transmision. Cuando se crea un conector (socket) UDP, sus direcciones local y remota estan sin especificar. Se pueden enviar datagramas inmediatamente usando sendto(2) o sendmsg(2) con una direccion de destino valida como argumento. Cuando se llama a connect(2) sobre el conector, se envia la direccion de destino por defecto y a partir de ese momento se pueden enviar datagramas usando send(2) o write(2) sin especificar una direccion de destino. Todavia es posible realizar envios a otros destinos pasando una direccion a sendto(2) o sendmsg(2). Para poder recibir paquetes, se debe ligar primero el conector a una direccion local usando bind(2). De otra manera la capa de conector asignara automaticamente un puerto local libre fuera del rango definido por /proc/sys/net/ipv4/ip_local_port_range y ligara el conector a INADDR_ANY. Todas las operaciones de recepcion solo devuelven un paquete. Cuando el paquete es mas pequeno que el buffer pasado, solo se devuelven los datos del paquete y, cuando es mayor, el paquete se trunca y la bandera MSG_TRUNC se activa. MSG_WAITALL no esta soportada. Se pueden enviar o recibir opciones IP usando las opciones de conectores descritas en ip(7). Estas son procesadas por el nucleo solo cuando esta activado el parametro adecuado de /proc (pero todavia se pasan al usuario incluso cuando esta desactivada). Vea ip(7). Cuando en un envio esta activa la opcion MSG_DONTROUTE, la direccion de destino debe referirse a la direccion de una interfaz local y el paquete solo se envia a esa interfaz. Por defecto, la implementacion UDP de Linux averigua el MTU (siglas en ingles de 'unidad maxima de transmision') de la ruta. Por lo tanto, el nucleo hace un seguimiento del MTU para una IP concreta emitiendo EMSGSIZE cuando un paquete UDP lo sobrepasa, en cuyo caso la aplicacion deberia reducir el tamano de sus paquetes. Es posible deshabilitar esta opcion mediante la opcion IP_MTU_DISCOVER en el archivo /proc/sys/net/ipv4/ip_no_pmtu_disc , consulte ip(7), en cuyo caso UDP fragmentara los paquetes emitidos si sobrepasan el MTU de la interfaz. No es recomendable deshabilitarlo ya que podria afectar negativamente al rendimiento y a la fiabilidad. Formato de las direcciones UDP usa el formato de direccion sockaddr_in de IPv4 descrito en ip(7). Gestion de errores Todos los errores fatales seran pasados al usuario como un resultado de error incluso cuando el conector no este conectado. Esto incluye errores asincronos recibidos de la red. Puede obtenerse un error por un paquete anterior que fue enviado por el mismo conector. Este comportamiento difiere de muchas otras implementaciones de BSD que no pasan ningun error al menos que el conector este conectado. El comportamiento de Linux viene dado por el RFC 1122. Por compatibilidad con codigo anterior es posible activar la opcion SO_BSDCOMPAT de SOL_SOCKET para recibir errores remotos (excepto EPROTO y EMSGSIZE) solo cuando el conector se ha conectado. Siempre se obvian los errores generados localmente. En versiones posteriores del nucleo se quito esta opcion del conector. Consulte socket(7). Cuando se activa la opcion IP_RECVERR todos los errores se almacenan en la cola de errores de conector y se pueden recibir mediante recvmsg(2) con la opcion MSG_ERRQUEUE activa. Interfaces /proc Los parametros de configuracion de UDP en un equipo pueden verse en los archivos del directorio /proc/sys/net/ipv4/. udp_mem (desde Linux 2.6.25) Es un vector con tres valores que gestiona la cantidad de paginas que los conectores UDP pueden tener a la cola. min Por debajo de esa cantidad de paginas, UDP no se preocupa de la cantidad de memoria que necesita. Si se sobrepasa, UDP comenzara a limitar su uso. pressure Este valor se introdujo para seguir el formato de tcp_mem. Consulte tcp(7). max Cantidad de paginas que pueden tener en cola todos los conectores UDP. Los valores por defecto se calculan durante el inicio del equipo en base a la cantidad de memoria disponible. udp_rmem_min (numero entero; valor por defecto: TAMANO_PAGINA; desde la version 2.6.25 de Linux) Tamano minimo, en bytes, de los buffers de recepcion empleados por los conectores UDP en la moderacion. Cada uno de los conectores podra emplear este tamano para recibir datos, aunque el total de paginas de los conectores UDP exceda el valor 'pressure' de udp_mem. udp_wmem_min (numero entero; por defecto: TAMANO_PAGINA; a partir de la version 2.6.25 de Linux) Tamano minimo, en bytes, del buffer de envio empleado por los conectores UDP en la moderacion. Cada conector puede emplear este tamano para enviar datos aunque la cantidad total de paginas de los conectores UDP sobrepase el valor de 'pressure' para udp_mem. Opciones de los conectores Para definir u obtener la opcion de un conector UDP debera invocar getsockopt(2) para obtenerla o setsockopt(2) para definir la opcion con el argumento de la opcion definido como IPPROTO_UDP. Salvo que se indique lo contrario, optval es un puntero a un numero int. A continuacion se incluye una lista con las opciones de los conectores especificas para UDP. Si desea ver otras opciones de los conectores tambien aplicables a UDP: consulte socket(7). UDP_CORK (desde Linux 2.5.44) Si se activa esta opcion, todos los datos de salida de ese conector se juntan en un unico datagrama que se tansmite cuando la opcion esta deshabilitado. No debe emplearse esta opcion si desea que el codigo fuente sea portable. UDP_SEGMENTE (desde Linux 4.18) Habilita la descarga de segmentacion UDP. La descarga de segmentacion reduce el coste de send(2) al transferir multiples datagramas de datos como un unico paquete grande a traves de la ruta de transmision del nucleo, incluso cuando excede la MTU. Lo mas tarde posible, el paquete grande se divide segun el tamano de segmento en una serie de datagramas. Este paso de descarga de segmentacion se delega en el hardware si es compatible; sino, se realiza mediante software. Esta opcion tomara un valor en el intervalo [0, USHRT_MAX] que establece el tamano del segmento: el tamano de la carga util del datagrama, excluyendo el encabezado UDP. El tamano del segmento debe elegirse de manera que se envien como maximo 64 datagramas en una sola llamada y que los datagramas despues de la segmentacion cumplan con las mismas reglas de MTU que se aplican a los datagramas enviados sin esta opcion. La descarga de segmentacion depende de la descarga de la suma de comprobacion, ya que las sumas de comprobacion de datagramas se calculan despues de la segmentacion. La opcion tambien se puede establecer para llamadas sendmsg(2) individuales pasandola como cmsg(3). Un valor de cero desactiva esta caracteristica. Esta opcion no debe usarse si se considera la portabilidad. UDP_GRO (desde Linux 5.0) Activa descarga de recepcion de UDP. Si esta habilitada, el conector puede recibir multiples datagramas de datos como un unico bufer grande, junto con un cmsg(3) que contiene el tamano del segmento. Esta opcion es la inversa de la descarga de segmentacion. Reduce el coste de recepcion al manejar multiples datagramas de datos como un solo paquete grande en la ruta de recepcion del kernel, incluso cuando eso excede la MTU. Esta opcion no debe usarse si se ortorga importancia a la portabilidad. Ioctls Estos ioctls pueden ser utilizados con ioctl(2). La sintaxis correcta es: int value; error = ioctl(udp_socket, ioctl_type, &value); FIONREAD (SIOCINQ) Obtiene un puntero hacia un entero como argumento. Devuelve el tamano del siguiente datagrama, en bytes, pendiente del entero o el valor 0 si no hay ninguno pendiente. Aviso: con FIONREAD no es posible saber si no hay ningun datagrama pendiente o si el siguiente datagrama contiene zero bytes de datos. Para distinguir ambos casos, es preferible el uso de select(2), poll(2) o epoll(7). TIOCOUTQ (SIOCOUTQ) Devuelve el numero de bytes de datos en la cola de envio local. Solo disponible en Linux 2.4 o superior. Ademas todos los ioctls documentados en ip(7) y socket(7) estan soportados. ERRORES Una operacion de enviar o recibir sobre un conector UDP puede devolver cualquier error documentado en socket(7) o ip(7). ECONNREFUSED No se ha asociado un receptor a la direccion de destino. Esto podria ser provocado por un paquete anterior enviado por el conector. VERSIONES IP_RECVERR es una nueva caracteristica de la version 2.2 de Linux. VEASE TAMBIEN ip(7), raw(7), socket(7), udplite(7) Documentacion del codigo fuente del nucleo Documentation/networking/ip-sysctl.txt. RFC 768 para el protocolo UDP. RFC 1122 para los requisitos del anfitrion (host). RFC 1191 para una descripcion del descubrimiento de la MTU de la ruta. TRADUCCION La traduccion al espanol de esta pagina del manual fue creada por Juan Piernas , Miguel Perez Ibars y Marcos Fouces Esta traduccion es documentacion libre; lea la GNU General Public License Version 3 o posterior con respecto a las condiciones de copyright. No existe NINGUNA RESPONSABILIDAD. Si encuentra algun error en la traduccion de esta pagina del manual, envie un correo electronico a . Paginas de manual de Linux 6.06 31 Octubre 2023 udp(7)