Linux repositories inspector
Página man de Linux

manpages-es

Spanish man pages

man-pages-es

Spanish man pages from the Linux Documentation Project

manpages

Manual pages about using a GNU/Linux system

man-pages

Linux kernel and C library user-space interface documentation

NOMBRE

ip - Implementación Linux del protocolo IPv4

SINOPSIS

#include <sys/socket.h>
#include <netinet/in.h>
tcp_socket = socket(PF_INET, SOCK_STREAM, 0);
raw_socket = socket(PF_INET, SOCK_RAW, protocol);
udp_socket = socket(PF_INET, SOCK_DGRAM, protocol);

DESCRIPCIÓN

Linux implementa el Protocolo de Internet (Internet Protocol, IP), version 4, descrito en RFC791 y RFC1122. ip contiene una implementación de multidestino del Nivel 2 según el RFC1112. También contiene un enrutador IP incluyendo un filtro de paquetes.
La interfaz del programador es compatible con la de los conectores BSD. Para más información sobre conectores, vea socket(7).
Un conector IP se crea llamando a la función socket(2) de la forma socket(PF_INET, socket_type, protocol). Los tipos de conectores válidos son SOCK_STREAM para abrir un conector tcp(7), SOCK_DGRAM para abrir un conector udp(7) o SOCK_RAW para abrir un conector directo ( raw(7)) para acceder al protocolo IP directamente. protocol es el protocolo IP en la cabecera IP a enviar o recibir. Los únicos valores válidos para protocol son 0 y IPPROTO_TCP para conectores TCP, y 0 y IPPROTO_UDP para conectores UDP. Para SOCK_RAW debe especificar un protocolo IP válido del IANA definido por uno de los números asignados en el RFC1700.
Cuando un proceso quiere recibir nuevos paquetes de entrada o conexiones, debe enlazar un conector a una dirección de la interfaz local usando bind(2). Sólo se puede ligar un conector IP a un par (dirección, puerto) dado. Cuando en la llamada a bind se especifica INADDR_ANY, el conector será ligado a todas las interfaces locales. Cuando se llama a listen(2) o connect(2) con un conector no enlazado, el conector será automáticamente ligado a un puerto aleatorio libre cuya dirección local sea INADDR_ANY. Una dirección local de conector TCP que haya sido enlazada, no estará disponible durante un cierto tiempo después de que se cierre, a menos que se haya activado la opción SO_REUSEADDR. Se debe tener cuidado al usar esta opción ya que hace que TCP sea menos fiable.

FORMATO DE LAS DIRECCIONES

Una dirección de conector IP se define como una combinación de una dirección de interfaz IP y un número de puerto. El protocolo IP básico no proporciona números de puerto. Estos son implementados por protocolos de un nivel más alto como udp(7) y tcp(7). En los conectores directos, a sin_port se le asigna el protocolo IP.
struct sockaddr_in {
    sa_family_t    sin_family; /* familia de direcciones:
                                  AF_INET */
    u_int16_t      sin_port;   /* puerto con los bytes en el
                                  orden de red */
    struct in_addr  sin_addr;  /* dirección de Internet */
};

/* Dirección de Internet. */ struct in_addr { u_int32_t s_addr; /* dirección con los bytes en el orden de red */ };
A sin_family siempre se le asigna el valor AF_INET. Este valor es necesario. En Linux 2.2, la mayoría de las funciones de red devuelven EINVAL cuando se ha omitido este valor. sin_port contiene el puerto con los bytes en orden de red. Los números de puerto por debajo de 1024 se llaman puertos reservados. Sólo los procesos con identificador de usuario efectivo 0 o la capacidad CAP_NET_BIND_SERVICE pueden realizar enlaces mediante bind(2) a estos conectores. Dese cuenta que el protocolo IPv4 puro no posee como tal el concepto de puerto. Estos son implementados por protocolos superiores como tcp(7) y udp(7).
sin_addr es la dirección IP del anfitrión (host). El miembro s_addr de struct in_addr contiene la dirección de la interfaz del anfitrión con los bytes en orden de red. Sólo se debería acceder a in_addr usando las funciones de biblioteca inet_aton(3), inet_addr(3) y inet_makeaddr(3), o directamente mediante el mecanismo de resolución de nombres (vea gethostbyname(3)). Las direcciones IPv4 se dividen en direcciones unidestino, de difusión y multidestino. Las direcciones unidestino especifican una única interfaz de un anfitrión, las direcciones de difusión especifican todos los anfitriones de una red y las direcciones multidestino identifican a todos los anfitriones de un grupo multidestino. Sólo se pueden enviar datagramas a o recibir datagramas de direcciones de difusión cuando está activa la opción de conector SO_BROADCAST. En la implementación actual, los conectores orientados a conexión sólo pueden usar direcciones unidestino.
Dese cuenta que la dirección y el puerto se almacenan siempre en orden de red. En particular, esto significa que necesita llamar a htons(3) con el número que se ha asignado al puerto. Todas las funciones de manipulación de dirección/puerto en la biblioteca estándar trabajan en orden de red.
Existen varias direcciones especiales: INADDR_LOOPBACK (127.0.0.1) siempre se refiere al ordenador local a través del dispositvo ‘loopback’. INADDR_ANY (0.0.0.0) significa cualquier dirección para enlazar. INADDR_BROADCAST (255.255.255.255) significa cualquier ordenador y, por razones históricas, tiene el mismo efecto en el enlace que INADDR_ANY.

OPCIONES DE LOS CONECTORES

IP soporta algunas opciones de conector específicas del protocolo que se pueden configurar con setsockopt(2) y leer con getsockopt(2). El nivel de opciones de conector para IP es SOL_IP. Una opción entera booleana es cero cuando es falsa y cualquier otra cosa cuando es cierta.
IP_OPTIONS
Establece u obtiene las opciones IP a enviar con cada paquete desde este conector. Los argumentos son punteros a un buffer de memoria que contiene las opciones y la longitud de las opciones. La llamada setsockopt(2) establece las opciones IP asociadas a un conector. El tamaño máximo de opción para IPv4 es de 40 bytes. Vea RFC791 para las opciones permitidas. Cuando el paquete inicial de petición de conexión para un conector SOCK_STREAM contiene opciones IP, las opciones IP se configurarán automáticamente al valor de las opciónes del paquete inicial con las cabeceras de enrutamiento invertidas. No se permite que los paquetes de entrada cambien las opciones después de que la conexión se haya establecido. El procesamiento de todas las opciones de enrutamiento de la fuente de entrada está desactivado por defecto y se puede activar usando la sysctl accept_source_route. Otras opciones, como las marcas de tiempo, todavía se siguen manejando. Para los conectores de datagramas, las opciones IP sólo pueden ser configuradas por el usuario local. Llamar a getsockopt(2) con IP_OPTIONS coloca en el buffer proporcionado las opciones IP actuales usadas para enviar.
IP_PKTINFO
Pasa un mensaje auxiliar IP_PKTINFO que contiene una estructura pktinfo que proporciona alguna información sobre los paquetes de entrada. Esto sólo funciona para conectores orientados a datagramas. El argumento es un indicador que le dice al conector si debería pasar el mensaje IP_PKTINFO. El mensaje en sí mismo sólo puede ser enviado/obtenido como un mensaje de control con un paquete usando recvmsg(2) o sendmsg(2).
struct in_pktinfo {
    unsigned int   ipi_ifindex;  /* Índice de la interfaz */
    struct in_addr ipi_spec_dst; /* Dirección local */
    struct in_addr ipi_addr;     /* Dirección de destino en la
                                    cabecera */
};
ipi_ifindex es el índice de la interfaz en la que se recibió el paquete. ipi_spec_dst es la dirección local del paquete y ipi_addr es la dirección de destino en la cabecera del paquete. Si se pasa IP_PKTINFO a sendmsg(2), el paquete de salida se enviará a través de la interfaz especificada en ipi_ifindex con la dirección de destino indicada en ipi_spec_dst.
IP_RECVTOS
Cuando está activa, se pasa el mensaje auxiliar IP_TOS con los paquetes de entrada. Contiene un byte que especifica el campo Tipo de Servicio/Precedencia de la cabecera del paquete. Espera una opción entera booleana.
IP_RECVTTL
Cuando esta opción está activa, pasa un mensaje de control IP_RECVTTL con el campo "tiempo de vida" (time to live) del paquete recibido dado por un byte. No soportada por conectores SOCK_STREAM.
IP_RECVOPTS
Pasa todas las opciones IP de entrada al usuario en un mensaje de control IP_OPTIONS. La cabecera de enrutamiento y otras opciones ya las completa el anfitrión local. No soportada para conectores SOCK_STREAM.
IP_RETOPTS
Identica a IP_RECVOPTS pero devuelve opciones directas sin procesar cuyas marcas de tiempo y opciones del registro de ruta no son completadas por este anfitrión.
IP_TOS Establece o devuelve el campo Tipo de Servicio (Type-Of-Service, TOS) a enviar con cada paquete IP creado desde este conector. Se usa para priorizar los paquetes en la red. TOS es un byte. Existen algunas opciones TOS estándares definidas: IPTOS_LOWDELAY para minizar los retrasos en el caso de tráfico interactivo, IPTOS_THROUGHPUT para optimizar el rendimiento, IPTOS_RELIABILITY para optimizar la fiabilidad e IPTOS_MINCOST, que se debería usar para "datos de relleno" donde no tenga sentido una transmisión lenta. Como mucho, se puede especificar uno de estos valores TOS. Los otros bits son inválidos y se limpiarán. Por defecto, Linux envía primero datagramas IPTOS_LOWDELAY pero el comportamiento exacto depende de la disciplina de encolamiento configurada. Algunos niveles de prioridad alta pueden necesitar un identificador de usuario efectivo 0 o la capacidad CAP_NET_ADMIN. La prioridad también se puede configurar de una manera independiente del protocolo mediante la opción de conector ( SOL_SOCKET, SO_PRIORITY) (vea socket(7)).
IP_TTL Establece u obtiene el campo "tiempo de vida" actual que se envía en cada paquete enviado desde este conector.
IP_HDRINCL
Cuando está activa, el usuario proporciona una cabecera IP delante de los datos de usuario. Sólo válida para conectores SOCK_RAW. Vea raw(7) para más información. Cuando esta opción está activa los valores configurados mediante IP_OPTIONS, IP_TTL y IP_TOS se ignoran.
IP_RECVERR (definido en <linux/errqueue.h>)
Habilita el paso adicional fiable de mensajes de error. Cuando se activa en un conector de datagramas todos los errores generados se encolarán en una cola de errores por conector. Cuando el usuario recibe un errore procedente de una operación con un conector, se pueden recibir el errore llamando a recvmsg(2) con la opción MSG_ERRQUEUE activa. La estructura sock_extended_err que describe el error se pasará en un mensaje auxiliar con el tipo IP_RECVERR y el nivel SOL_IP. Esto es útil para el manejo fiable de errores en conectores no conectados. La parte de datos recibida de la cola de errores contiene el paquete de error.
El mensaje de control IP_RECVERR contiene una estructura sock_extended_err:
#define SO_EE_ORIGIN_NONE       0
#define SO_EE_ORIGIN_LOCAL      1
#define SO_EE_ORIGIN_ICMP       2
#define SO_EE_ORIGIN_ICMP6      3

struct sock_extended_err { u_int32_t ee_errno; /* número de error */ u_int8_t ee_origin; /* dónde se originó el error */ u_int8_t ee_type; /* tipo */ u_int8_t ee_code; /* código */ u_int8_t ee_pad; u_int32_t ee_info; /* información adicional */ u_int32_t ee_data; /* otros datos */ /* More data may follow */ };
struct sockaddr *SO_EE_OFFENDER(struct sock_extended_err *);
ee_errno contiene el número de error del error puesto en cola. ee_origin es el código de origen que identifica al origen del error. Los otros campos son específicos del protocolo. La macro SO_EE_OFFENDER devuelve un puntero a la dirección del objeto de red dónde se originó el error dado un puntero al mensaje auxiliar. Si la dirección no es conocida, el miembro sa_family de sockaddr valdrá AF_UNSPEC y los otros campos de sockaddr serán indefinidos.
IP usa la estructura sock_extended_err como sigue: a ee_origin se le asigna el valor SO_EE_ORIGIN_ICMP para errores recibidos en un paquete ICMP o SO_EE_ORIGIN_LOCAL para errores generados localmente. Los valores desconocidos deben ser ignorados. A ee_type y ee_code se les asignan los campos tipo y código de la cabecera ICMP. ee_info contiene la MTU descubierta para errores EMSGSIZE. El mensaje contiene también la estructura sockaddr_in del nodo que provocó el error, a la cual se puede acceder con la macro SO_EE_OFFENDER. El campo sin_family de la dirección devuelta por SO_EE_OFFENDER valdrá AF_UNSPEC cuando la fuente sea desconocida. Cuando el error se originó en la red, todas las opciones IP (IP_OPTIONS, IP_TTL, etc.) activas en el conector y contenidas en el paquete de error, se pasan como mensajes de control. El contenido útil del paquete que ha provocado el error se devuelve como datos normales.
Dese cuenta que TCP no posee una cola de errores. MSG_ERRQUEUE es ilegal en conectores SOCK_STREAM. Por tanto, todos los errores son devueltos sólo por funciones de conector o mediante SO_ERROR.
Para conectores directos (raw), IP_RECVERR activa el paso de todos los errores ICMP recibidos a la aplicación. En otro caso, sólo se informa de los errores que se producen en conectores conectados.
Esta opción establece u obtiene un valor booleano entero. Por defecto, IP_RECVERR está desactivada.
IP_PMTU_DISCOVER
Establece o recibe la configuración del "descubrimiento de la MTU de la ruta" para el conector. Cuando se activa, Linux realizará el descubrimiento de la MTU de la ruta en este conector tal y como se define en RFC1191. La opción de "no fragmentar" se activa en todos los datagramas de salida. El valor global por defecto del sistema se controla mediante la sysctl ip_no_pmtu_disc para los conectores SOCK_STREAM y para todos los demás está desactivado. Para conectores que no son SOCK_STREAM es responsabilidad del usuario enpaquetar los datos en trozos de tamaño MTU y realizar la retransmisión si es necesario. El núcleo rechazará aquellos paquetes que sean más grandes que la MTU de ruta conocida si esta opción está activa (con EMSGSIZE ).
⇧ Top