Provided by:
manpages-pt_20040726-1_all 
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)