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.