other languages
other sections
IP(7) | Manual do Programador Linux | IP(7) |
NOME¶
ip - Implementação do protocolo IPv4 em LinuxSINOPSE¶
#include <sys/socket.h>DESCRIÇÃO¶
Linux implementa o Protocolo Internet (IP), versão 4, descrito nas RFC791 e RFC1122. ip contém uma implementação de multicasting de nível 2, conforme a RFC1112. Ele também contém um roteador IP que inclui um filtro de pacotes. A interface do programador é compatível com sockets BSD. Para maiores informações sobre sockets, veja socket(7). Um socket IP é criado ao se chamar a função socket(2) no formato socket(PF_INET, socket_type, protocol). Tipos válidos de sockets são SOCK_STREAM para abrir um socket tcp(7) , SOCK_DGRAM para abrir um socket udp(7) , ou SOCK_RAW para abrir um socket raw(7) para acessar o protocolo IP protocol diretamente. protocol é o protocolo IP no header IP a ser recebido ou enviado. Os únicos valores válidos para protocol são 0 e IPPROTO_TCP para sockets TCP, e 0 e IPPROTO_UDP para sockets UDP. Para SOCK_RAW Você deve especificar um protocolo IP IANA válido, definido nos números atribuídos na RFC1700. Quando um processo quer receber novos pacotes ou conexões de entrada, ele deveria ligar um socket a um endereço local de interface, usando bind(2). Somente um socket IP pode ser ligado a qualquer par (endereço, porta) local dado. Quando INADDR_ANY é especificado na chamada 'bind' , o socket será ligado a todas as interfaces locais. Quando listen(2) ou connect(2) são chamados sobre um socket não ligado, o socket é automaticalmente ligado a uma porta livre aleatória, com o endereço local setado em INADDR_ANY.FORMATO DE ENDEREÇO¶
Um endereço de socket IP é definido como uma combinação de um endereço de interface IP e um número de porta. O protocolo IP básico não suporta número de portas, elas são implementadas por protocolos de nível mais alto, como udp(7) e tcp(7). Em sockets diretos, sin_port é setado para o protocolo IP.struct sockaddr_in { sa_family_t sin_family; /* família de endereço: AF_INET */ u_int16_t sin_port; /* porta na ordem de byte da rede */ struct in_addr sin_addr; /* endereço internet */ }; /* Endereço internet. */ struct in_addr { u_int32_t s_addr; /* endereço na ordem de byte da rede */ };
OPÇÕES DE SOCKETS¶
O IP suporta algumas opções de socket específicos de protocolo, que podem ser selecionado com setsockopt(2) e lidas com getsockopt(2). O nível de opção de socket para IP é SOL_IP. Um sinalizador inteiro para booleano é zero quando é falso, e em caso contrário é verdadeiro.- IP_OPTIONS
- Seta ou obtém as opções de IP a serem
enviadas com cada pacote deste socket. Os argumentos são um ponteiro
para um buffer de memória que contém as opções, e o
comprimento da opção. A chamada setsockopt(2) seta as
opções de IP associadas com o socket. O máximo tamanho de
opção para IPv4 é 40 bytes. Consulte RFC791 para ver as
opções permitidas. Quando o pacote inicial de
requisição de conexão para um socket SOCK_STREAM
contém opções de IP, as opções de IP serão
setadas automaticamente para as opções do pacote inicial, com os
headers de roteamento revertido. Pacotes entrantes não têm
permissão de mudar opções depois que a conexão é
estabelecida. O processamento de todas as opções entrantes de
roteamento da fonte é desabilitada por default, e pode ser habilitada
pelo uso do sysctl accept_source_route Para sockets de datagramas,
as opções de IP só podem ser setadas pelo usuário
local. Chamando-se getsockopt(2) com IP_OPTIONS põe-se
as opções de IP correntes, usadas para envio, no buffer
fornecido.
- IP_PKTINFO
- Passa uma mensagem ancilar IP_PKTINFO que contém uma estrutura pktinfo , que fornece algumas informações sobre o pacote entrante. Isto só funciona para sockets orientados a datagramas.
struct in_pktinfo { unsigned int ipi_ifindex; /* índice da interface */ struct in_addr ipi_spec_dst; /* endereço de destino do roteamento */ struct in_addr ipi_addr; /* endereço do Destino do Header */ };
- ipi_ifindex é o único índice da
interface onde o pacote foi recebido. ipi_spec_dst é o
endereço de destino da entrada da tabela de roteamento e
ipi_addr é o endereço de destino no cabeçalho do
pacote. Se IP_PKTINFO é passado para sendmsg(2)
então o pacote de saída será enviado sobre a interface
especificada em ipi_ifindex , com o endereço de destino setado
em ipi_spec_dst.
- IP_RECVTOS
- Se habilitado, a mensagem ancilar IP_TOS é
passada com pacotes entrantes. Ele contém um byte que especifica o
campo "Tipo de Serviço/Precedência" do cabeçalho
do pacote. Espera um flag booleano inteiro.
- IP_RECVTTL
- Quando este flag é setado, passa uma mensagem de
controle IP_RECVTTL com o campo "time to live" do pacote
recebido como um byte. Não é suportado para sockets
SOCK_STREAM
- IP_RECVOPTS
- Passa todas as opções de IP entrantes para o usuário em uma mensagem de controle IP_OPTIONS. O header de roteamento e outras opções já são preenchidas para o host local. Não é suportado para sockets SOCK_STREAM
- IP_RETOPTS
- Idêntico a IP_RECVOPTS , mas retorna
opções diretas não processadas, com opções de
timestamp e registro de rota não preenchidos para este hop.
- IP_TOS
- Seleciona ou recebe o campo Tipo-de-Serviço
(Tipo-Of-Service - TOS), que é enviado com todos os pacotes IP
originados deste socket. Ele é usado para priorizar pacotes na rede.
TOS é um byte. Há alguns padrões de flags TOS definidos:
IPTOS_LOWDELAY para minimizar delays para tráfego interativo,
IPTOS_THROUGHPUT para otimizar o fluxo, IPTOS_RELIABILITY
para otimizar a reliability, IPTOS_MINCOST deveria ser usado como
"dado preenchedor" onde transmissões lentas não causam
problemas. No máximo um desses valores de TOS podem ser
especificados. Outros bits são inválidos e serão zerados.
Linux envia datagramas IPTOS_LOWDELAY primeiro por default, mas o
comportamento exato depende da disciplina de fila configurada. Alguns
níveis de alta prioridade podem requerer um id efetivo de
usuário 0 ou a capabilidade CAP_NET_ADMIN. A prioridade
também pode ser setada de maneira independente de protocolo, pela
opção de socket ( SOL_SOCKET, SO_PRIORITY ) (veja
socket(7) ).
- IP_TTL
- Seta ou recupera o campo "time to live" corrente,
que é enviado em todos os pacotes originados neste socket.
- IP_HDRINCL
- Se habilitado, o usuário fornece um header ip na
frente dos dados. Somente válido para sockets SOCK_RAW. Veja
raw(7) para mais informação. Quando este flag é
habilitado, os valores setados por IP_OPTIONS, IP_TTL e
IP_TOS são ignorados.
- IP_RECVERR
- Habilita a passagem estendida e confiável de mensagens de erro. Quando habilitado sobre um socket de datagrama, todos os erros gerados serão enfileirados em uma fila de erros por-socket. Quando o usuário recebe um erro de uma operação de socket, os erros podem ser recebidos chamando-se recvmsg(2) com o sinalizador MSG_ERRQUEUE selecionado. A estrutura sock_extended_err descrevendo o erro será analisada em uma mensagem ancilar, com o tipo IP_RECVERR e o nível SOL_IP. Isto é útil para manipulação confiável de erros ou sockets desconectados. A parte dos dados recebidos a partir da fila de erros contém o pacote de erro.
- IP usa a estrutura sock_extended_err como segue: ee_origin é setado em SO_EE_ORIGIN_ICMP para erros recebidos como um pacote ICMP, ou SO_EE_ORIGIN_LOCAL para erros gerados localmente. ee_type e ee_code são setados para os campos "tipo" e "código" do header ICMP. ee_info contém o MTU descoberto para EMSGSIZE erros. ee_data não é usado atualmente. Quando o erro originou-se na rede, todas as opções de IP (IP_OPTIONS, IP_TTL, etc.) habilitadas no socket e contidas no pacote de erro são passadas como mensagens de controle. O "payload" do pacote que causou o erro é retornado como dado normal.
- Em sockets SOCK_STREAM , IP_RECVERR tem semânticas ligeiramente diferentes. Em vez de gravar os erros para o próximo timeout, ele passa todos os erros entrantes imediatamente para o usuário. Isto pode ser útil para conexões TCP muito curtas, que precisam de uma manipulação de erros rápida. Use esta opção com cuidado: ela torna o TCP não confiável, ao não permitir que ele se recupere propriamente de deslocamento de roteamento, e outras condições e quebras normais da especificação do protocolo. Note que TCP não tem fila de erro; MSG_ERRQUEUE é ilegal em sockets SOCK_STREAM Portanto todos os erros são retornados pelo retorno de função do socket ou SO_ERROR apenas.
- Para sockets diretos, IP_RECVERR habilita a passagem para o aplicativo de todos os erros ICMP recebidos, caso contrário os erros serão relatados apenas nos sockets conectados.
- Ele seta ou recupera um flag booleano inteiro.
IP_RECVERR é desligado, por padrão.
- IP_PMTU_DISCOVER
- Seta ou recupera a configuração do Path MTU
Discovery para um socket. Quando habilitado, o Linux realiza o Path MTU
Discovery neste socket como é definido na RFC1191. O sinalizador de
não fragmentação é selecionado em todos os datagramas
de saída. O padrão geral do sistema é controlado pelo
sysctl ip_no_pmtu_disc para sockets SOCK_STREAM , e
desabilitado para todos os outros. Para sockets que não são
SOCK_STREAM , é responsabilidade do usuário empacotar os
dados em blocos grandes, de tamanho igual ao MTU e fazer a
retransmissão, se necessário. O kernel rejeitará pacotes
que sejam maiores que o MTU da rota conhecida, se este flag é setada
(com EMSGSIZE ).
Flags do Path MTU Discovery Significado IP_PMTUDISC_WANT Usa configurações por-rota. IP_PMTUDISC_DONT Nunca executa Path MTU Discovery. IP_PMTUDISC_DO Sempre executa Path MTU Discovery.
- IP_MTU
- Recupera o PMTU atual do socket corrente. Somente válido quando o socket está conectado. Retorna um inteiro. Somente válido como um getsockopt(2).
- IP_ROUTER_ALERT
- Passa todos os pacotes "a serem encaminhados" com a opção "Alerta de Roteador IP" selecionada para este socket. Somente válido para sockets diretos. Isto é útil, por enquanto, para daemons RSVP do espaço do usuário. Os pacotes mandados não são encaminhados pelo kernel, é responsabilidade do usuário enviá-los novamente. A ligação do socket é ignorada, tais pacotes são apenas filtrados pelo protocolo. Espera um sinalizador inteiro.
- IP_MULTICAST_TTL
- Seta ou lê o valor de "time-to-live" de pacotes de multicast de saída para este socket. É muito importante para pacotes multicast que seja setado o menor TTL possível. O padrão é 1, o que significa que pacotes multicast não saem da rede local a menos que o programa do usuário o requeira explicitamente. O argumento é um inteiro.
- IP_MULTICAST_LOOP
- Seta ou lê um argumento booleano inteiro se pacotes de multicast enviados deveriam ser retornados por meio de "loop back" para os sockets locais.
- IP_ADD_MEMBERSHIP
- Integra a um grupo de multicast. O argumento é uma estrutura struct ip_mreqn
struct ip_mreqn { struct in_addr imr_multiaddr; /* endereço IP de grupo de multicast */ struct in_addr imr_address; /* endereço IP da interface local */ int imr_ifindex; /* índice da interface */ };
- imr_multiaddr contém o endereço do grupo de multicast com que a aplicação quer se ligar ou deixar. Deve ser um endereço de multicast válido. imr_address é o endereço da interface local com o qual o sistema deveria se unir ao grupo de multicast; se for igual a INADDR_ANY , uma interface apropriada é escolhida pelo sistema. imr_ifindex é um índice da interface que vai agregar/abandonar o grupo imr_multiaddr , ou 0 para indicar qualquer interface.
- Por questão de contabilidade, a antiga estrutura ip_mreq ainda é suportada. Ela difere de ip_mreqn somente pela não inclusão do campo imr_ifindex. Somente válido como um setsockopt(2).
- IP_DROP_MEMBERSHIP
- Abandona um grupo de multicast. O argumento é uma estrutura ip_mreqn ou ip_mreq , similar a IP_ADD_MEMBERSHIP.
- IP_MULTICAST_IF
- Seta o dispositivo local para um socket multicast. O argumento é uma estrutura ip_mreqn ou ip_mreq , similar a IP_ADD_MEMBERSHIP.
- Quando é passada uma opção inválida de socket, ENOPROTOOPT é retornado.
SYSCTLS¶
O protocolo IP suporta que a interface sysctl configure algumas opções globais. Os sysctls podem ser acessados pela leitura ou escrita dos arquivos /proc/sys/net/ipv4/* , ou usando a interface sysctl(2)- ip_default_ttl
- Seta o valor default do "time-to-live" para pacotes de saída. Isso pode ser alterado para cada socket, com a opção IP_TTL
- ip_forward
- Habilita "IP forwarding" com um flag booleano. "IP forwarding" também pode ser configurado em uma base por interface.
- ip_dynaddr
- Habilita endereço dinâmico de socket e reescrita mascarada de entrada em mudança de endereço de interface. Isto é útil para interface de dialup com endereços IP variáveis. 0 significa sem reescrita, 1 ativa a reescrita, e 2 habilita o modo verbose.
- ip_autoconfig
- Não documentado.
- ip_local_port_range
- Contém dois inteiros que definem a faixa padrão de portas locais alocados para sockets. A alocação começa com o primeiro número e termina no segundo. Note que eles não deveriam conflitar com as portas usadas pelo mascaramento (apesar de que o caso é manipulado). Escolhas arbitrárias também podem causar problemas com alguns filtros de pacotes de firewall que assumem informações sobre as portas locais em uso. O primeiro número deve ser pelo menos maior que 1024, o melhor é que seja maior que 4096 para evitar conflitos com portas mais conhecidas, e minimizar problemas com o firewall.
- ip_no_pmtu_disc
- Se habilitado, não realiza Path MTU Discovery para sockets TCP, por padrão. Path MTU discovery pode falhar se firewalls mal-configurados (que perdem todos os pacotes TCP) ou interfaces mal-configuradas (por exemplo, um link ponto-a-ponto onde ambos os extremos não concordam com o MTU) estão na rota. É melhor corrigir os roteadores problemáticos na rota do que desligar o Path MTU Discovery globalmente, porque a não execução deste último incorre em grandes custos para a rede.
- ipfrag_high_thresh, ipfrag_low_thresh
- Se a quantidade de fragmentos IP enfileirados atinge ipfrag_high_thresh , a fila é "podada" para ipfrag_low_thresh . Contém um inteiro com o número de bytes.
- ip_always_defrag
- [Novo com Kernel 2.2.13; em versões anteriores do
kernel, a feature era controlada em tempo de compilação pela
opção CONFIG_IP_ALWAYS_DEFRAG ]
- neigh/*
- Veja arp(7).
IOCTLS¶
Todos os ioctls descritos em socket(7) se aplicam a ip. Os ioctls que configuram firewalling são documentados em ipfw(7) do pacote ipchains Os ioctls que configuram parâmetros genéricos do dispositivo são descritos em netdevice(7).NOTAS¶
Tome cuidado com a opção SO_BROADCAST - ela não é privilegiada em Linux. É fácil sobrecarregar a rede com broadcasts descuidados. Para novos protocolos de aplicativos, é melhor usar um grupo de multicast em vez de broadcast. Broadcast é desencorajado. Algumas outras implementações de sockets BSD provêm as opções de socket IP_RCVDSTADDR e IP_RECVIF para conseguir o endereço de destino e a interface dos datagramas recebidos. O Linux tem o IP_PKTINFO , mais geral para a mesma tarefa.ERROS¶
- ENOTCONN
- A operação só é definida em sockets conectados socket, mas o socket não é conectado.
- EINVAL
- Um argumento inválido foi passado. Para operações de envio, isso pode ser causado pelo envio a uma rota blackhole
- EMSGSIZE
- O datagrama é maior que um MTU na rota e não pode ser fragmentado.
- EACCES
- O usuário tentou executar uma operação sem
as permissões necessárias. Isso inclui: Envio de pacote a um
endereço de broadcast sem ter o sinalizador SO_BROADCAST
seleciona. Envio de um pacote através da rota prohibit
Modificação de configuração de firewall sem
CAP_NET_ADMIN ou id de usuário efetivo 0. Ligação em
uma porta reservada sem CAP_NET_BIND_SERVICE ou id de usuário
efetivo 0.
- EADDRINUSE
- Tentativa de ligar a um endereço já em uso.
- ENOMEM and ENOBUFS
- Não há memória disponível suficiente.
- ENOPROTOOPT and EOPNOTSUPP
- Uma opção de socket inválida foi passada.
- EPERM
- Usuário não tem permissão para configurar alta prioridade, mudar configuração, ou enviar sinais para o processo ou grupo requerido.
- EADDRNOTAVAIL
- Uma interface não existente foi requerida, ou o endereço de origem requerido não era local.
- EAGAIN
- A operação sobre um socket não-bloqueável teria sido bloqueada.
- ESOCKTNOSUPPORT
- O socket não está configurado, ou um tipo desconhecido de socket foi requerido.
- EISCONN
- connect(2) foi chamado em um socket já conectado.
- EALREADY
- Uma operação de conexão sobre um socket não-bloqueável já está em progresso.
- ECONNABORTED
- Uma conexão foi fechada durante um accept(2).
- EPIPE
- A conexão foi inesperadamente fechada ou derrubada pelo outra extremidade.
- ENOENT
- SIOCGSTAMP foi chamado em um socket onde nenhum pacote chegou.
- EHOSTUNREACH
- Nenhuma entrada válida da tabela de roteamento combina com o endereço de destino. Este erro pode ser causado por uma mensagem ICMP de um roteador remoto para a tabela de roteamento local.
- ENODEV
- Dispositivo de rede não disponível ou não capaz de enviar IP.
- ENOPKG
- Um subsistema do kernel não foi configurado.
- ENOBUFS, ENOMEM
- Não há memória livre suficiente. Isso frequentemente quer dizer que a alocação de memória é limitada pelos limites do buffer de socket, e não pela memória do sistema, mas isso não é 100% consistente.
VERSÕES¶
IP_PKTINFO, IP_MTU, IP_PMTU_DISCOVER, IP_PKTINFO, IP_RECVERR e IP_ROUTER_ALERT são novas opções no Linux 2.2. struct ip_mreqn é novo no Linux 2.2. Linux 2.0 somente suporta ip_mreq. Os sysctls foram introduzidos com o Linux 2.2.COMPATIBILIDADE¶
Por questões de compatibilidade com o Linux 2.0, a sintaxe obsoleta socket(PF_INET, SOCK_RAW, protocol) ainda é suportada para abrir um socket packet(7) socket(PF_PACKET, SOCK_RAW, protocol) nova estrutura de endereço sockaddr_ll para informação genérica da camada de link, em vez do antigo sockaddr_pkt.PROBLEMAS¶
Há muitos valores de erro inconsistentes. Os ioctls que configuram opções de interface específicos do IP e tabelas ARP não estão descritos.AUTORES¶
Esta man page foi escrita por Andi Kleen.VEJA TAMBÉM¶
sendmsg(2), recvmsg(2), socket(7), netlink(7), tcp(7), udp(7), raw(7), ipfw(7). RFC791 para a especificação IP original.TRADUZIDO POR LDP-BR em 21/08/2000.¶
Rubens de Jesus Nogueira <darkseid99@usa.net> (tradução) André L. Fassone Canova <lonelywolf@blv.com.br> (revisão)11 de maio de 1999 | Linux Man Page |