Provided by: manpages-pt_20040726-4_all bug

NOME

       tcp - protocolo TCP.

SINOPSE

       #include <sys/socket.h>
       #include <netinet/in.h>
       tcp_socket = socket(PF_INET, SOCK_STREAM, 0);

DESCRIÇÃO

       Esta  é  uma implementação do protocolo TCP definida nas RFC793, RFC1122 e RFC2001, com as
       extensões NewReno e SACK.  Ela fornece uma conexão confiável, orientada  a  fluxo  e  full
       duplex  entre  dois  sockets  sobre  ip(7).   O TCP garante que os dados chegam em ordem e
       retransmite pacotes perdidos. Ele gera e verifica um checksum por pacote para pegar  erros
       de transmissão. O TCP não preserva divisas de registros.

       Um  socket  TCP  fresco  não  tem  endereço  remoto  ou  local,  e  não está completamente
       especificado.  Para criar uma conexão TCP de saída, use connect(2)  para  estabelecer  uma
       conexão para outro socket TCP.  Para receber novas conexões de entrada, faça um bind(2) no
       primeiro socket para um endereço e uma porta locais, e então chame listen(2)  para  pôr  o
       socket  no  estado  de escuta. Depois que um novo socket para cada conexão de entrada pode
       ser aceito, usando-se accept(2).  Um socket que teve um accept ou um connect  chamado  com
       sucesso  é  especificado  completamente  e  pode transmitir dados.  Os dados não podem ser
       transmitidos em sockets de escuta ou que ainda não foram conectados.

       O Linux 2.2 suporta as extensões TCP de alta performance da RFC1323.  Isto inclui  janelas
       TCP  grandes  para suportar links com grande latência ou largura de banda.  Para fazer uso
       delas, os tamanhos dos buffers de envio e recepção devem ser incrementados. Eles podem ser
       setados  globalmente  com os sysctls net.core.wmem_default e net.core.rmem_default , ou em
       sockets individuais através do uso  das  opções  de  socket  SO_SNDBUF  e  SO_RCVBUF.   Os
       tamanhos   máximos   para   buffers   de  sockets  são  limitados  pelos  sysctls  globais
       net.core.rmem_max e net.core.wmem_max.  Veja socket(7) para mais informações.

       O TCP suporta dados urgentes. Dados urgentes são usados para  sinalizar  ao  receptor  que
       alguma  mensagem  importante  é  parte  do fluxo de dados e que deve ser processado o mais
       breve possível.  Para enviar dados urgentes, especifique a  opção  MSG_OOB  para  send(2).
       Quando  dados  urgentes  são  recebidos, o kernel envia um sinal SIGURG para o processo de
       leitura, ou para o processo ou grupo de processos que foi setado para o socket, usando  os
       ioctls FIOCSPGRP ou FIOCSETOWN.  Quando a opção de socket SO_OOBINLINE é habilitada, dados
       urgentes são postos no fluxo normal de dados (e podem ser testados pelo  ioctl  SIOCATMARK
       ),  caso  contrário  eles  podem ser somente recebidos quando a flag MSG_OOB é setada para
       sendmsg(2).

FORMATOS DE ENDEREÇO

       O TCP é montado acima do IP (veja ip(7)).  Os formatos de endereço definidos por ip(7)  se
       aplicam   ao   TCP.  O  TCP  suporta  apenas  comunicação  ponto-a-ponto;  broadcasting  e
       multicasting não são suportados.

SYSCTLS

       Estes sysctls podem ser acessados pelos arquivos /proc/sys/net/ipv4/* ou com  a  interface
       sysctl(2).  Além disso, muitos sysctls IP também se aplicam ao TCP; veja ip(7).

       tcp_window_scaling
              Habilita escalamento de janela TCP da RFC1323.

       tcp_sack
              Habilita o Reconhecimento Seletivo TCP da RFC2018.

       tcp_timestamps
              Habilita timestamps TCP da RFC1323.

       tcp_fin_timeout
              Quantidade  de  segundos  a  se esperar pelo pacote final FIN antes de o socket ser
              encerrado forçadamente. Esta é estritamente uma violação da especificação TCP,  mas
              é requerida para prevenir ataques de negação de serviço.

       tcp_keepalive_probes
              O  máximo  de provas de keep-alive do TCP a ser enviado antes de desistir. Os keep-
              alives  são  enviados  apenas  quando  a  opção  de  socket  SO_KEEPALIVE   estiver
              habilitada.

       tcp_keepalive_time
              O  número de segundos sem que nenhum dado seja transmitido, antes que um keep-alive
              seja transmitido em uma conexão. O padrão é de 10800 segundos (3 horas).

       tcp_max_ka_probes
              Quantas provas de keep-alive são enviada por execução de temporizador  lento.  Para
              prevenir rajadas, este valor não deve ser muito alto.

       tcp_stdurg
              Habilita  a  interpretação  estrita da RFC793 para o campo urgent-pointer do TCP. O
              padrão é usar a interpretação compatível com BSD, apontando para  o  primeiro  byte
              depois  do  dado urgente. A interpretação da RFC793 é para se apontar para o último
              byte  do  dado  urgente.  Habilitar  essa  opção  pode   levar   a   problemas   de
              interoperabilidade.

       tcp_syncookies
              Habilita  syncookies do TCP. O kernel precisa ser compilado com CONFIG_SYN_COOKIES.
              Os syncookies protegem um socket contra sobrecarga quando  muitas  conexões  tentam
              chegar.  Máquinas  clientes  podem  não  ser  mais  capazes de detectar uma máquina
              sobrecarregada com um timeout curto quando os syncookies são habilitados.

       tcp_max_syn_backlog
              Comprimento  da  fila  de  backlog  por  socket.  Como  no  Linux  2.2,  o  backlog
              especificado  em  listen(2)  somente especifica o comprimento da fila de backlog de
              sockets já estabelecidos.  A fila máxima de sockets  ainda  não  estabelecidos  (no
              estado  SYN_RECV  )  por  socket  de  escuta  é setado por este sysctl. Quando mais
              conexões pedem chegada, o Linux começa a  perder  pacotes.  Quando  syncookies  são
              habilitados, os pacotes ainda são respondidos e este valor é efetivamente ignorado.

       tcp_retries1
              Define  quantas  vezes uma resposta a uma requisição de conexão TCP é retransmitida
              antes de desistir.

       tcp_retries2
              Define quantas vezes um pacote TCP é retranmitido no estado estabelecido  antes  de
              desistir.

       tcp_syn_retries
              Define  quantas  vezes tenta enviar um pacote SYN inicial para um host remoto antes
              de desistir e retornar um erro. Deve ser menor que 255. Este é  somente  o  timeout
              para  conexões  de  saída;  para  conexões de entrada, o número de retransmissões é
              definido por tcp_retries1.

       tcp_retrans_collapse
              Tenta enviar pacotes de tamanho máximo durante a retransmissão. Isto é  usado  para
              contornar falhas de TCP em algumas pilhas.

OPÇÕES DE SOCKET

       Para  setar  ou  obter  uma  opção  de  socket  do  TCP,  chame  getsockopt(2) para ler ou
       setsockopt(2) para escrever a opção com  o  argumento  da  família  de  socket  setado  em
       SOL_TCP.  Além disso, muitas opções de socket SOL_IP são válidas em sockets TCP. Para mais
       informações, veja ip(7).

       TCP_NODELAY
              Desliga o algoritmo Nagle. Isto significa que os pacotes sempre  são  enviados  tão
              breve  quanto  possível, e não são introduzidos atrasos desnecessários, ao cutso de
              se ter mais pacotes na rede. Espera um flag booleano inteiro.

       TCP_MAXSEG
              Seta ou recebe o tamanho máximo de segmento para pacotes  TCP  de  saída.  Se  esta
              opção  é setada antes do estabelecimento da conexão, ela também muda o valor de MSS
              anunciado para a outra extremidade no pacote inicial. Valores maiores que o MTU  da
              interface são ignorados e não têm efeito.

       TCP_CORK
              Se  habilitado, não envia quadros parciais.  Todos os quadros parciais enfileirados
              são enviados quando a opção é apagada  novamente.   Isto  é  útil  para  cabeçalhos
              precedentes  antes da chamada de sendfile(2), ou para otimização do fluxo de saída.
              Esta opção não pode ser combinada com TCP_NODELAY.

IOCTLS

       Estes ioctls podem ser acessadas usando-se ioctl(2).  A sintaxe correta é:

              int value;
              error = ioctl(tcp_socket, ioctl_type, &value);

       FIONREAD
              Retorna a quantidade de dados não lidos  enfileirados  no  buffer  de  recepção.  O
              argumento é um ponteiro para um inteiro.

       SIOCATMARK
              Retorna  verdadeiro quando todos os dados urgentes já foram recebidos pelo programa
              do usuário.  Isto é usado junto com SO_OOBINLINE.  O argumento é um  ponteiro  para
              um inteiro para o resultado do teste.

       TIOCOUTQ
              Retorna,  no  ponteiro de valor inteiro passado, a quantidade de dados não enviados
              que está na fila de envio do socket.

MANIPULAÇÃO DE ERROS

       Quando ocorre um erro de rede, o TCP tenta reenviar o pacote. Se ele  não  é  bem-sucedido
       depois de algum tempo, é reportado ETIMEDOUT ou o último erro recebido nesta conexão.

       Algumas aplicações requerem uma notificação de erro mais rápida.  Isto pode ser habilitado
       com a opção de socket IP_RECVERR de nível SOL_IP opção é habilitada,  todos  os  erros  de
       entrada são passados imediatamente para o programa do usuário.  Use esta opção com cuidado
       - ela torna o TCP menos tolerante a mudanças de roteamento e outras condições  normais  da
       rede.

NOTAS

       Quando  ocorre erro na configuração da conexão de uma escrita em socket, SIGPIPE somente é
       levantado quando a opção de socket SO_KEEPOPEN é configurada.

       O TCP não tem dados reais para "out-of-band" (fora de banda); ele tem dados  urgentes.  Em
       Linux,  isto  significa  que se a outra extremidade envia dados out-of-band mais novos, os
       dados urgentes mais antigos são inseridos  como  dados  normais  no  fluxo  (mesmo  quando
       SO_OOBINLINE não está setado). Isto difere de pilhas baseadas no BSD.

       O  Linux  usa  a  interpretação compatível com o BSD para o campo de ponteiro urgente, por
       padrão. Isto viola a RFC1122, mas é requerido para interoperabilidade com  outras  pilhas.
       Ele pode ser mudado pelo sysctl tcp_stdurg

ERROS

       EPIPE  A  outra  extremidade encerrou o socket inesperadamente, ou uma leitura é executada
              em um socket desligado.

       ETIMEDOUT
              A outra extremidade não reconheceu os dados retransmitidos depois de algum tempo.

       EAFNOTSUPPORT
              Tipo de endereço de socket passado em sin_family não era AF_INET.

       Qualquer erro definido pelo ip(7) ou pela  camada  genérica  do  socket  também  pode  ser
       retornada para o TCP.

PROBLEMAS

       Nem todos os erros são documentados.

       O IPv6 não é descrito.

       As opções de proxy transparente não são descritas.

VERSÕES

       Os  sysctls  são  novos  no  Linux 2.2.  IP_RECVERR é uma nova implementação no Linux 2.2.
       TCP_CORK é novo no 2.2.

VEJA TAMBÉM

       socket(7), socket(2), ip(7), sendmsg(2), recvmsg(2).
       RFC793 para a especificação TCP.
       RFC1122 para os requerimentos do TCP e uma descrição do algoritmo Nagle.
       RFC2001 para alguns algoritmos do TCP.

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)