Provided by: manpages-pt-br_4.27.0-1_all bug

NOME

       raw - 'sockets' IPv4 diretos

SINOPSE

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

DESCRIÇÃO

       Os  sockets  diretos (não processados) permitem a implementação de novos protocolos sob o IPv4. Um socket
       direto recebe ou envia o datagrama bruto, sem incluir cabeçalhos de ligação.

       A camada IPv4 gera um cabeçalho IP ao enviar um pacote a menos que se ative a opção IP_HDRINCL do socket.
       Quando ela está habilitada, o pacote deve conter um cabeçalho IP. Um pacote IP  que  seja  recebido  terá
       sempre o cabeçalho IP.

       Para  criar um socket direto, um processo deve ter a capacidade CAP_NET_RAW no espaço de nomes do usuário
       que governa seu espaço de nomes de rede.

       Todos os pacotes ou erros relacionados ao número de protocolo  especificado  para  o  socket  direto  são
       passados     para     este     socket.     Para     uma    lista    dos    protocolos    atribuídos    em
       http://www.iana.org/assignments/protocol-numbers/ e getprotobyname(3).

       Um protocolo de IPPROTO_RAW implica que o IP_HDRINCL  está  habilitado  e  é  capaz  de  enviar  qualquer
       protocolo  IP  que é especificado no cabeçalho passado. Receber de todos os protocolos IP via IPPROTO_RAW
       não é possível usando sockets diretos.
              ┌───────────────────────────────────────────────────────────────┐
              │ Cabeçalhos IP são modificados quando enviados pelo IP_HDRINCL │
              ├─────────────────────────────────┬─────────────────────────────┤
              │ Soma de verificação do IP       │Sempre preenchido            │
              ├─────────────────────────────────┼─────────────────────────────┤
              │ Endereço de origem              │Preenchido quando zero       │
              ├─────────────────────────────────┼─────────────────────────────┤
              │ ID do pacote                    │Preenchido quando zero       │
              ├─────────────────────────────────┼─────────────────────────────┤
              │ Tamanho total                   │Sempre preenchido            │
              └─────────────────────────────────┴─────────────────────────────┘

       Se for especificado IP_HDRINCL e o cabeçalho IP tiver um endereço de  destino  diferente  de  zero,  este
       endereço  de  destino  é  usado para rotear o pacote. Quando for especificado MSG_DONTROUTE o endereço de
       destino deve apontar para uma  interface  local,  caso  contrário  é  feita  uma  consulta  à  tabela  de
       roteamento, mas as rotas com gateways são ignoradas.

       Se  não for especificado IP_HDRINCL as opções do cabeçalho IP podem ser ajustadas nos sockets diretos com
       setsockopt(2); ver ip(7) para mais informações.

       A partir do Linux 2.2, todos as opções e campos de cabeçalho IP podem ser configuradas usando  as  opções
       para  sockets  IP.  Isto  significa que os sockets diretos normalmente só são necessários para protocolos
       novos ou protocolos sem interface de usuário, como o ICMP.

       Um pacote recebido é passado para quaisquer sockets diretos que tenham sido atrelados  ao  seu  protocolo
       antes de ser passado para outros manipuladores deste protocolo (ex. módulos de protocolo do kernel).

   Formato de endereço
       Para enviar e receber datagramas (sendto(2), recvfrom(2) e similares), os sockets direto usam a estrutura
       de  endereço  padrão  sockaddr_in  definida  em ip(7). O campo sin_port pode ser usado para especificar o
       número do protocolo IP, mas é ignorado pelo Linux 2.2 e versões mais novas, e deve  ser  sempre  ajustado
       para zero (veja BUGS). Para pacotes de entrada. sin_port é definido com zero.

   Opções de socket
       As opções de sockets diretos podem ser ajustadas com setsockopt(2) ou lidas com getsockopt(2) passando-se
       o sinalizador designador de família IPPROTO_RAW.

       ICMP_FILTER
              Habilita um filtro especial para sockets diretos ligados ao protocolo IPPROTO_ICMP. Cada bit deste
              campo  designa  um  tipo  de mensagem ICMP a ser excluída. O padrão é não filtrar nenhuma mensagem
              ICMP.

       Além disso, todas as opções de socket IPPROTO_IP ip(7) válidas para sockets de datagrama são suportadas.

   Tratamento de erros
       Erros originários da rede só são passados para o usuário quando o socket está conectado ou o  sinalizador
       IP_RECVERR  está  habilitado.  Os  sockets  conectados  recebem  apenas  EMSGSIZE  e EPROTO para manter a
       compatibilidade. Com IP_RECVERR todos os erros de rede são enviados para a fila de erros.

ERROS

       EACCES O usuário tentou transmitir para um endereço de broadcast sem que o socket tivesse um  sinalizador
              de broadcast.

       EFAULT Foi fornecido um endereço de memória inválido.

       EINVAL Argumento inválido.

       EMSGSIZE
              O  pacote  é  grande  demais.  Ou  a pesquisa de MTU do caminho está habilitada (com o sinalizador
              IP_MTU_DISCOVER) ou o tamanho do pacote excede o máximo de 64 kB permitido pelo IPv4.

       EOPNOTSUPP
              Um sinalizador inválido foi passado para uma chamada de socket (como MSG_OOB).

       EPERM  O usuário não tem permissão para abrir sockets diretos. Apenas processos com ID efetivo de usuário
              com valor 0 ou o atributo CAP_NET_RAW podem fazer isto.

       EPROTO Um mensagem ICMP chegou reportando um erro de parâmetros.

VERSÕES

       IP_RECVERR e ICMP_FILTER surgiram no Linux 2.2. São extensões Linux e não devem ser usadas  em  programas
       portáveis.

       O  Linux  2.0  criou  alguma compatibilidade "bug a bug" com o BSD no código dos sockets diretos, quandoa
       opção de socket SO_BSDCOMPAT estava configurada. Desde o Linux 2.2, essa opção não possui mais efeito.

NOTAS

       Por padrão, os sockets diretos fazem a pesquisa de MTU (Unidade Máxima de Transmissão) do  caminho.  Isso
       significa  que  o  kernel  rastreará o MTU para um endereço IP de destino específico e retornará EMSGSIZE
       quando uma gravação de pacote direto o exceder. Quando isso acontecer, o  aplicativo  deverá  diminuir  o
       tamanho  do  pacote.  A  pesquisa  de  MTU do caminho também pode ser desativada usando a opção de socket
       IP_MTU_DISCOVER ou o arquivo /proc/sys/net/ipv4/ip_no_pmtu_disc,  consulte  ip(7)  para  obter  detalhes.
       Quando  desativados,  os soquetes brutos fragmentarão os pacotes de saída que excedem o MTU da interface.
       No entanto, desativá-lo não é recomendado por motivos de desempenho e confiabilidade.

       Um socket direto pode ser ligado a um endereço local específico usando a chamada bind(2). Caso contrário,
       todos os pacotes com o protocolo IP especificado são recebidos. Além disso, um  socket  direto  pode  ser
       associado a um dispositivo de rede específico usando SO_BINDTODEVICE; veja socket(7).

       Um  socket IPPROTO_RAW é transmissor apenas. Se você realmente quiser receber todos os pacotes IP, use um
       socket packet(7) com o protocolo ETH_P_IP. Observe que pacotes de sockets não remontam fragmentos IP,  ao
       contrário dos sockets diretos.

       Se  você  quiser  receber  todos  os  pacotes  ICMP de um socket de datagrama, é muitas vezes melhor usar
       IP_RECVERR neste socket. Veja ip(7).

       Os sockets diretos podem ler todos os protocolos IP no Linux, mesmo protocolos como ICMP ou TCP, que  têm
       um  módulo  de  protocolo  no kernel. Neste caso, os pacotes são passados tanto para o módulo do kernel e
       para o(s) socket(s) diretos.  Não  se  deve  contar  com  isso  em  programas  portáveis,  porque  muitas
       implementações de sockets em BSD têm limitações aqui.

       O  Linux  nunca  modifica  cabeçalhos  enviados pelo usuário, exceto para preencher alguns campos zerados
       conforme descrito em IP_HDRINCL. Muitas implementações de sockets diretos não se comportam assim.

       Os sockets diretos geralmente são pouco portáveis, devendo  ser  evitados  em  programas  que  se  deseje
       portar.

       Os  sockets diretos enviados leem o protocolo IP de sin_port; esta capacidade foi perdida no Linux 2.2. A
       solução é usar IP_HDRINCL.

BUGS

       Extensões transparentes de proxy não estão incluídas.

       Quando a opção IP_HDRINCL está habilitada os datagramas não serão fragmentados, e ficam limitados ao  MTU
       da interface.

       O  ajuste  do  protocolo  IP  para  envio no campo sin_port foi perdido no Linux 2.2. O protocolo que foi
       atrelado a este socket ou que foi especificado na chamada inicial à socket(2) é usado sempre.

VEJA TAMBÉM

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

       RFC 1191 para pesquisa de MTU do caminho.  RFC 791 e arquivo de cabeçalho <linux/ip.h> para  o  protocolo
       IP.

TRADUÇÃO

       A   tradução   para   português   brasileiro   desta  página  man  foi  criada  por  Paulo  César  Mendes
       <drpc@ism.com.br>, André Luiz Fassone <lonely_wolf@ig.com.br> e Rafael Fontenelle <rafaelff@gnome.org>.

       Esta tradução é uma documentação livre; leia a Licença Pública Geral GNU Versão 3 ou  posterior  para  as
       condições de direitos autorais.  Nenhuma responsabilidade é aceita.

       Se  você  encontrar  algum  erro  na  tradução  desta  página  de manual, envie um e-mail para a lista de
       discussão de tradutores.

Linux man-pages 6.9.1                              2 maio 2024                                            raw(7)