TCP(7)

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)