Provided by: manpages-es_1.55-10_all bug

NOMBRE

       raw, SOCK_RAW - Conectores directos (raw) IPv4 de Linux

SINOPSIS

       #include <sys/socket.h>
       #include <netinet/in.h>
       raw_socket = socket(PF_INET, SOCK_RAW, int protocol);

DESCRIPCIÓN

       Los conectores directos permiten implementar nuevos protocolos IPv4 en el espacio de usuario. Un conector
       directo recibe o envía el datagrama crudo sin incluir cabeceras del nivel de enlace.

       La  capa  IPv4  genera  una  cabecera  IP  cuando  se  envía  un paquete, a menos que se active la opción
       IP_HDRINCL en el conector.  Cuando se activa, el paquete debe contener una cabecera IP. En la  recepción,
       la cabecera IP siempre está incluida en el paquete.

       Sólo  los  procesos con un identificador de usuario efectivo de 0 o la capacidad CAP_NET_RAW pueden abrir
       conectores directos.

       Todos los paquetes o errores cuyo protocolo coinciden con el número protocol especificado por el conector
       directo, se pasan a este conector. Para una lista de los protocolos permitidos vea los números  asignados
       en RFC1700 y getprotobyname(3).

       Un  protocolo  IPPROTO_RAW implica que IP_HDRINCL está activa y preparada para enviar cualquier protocolo
       IP especificado en la cabecera pasada.  Recibir todos los protocolos IP via IPPROTO_RAW no es posible con
       conectores directos.

       ┌──────────────────────────────────────────────────────────────┐
       │ Campos de cabecera IP modificados en el envío por IP_HDRINCL │
       ├──────────────────────────────┬───────────────────────────────┤
       │ Suma de comprobación IP      │ Siempre se rellena.           │
       ├──────────────────────────────┼───────────────────────────────┤
       │ Dirección fuente             │ Se rellena cuando es cero.    │
       ├──────────────────────────────┼───────────────────────────────┤
       │ Identificador del paquete    │ Se rellena cuando es cero.    │
       ├──────────────────────────────┼───────────────────────────────┤
       │ Longitud total               │ Siempre se rellena.           │
       └──────────────────────────────┴───────────────────────────────┘

       Si se especifica IP_HDRINCL y la cabecera IP  tiene  una  dirección  de  destino  distinta  de  cero,  la
       dirección   de  destino  del  conector  se  utiliza  para  enrutar  el  paquete.   Cuando  se  especifica
       MSG_DONTROUTE, la dirección de destino debe referirse a una interfaz local, de lo contrario,  se  realiza
       una búsqueda en la tabla de enrutamiento, aunque se ignoran las rutas que se dirigen a enrutadores.

       Si  no  se  activa  IP_HDRINCL,  se  pueden  configurar  las opciones de la cabecera IP de los conectores
       directos con setsockopt(2).  Vea ip(7) para más información.

       En Linux 2.2 todas las opciones y campos de las cabeceras IP se pueden configurar usando las opciones  de
       los  conectores  IP.  Esto  significa  que  los  conectores  directos son usualmente necesarios sólo para
       protocolos nuevos o protocolos que no tienen una interfaz de usuario (como ICMP).

       Cuando se recibe un paquete, se pasa a cualquier conector directo que haya sido asociado a  su  protocolo
       antes  de  que sea pasado al manejador de cualquier otro protocolo (por ejemplo, los módulos de protocolo
       del núcleo).

FORMATO DE LAS DIRECCIONES

       Los conectores directos usan la estructura de direcciones estándar sockaddr_in  definida  en  ip(7).   El
       campo  sin_port se podría usar para especificar el número de protocolo IP, pero en Linux 2.2 se ignora al
       enviar y siempre debería valer 0 (vea FALLOS).  Para los paquetes de entrada, a sin_port se le asigna  el
       protocolo del paquete.  Vea el fichero cabecera <netinet/in.h> para protocolos IP válidos.

OPCIONES DE LOS CONECTORES

       Las  opciones de los conectores directos se pueden configurar con setsockopt(2) y leer con getsockopt(2),
       pasando la opción de familia SOL_RAW.

       ICMP_FILTER
              Activa un filtro especial para los conectores directos asociados al  protocolo  IPPROTO_ICMP.   El
              valor  tiene  un  bit activo para cada tipo de mensaje ICMP que debe filtrarse. Por defecto, no se
              filtra ningún mensaje ICMP.

       Además, se soportan todas las opciones SOL_IP de ip(7) válidas.

OBSERVACIONES

       Los conectores directos fragmentan un paquete cuando su longitud total excede la MTU de la  interfaz  (no
       obstante,  vea  FALLOS).  Una  alternativa  más  rápida  y  favorable  para  la  red  es  implementar  el
       descubrimiento del MTU de la ruta como se describe en la sección IP_PMTU_DISCOVER de ip(7).

       Se puede asociar un conector directo a una dirección local específica usando la llamada bind(2).   Si  no
       está  asociado,  se reciben todos los paquetes con el protocolo IP especificado. Además, se puede asociar
       un conector directo a un dispositivo de red específico usando SO_BINDTODEVICE.  Vea socket(7).

       Un conector IPPROTO_RAW es sólo de envío. Si verdaderamente quiere recibir todos los paquetes IP, use  un
       conector  packet(7) con el protocolo ETH_P_IP.  Dése cuenta que, a diferencia de los conectores directos,
       los conectores de paquete no reensamblan fragmentos IP.

       Si quiere recibir todos los paquetes ICMP para un conector  de  datagramas,  normalmente  es  mejor  usar
       IP_RECVERR en ese conector particular. Vea ip(7).

       Los conectores directos pueden interceptar todos los protocolos IP de Linux, incluso protocolos como ICMP
       o  TCP  que poseen un módulo de protocolo dentro del núcleo. En este caso, los paquetes se pasan tanto al
       módulo del núcleo como al conector (o conectores) directo. No se debería confiar  en  esto  en  programas
       transportables ya que muchas otras implementaciones de conectores BSD tienen limitaciones aquí.

       Linux  nunca  cambia  las cabeceras pasadas por el usuario (salvo para rellenar algunos campos de valor 0
       como se ha descrito en IP_HDRINCL).  Esto es diferente de muchas  otras  implementaciones  de  conectores
       directos.

       Generalmente, los conectores directos son poco transportables y deberían evitarse en programas destinados
       a ser transportables.

       En el envío a través de conectores directos se debería tomar el protocolo IP de sin_port.  Esta capacidad
       se perdió en Linux 2.2. La forma de solucionar esto es usar IP_HDRINCL.

MANEJO DE ERRORES

       Sólo se pasan al usuario los errores generados por la red cuando el conector está conectado o está activa
       la  opción  IP_RECVERR.   Para conectores conectados, sólo se pasan EMSGSIZE y EPROTO por compatibilidad.
       Con IP_RECVERR todos los errores de red se guardan en la cola de errores.

ERRORES

       EMSGSIZE
              Paquete demasiado grande. O bien el descubrimiento del MTU de  la  ruta  está  activo  (la  opción
              IP_PMTU_DISCOVER  de  los conectores) o bien el tamaño del paquete excede el máximo tamaño de 64KB
              permitido por IPv4.

       EACCES El usuario ha intentado enviar a una dirección de difusión sin tener activa la opción de  difusión
              en el conector.

       EPROTO Ha llegado un error ICMP informando de un problema de parámetros.

       EFAULT Se ha pasado una dirección de memoria inválida.

       EOPNOTSUPP
              Se ha pasado a la llamada socket una opción inválida (como MSG_OOB).

       EINVAL Argumento inválido.

       EPERM  El usuario no tiene permiso para abrir conectores directos. Sólo los procesos con un identificador
              de usuario efectivo de 0 o el atributo CAP_NET_RAW pueden hacerlo.

VERSIONES

       IP_RECVERR  y  ICMP_FILTER  son  nuevos  en  la versión 2.2 de Linux. Ambos son extensiones de Linux y no
       deberían usarse en programas transportables.

       La versión 2.0 de Linux activaba cierta compatibilidad fallo  a  fallo  con  BSD  en  el  código  de  los
       conectores directos cuando se activaba la opción SO_BSDCOMPAT. Ésto se ha eliminado en la versión 2.2.

FALLOS

       No se han descrito las extensiones de proxy transparente.

       Cuando se activa la opción IP_HDRINCL, los datagramas no se fragmentan y están limitados por la MTU de la
       interfaz.  Ésta es una limitación de la versión 2.2 de Linux.

       La  posibilidad  de  especificar  el  protocolo IP en sin_port durante el envío desapareció en Linux 2.2.
       Siempre se usa el protocolo al que se enlazó el conector o el que se especificó en la llamada  inicial  a
       socket(2).

AUTOR

       Esta página de manual fue escrita por Andi Kleen.

VÉASE TAMBIÉN

       ip(7), socket(7), recvmsg(2), sendmsg(2)

       RFC1191 para el descubrimiento del MTU de la ruta.

       RFC791 y el fichero cabecera <linux/ip.h> para el protocolo IP.

Página man de Linux                              2 octubre 1998                                           RAW(7)