Scroll to navigation

ip(7) Miscellaneous Information Manual ip(7)

NOMBRE

ip - Implementación del protocolo IPv4 en Linux

SINOPSIS

#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* contiene a los anteriores */
tcp_socket = socket(AF_INET, SOCK_STREAM, 0);
udp_socket = socket(AF_INET, SOCK_DGRAM, 0);
raw_socket = socket(AF_INET, SOCK_RAW, protocolo);

DESCRIPCIÓN

Linux implementa el Protocolo de Internet (Internet Protocol, IP), version 4, descrito en RFC 791 y RFC 1122. ip contiene una implementación de multidestino del Nivel 2 según el RFC 1112. También contiene un enrutador IP incluyendo un filtro de paquetes.

La interfaz del programador es compatible con la de los conectores BSD. Consulte socket(7) para más información sobre conectores.

Los conectores IP se generan mediante socket(2):


socket(AF_INET, socket_type, protocolo);

Los tipos de conector válidos serían SOCK_STREAM para un conector de flujo, SOCK_DGRAM para abrir un conector de datagrama y SOCK_RAW para abrir un conector raw(7) que accede al protocolo IP directamente.

protocol representa el protocolo IP en el encabezado IP que se envía o recibe. Valores validos para protocol serían:

0 y IPPROTO_TCP para conectores de flujo tcp(7);
0 y IPPROTO_UDP para conectores de datagrama udp(7);
IPPROTO_SCTP para conectores de flujo sctp(7); y
IPPROTO_UDPLITE para conectores de datagrama udplite(7).

Para SOCK_RAW puede definir un protocolo IP válido según el IANA tal como se define en el RFC 1700.

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 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

An IP socket address is defined as a combination of an IP interface address and a 16-bit port number. The basic IP protocol does not supply port numbers, they are implemented by higher level protocols like udp(7) and tcp(7). On raw sockets .sin_port is set to the IP protocol.

See sockaddr_in(3type).

.sin_family is always set to AF_INET. This is required; in Linux 2.2 most networking functions return EINVAL when this setting is missing. .sin_port contains the port in network byte order. The port numbers below 1024 are called privileged ports (or sometimes: reserved ports). Only a privileged process (on Linux: a process that has the CAP_NET_BIND_SERVICE capability in the user namespace governing its network namespace) may bind(2) to these sockets. Note that the raw IPv4 protocol as such has no concept of a port, they are implemented only by higher protocols like tcp(7) and udp(7).

.sin_addr is the IP host address. The .s_addr member of the in_addr(3type) structure contains the host interface address in network byte order. in_addr(3type) should be assigned one of the INADDR_* values (e.g., INADDR_LOOPBACK) using htonl(3) or set using the inet_aton(3), inet_addr(3), inet_makeaddr(3) library functions or directly with the name resolver (see 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.

Direcciones especiales y reservadas

Hay varias direcciones especiales:

siempre hace referencia al equipo local a través del dispositivo loopback;
representa dirección para vinculación de sockets;
A packet addressed to INADDR_BROADCAST through a socket which has SO_BROADCAST set will be broadcast to all hosts on the local network segment, as long as the link is broadcast-capable.
En cualquier subred IP conectada localmente no punto a punto con un tipo de enlace que admita transmisiones, la dirección con el número más alto (por ejemplo, la dirección .255 en una subred con máscara de red 255.255.255.0) se designará como dirección de transmisión. No es práctica asignarla a una interfaz individual y solo se podrá direccionar con un socket en el que se haya configurado la opción SO_BROADCAST. Históricamente, los estándares de Internet también han reservado la dirección con el número más bajo (por ejemplo, la dirección .0 en una subred con máscara de red 255.255.255.0) para transmisión, aunque suele considerarse 'obsoleta' para este propósito. Algunas fuentes también se refieren a esto como 'dirección de red'. A partir de la versión 5.14 de Linux , se trata como una dirección de unidifusión ordinaria y se puede asignar a una interfaz.

Los estándares de Internet tradicionalmente también han reservado varias direcciones para usos particulares, aunque Linux ya no las trata de manera especial.

[0.0.0.1, 0.255.255.255]
[240.0.0.0, 255.255.255.254]
Las direcciones en estos intervalos (0/8 y 240/4) están reservadas globalmente. Desde Linux 5.3 y Linux 2.6.25, respectivamente, las direcciones 0/8 y 240/4, distintas de INADDR_ANY y INADDR_BROADCAST, se tratan como direcciones de unidifusión ordinarias. Estas direcciones se consideraron siempre reservadas y, tradicionalmente, los equipos no pueden interoperar con ellas.
[127.0.0.1, 127.255.255.254]
Las direcciones en este intervalo (127/8) se tratan como direcciones de loopback similares a la dirección loopback local estandarizada INADDR_LOOPBACK (127.0.0.1);
[224.0.0.0, 239.255.255.255]
Las direcciones en este rango (224/4) están dedicadas al uso de multidifusión.

Opciones de los conectores

See IPPROTO_IP(2const).

Interfaces /proc

See proc_sys_net_ipv4(5).

Ioctls

Todas las ioctls descritas en socket(7) se aplican a ip.

Las ioctls para configurar los parámetros de los dispositivos genéricos se describen en netdevice(7).

ERRORES

El usuario intentó ejecutar una operación sin los permisos necesarios. Estos incluyen: enviar un paquete a una dirección de transmisión sin tener configurado el indicador SO_BROADCAST; enviar un paquete a través de una ruta prohibida; modificar la configuración del firewall sin privilegios de administrador (la capacidad CAP_NET_ADMIN); enlazar a un puerto privilegiado sin privilegios de administrador (la capacidad CAP_NET_BIND_SERVICE).
Se ha intentado el enlace a una dirección ya en uso.
Se ha solicitado una interfaz inexistente o la dirección fuente solicitada no es local.
La operación se bloquearía sobre un conector bloqueante.
Ya se está realizando una operación de conexión sobre un conector no bloqueante.
Se ha cerrado la conexión durante un accept(2).
Ninguna entrada válida de la tabla de enrutamiento coincide con la dirección de destino. Este error puede ser provocado por un mensaje ICMP procedente de un enrutador remoto o por la tabla local de enrutamiento.
Se ha pasado un argumento inválido. Para las operaciones de envío, éste se puede producir al enviar a una ruta blackhole.
Se ha llamado a connect(2) sobre un conector ya conectado.
El datagrama es mayor que una MTU de la ruta y no puede ser fragmentado.
No hay suficiente memoria libre. Esto a menudo significa que la reserva de memoria está limitada por los límites del búfer de conectores, no por la memoria del sistema, aunque esto no es coherente al 100%.
Se ha llamado a SIOCGSTAMP sobre un conector en donde no han llegado paquetes.
No se ha configurado un subsistema del núcleo.
Se han pasado opciones de conector inválidas.
La operación solo está definida en un conector conectado pero el conector no está conectado.
El usuario no tiene permiso para establecer una prioridad alta, cambiar la configuración o enviar señales al proceso o grupo solicitado.
La conexión ha sido cerrada o cancelada por el otro extremo.
El conector no está configurado o se ha solicitado un tipo de conector desconocido.

Los protocolos superpuestos pueden generar otros errores. Vea tcp(7), raw(7), udp(7) y socket(7).

NOTAS

Debe tenerse especial precaución con la opción SO_BROADCAST: no tiene privilegios en Linux y es fácil sobrecargar la red con transmisiones descuidadas. Para nuevos protocolos de aplicación, es preferible utilizar un grupo de multidifusión en lugar de transmisión. Se desaconseja la radiodifusión. Consulte RFC 6762 para ver un ejemplo de un protocolo (mDNS) que utiliza el enfoque de multidifusión más moderno para comunicarse con un grupo abierto de hosts en la red local.

El empleo de la opción de nivel SOL_IP en conectores no es portable. Las pilas basadas en BSD emplean el nivel IPPROTO_IP

INADDR_ANY (0.0.0.0) y INADDR_BROADCAST (255.255.255.255) son neutrales en el orden de bytes. Esto hace que htonl(3) no tenga ningún efecto sobre ellos.

Compatibilidad

Por compatibilidad con Linux 2.0, todavía se soporta la sintáxis obsoleta socket(AF_INET, SOCK_PACKET, protocol) para abrir un conector de paquetes (packet(7)). Se recomienda no usar esta sintaxis y debería reemplazarse por socket(AF_PACKET, SOCK_RAW, protocol). La principal diferencia es la nueva estructura de direcciones sockaddr_ll para la información genérica de la capa de enlace en lugar de la antigua sockaddr_pkt.

ERRORES

Hay demasiados valores de error inconsistentes.

El error utilizado para diagnosticar el agotamiento del intervalo de puertos efímeros difiere entre las distintas llamadas al sistema que pueden asignar puertos efímeros (connect(2), bind(2), listen(2), sendto(2).

No se han descrito las ioctls para configurar las opciones de interfaz específicas de IP y las tablas ARP.

Recibir la dirección de destino original con MSG_ERRQUEUE en msg_name mediante recvmsg(2) no funciona en algunos núcleos de Linux 2.2.

VÉASE TAMBIÉN

IPPROTO_IP(2const), recvmsg(2), sendmsg(2), byteorder(3), capabilities(7), icmp(7), ipv6(7), netdevice(7), netlink(7), raw(7), socket(7), tcp(7), udp(7), ip(8)

The kernel source file Documentation/networking/ip-sysctl.rst.

RFC 791 para la especificación IP original. RFC1122 para los requerimientos IPv4 para lo anfitriones. RFC 1812 para los requeremientos IPv4 para los enrutadores.

TRADUCCIÓN

La traducción al español de esta página del manual fue creada por Juan Piernas <piernas@ditec.um.es>, Miguel Pérez Ibars <mpi79470@alu.um.es> y Marcos Fouces <marcos@debian.org>

Esta traducción es documentación libre; lea la GNU General Public License Version 3 o posterior con respecto a las condiciones de copyright. No existe NINGUNA RESPONSABILIDAD.

Si encuentra algún error en la traducción de esta página del manual, envíe un correo electrónico a debian-l10n-spanish@lists.debian.org.

8 Febrero 2026 Páginas de Manual de Linux 6.17