TCP(7) | Manual do Programador Linux | TCP(7) |
tcp - protocolo TCP.
#include <sys/socket.h>
#include <netinet/in.h>
tcp_socket = socket(PF_INET, SOCK_STREAM, 0);
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).
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.
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).
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).
Estes ioctls podem ser acessadas usando-se ioctl(2). A sintaxe correta é:
int value; error = ioctl(tcp_socket, ioctl_type, &value);
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.
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
Qualquer erro definido pelo ip(7) ou pela camada genérica do socket também pode ser retornada para o TCP.
Nem todos os erros são documentados.
O IPv6 não é descrito.
As opções de proxy transparente não são descritas.
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.
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.
Rubens de Jesus Nogueira <darkseid99@usa.net> (tradução) André L. Fassone Canova <lonelywolf@blv.com.br> (revisão)
25/04/1999 | Linux Man Page |