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)