O Protocolo de Controle de Transmissão (TCP) é um protocolo de rede que define como os dados são trocados entre os componentes da rede. Quase todos os sistemas operacionais atuais de computadores modernos dominam TCP e usá-lo para troca de dados com outros computadores. O protocolo é um protocolo de transporte confiável, orientado para conexão, com comutação de pacotes em redes de computadores.
Ao contrário do UDP sem conexão (User Datagram Protocol), TCP estabelece uma conexão entre dois pontos finais de uma conexão de rede (sockets). Os dados podem ser transmitidos em ambas as direções nesta conexão. Na maioria dos casos, o TCP depende do IP (Protocolo de Internet), e é por isso que frequentemente (e muitas vezes não muito corretamente) falamos sobre o "protocolo TCP / IP". Nas pilhas de protocolo, como o modelo OSI , TCP e IP não estão na mesma camada. O TCP é uma implementação da camada de transporte.
Devido aos seus muitos recursos agradáveis (a perda de dados é detectada e corrigida automaticamente, a transferência de dados é possível em ambos os sentidos, o congestionamento da rede é evitado, etc.), o TCP é um protocolo amplamente utilizado para a transmissão de dados. Por exemplo, o TCP é usado como o meio de transporte quase exclusivo para a www, e-mail e muitos outros serviços de rede populares.
Funcionamento Geral
Em princípio, o TCP é uma conexão full -to-end full duplex que permite a transmissão de informações em ambas as direções, análogo a uma chamada telefônica. Essa conexão também pode ser considerada como dois links half-duplex , onde informações podem fluir em ambas as direções (mas não simultaneamente). Os dados na direção oposta podem conter informações de controle adicionais. A administração desta conexão, bem como a transferência de dados, são assumidas pelo software TCP.
Cada conexão TCP é identificada de maneira exclusiva por dois pontos finais. Um ponto final representa um par ordenado consistindo de endereço IP e porta. Esse par forma uma interface de software bidirecional e também é referido como um socket . Assim, uma conexão TCP é identificada por quatro valores (um quadruplo):
(Máquina local, porta x, máquina remota, porta y)
Tudo depende de todo o quádruplo. Por exemplo, dois processos diferentes no mesmo computador podem usar a mesma porta local e até mesmo se comunicar com o mesmo computador no lado oposto, desde que os processos envolvidos usem portas diferentes do outro lado. Nesse caso, seriam dois compostos diferentes cujos quadros diferem-se em apenas um dos quatro valores: a porta do lado oposto.
Conexão 1: (computador local, porta x, computador remoto, porta y) Conexão 2: (computador local, porta x, computador remoto, porta z)
Por exemplo, um processo de servidor cria um socket (socket, bind) na porta 80, o marca para conexões de entrada e solicita ao sistema operacional que "aceita" a próxima conexão pendente. Esse pedido primeiro bloqueia o processo do servidor porque ainda não existe conexão. Então, quando o primeiro pedido de conexão por um cliente chega, ele é aceito pelo sistema operacional para que a conexão seja feita. De agora em diante, essa conexão é identificada pelo quadro descrito acima.
Finalmente, o processo do servidor é despertado e forneceu um identificador para essa conexão. Normalmente, o processo do servidor inicia um processo filho ao qual delega o tratamento da conexão. Ele continua seu trabalho com outro pedido de "aceitação" para o sistema operacional. Isso permite que um servidor web aceite várias conexões de diferentes computadores. Nenhuma listagem na mesma porta não é possível. Geralmente, o programa do lado do cliente não determina a porta, mas permite que seja atribuído pelo sistema operacional.
As portas são números de 16 bits (números de porta) e variam de 0 a 65535. As portas de 0 a 1023 são reservadas e atribuídas pela IANA. Por exemplo, a porta 80 é reservada para o HTTP usado na www. Usar as portas predefinidas não é vinculativo. Por exemplo, cada administrador pode executar um servidor FTP (geralmente porta 21) em qualquer outra porta.
Instalação e encerramento de conexão
O receptor cria um cabeçalho e, em seguida, executa o mesmo cálculo sem configurar o campo checksum para zero. Isso deve resultar em FFFF (hexadecimal). Se este não for o caso, o segmento TCP é descartado sem uma mensagem. Como resultado, o temporizador RTT expira no remetente e o segmento TCP é enviado novamente.
O motivo desse procedimento complicado é que as partes da mudança de cabeçalho IP durante o roteamento na rede IP. O campo TTL é diminuído por um para cada salto de IP. Se o campo TTL fosse incluído no cálculo da soma de verificação, o IP destruiria a segurança do transporte através do TCP. Portanto, apenas parte do cabeçalho IP está incluída no cálculo da soma de verificação. A soma de verificação é suscetível a erros irreconhecíveis devido ao seu comprimento de apenas 16 bits e devido à simples regra de cálculo. Métodos melhores como o CRC-32 foram considerados muito caros no momento da definição.
Integridade e confiabilidade dos dados
Ao contrário do UDP sem conexão, o TCP implementa uma transmissão de dados confiável bidirecional, orientada a bytes, entre dois pontos finais. O protocolo subjacente (IP) é orientado por pacotes, pelo que os pacotes de dados podem ser perdidos, podem chegar na ordem inversa e até serem recebidos duas vezes. O TCP foi projetado para lidar com a insegurança das camadas subjacentes. Portanto, verifica a integridade dos dados por meio da soma de verificação no cabeçalho do pacote e garante a sequência por números de sequência. O transmissor repete o envio de pacotes se nenhuma confirmação chegar dentro de um determinado período de tempo (tempo limite). Os dados dos pacotes são incorporados em um buffer no receptor em um buffer na ordem correta, e os pacotes duplicados são descartados.
Claro, a transferência de dados pode ser perturbada, atrasada ou interrompida a qualquer momento após o "estabelecimento de uma conexão". O sistema de transmissão é executado em um tempo limite. A "configuração de conexão" feita anteriormente não representa nenhuma garantia para uma transferência posterior, permanentemente segura.
Um servidor que oferece seu serviço cria um ponto final (socket) com o número da porta e seu endereço IP. Isso é referido como aberto passivo ou como uma lista.
Se um cliente quiser estabelecer uma conexão, ele gera seu próprio socket a partir do endereço do computador e seu próprio número de porta, ainda gratuito. Com a ajuda de uma porta conhecida e o endereço do servidor pode então ser estabelecida uma conexão. Uma conexão TCP é identificada de maneira exclusiva pelos seguintes 4 valores:
- Endereço IP de origem.
- Porta de origem.
- Endereço IP de destino.
- Porta de destino.
Durante a fase de transferência de dados (ativo aberto), as funções de cliente e servidor (do ponto de vista TCP) são completamente simétricas. Em particular, cada um dos dois computadores envolvidos pode iniciar uma desconexão.
Estabelecimento de conexão
O cliente que deseja estabelecer uma conexão envia ao servidor um pacote SYN com um número de sequência x. Os números de sequência são importantes para garantir a transmissão completa na ordem correta e sem duplicatas. Este é um pacote cujo bit SYN está configurado no cabeçalho do pacote. O número de sequência de início é qualquer número cuja geração depende da respectiva implementação de TCP. No entanto, deve ser o mais aleatório possível para evitar riscos de segurança.
O servidor recebe o pacote. Quando a porta está fechada, ela responde com um TCP RST para indicar que nenhuma conexão pode ser estabelecida. Se a porta estiver aberta, reconhece o recebimento do primeiro pacote SYN e aprova a conexão enviando um pacote SYN / ACK (confirmação ACK). O sinalizador ACK definido no cabeçalho TCP identifica esses pacotes, que contêm o número de sequência x + 1 do pacote SYN no cabeçalho. Além disso, ele envia em troca seu número de sequência de início y, que também é arbitrário e independente do número de sequência inicial do cliente.
O cliente finalmente reconhece o recebimento do pacote SYN / ACK enviando seu próprio pacote ACK com o número de sequência x + 1 . Este processo também é conhecido como "Reconhecimento de Avanço". Por razões de segurança, o cliente retorna o valor y + 1 (o número de sequência do servidor + 1) no segmento ACK. A conexão é estabelecida com ele. O exemplo a seguir abstrai o processo:
|
primeiro |
SYN-ENVIADO |
→ |
<SEQ = 100> <CTL = SYN> |
→ |
SYN-RECEBIDO |
|
segundo |
SYN / ACK recebido |
← |
<SEQ = 300> <ACK = 101> <CTL = SYN, ACK> |
← |
SYN / ACK-SENT |
|
terceiro |
ACK-SENT |
→ |
<SEQ = 101> <ACK = 301> <CTL = ACK> |
→ |
ESTABELECIDO |
Uma vez estabelecido, a conexão para ambos os parceiros de comunicação é igual, você não pode olhar para uma conexão existente no nível TCP, quem é o servidor e quem é o cliente. Portanto, uma distinção entre esses dois papéis na consideração posterior não é mais relevante.
Desconexão
A desconexão regulada é semelhante. Em vez do bit SYN, o bit FIN é usado, o que indica que não mais dados virão do transmissor. O recebimento do pacote é novamente confirmado pela ACK. O destinatário do pacote FIN finalmente envia um pacote FIN, que também é confirmado para ele.
Além disso, é possível um procedimento abreviado, em que FIN e ACK são alojados na mesma embalagem que na configuração da conexão. A duração máxima do segmento (MSL) é a quantidade máxima de tempo que um segmento pode gastar na rede antes de ser descartado. Depois que o último ACK é enviado, o cliente entra em um estado de espera de dois estados, onde todos os segmentos atrasados são descartados. Isso garante que nenhum segmento tardio seja mal interpretado como parte de uma nova conexão. Além disso, é assegurada uma terminação de conexão correta. Se ACK y + 1 for perdido, o temporizador expira no servidor e o segmento LAST_ACK é retransmitido.
Three-way handshake
Ao estabelecer uma conexão e ao desconectá-la, as respostas ao primeiro pacote SYN ou FIN normalmente são combinadas em um único pacote (SYN / ACK ou FIN / ACK) - em teoria, o envio de dois pacotes separados também seria concebível. Uma vez que neste caso, apenas três pacotes devem ser enviados, fala-se frequentemente do chamado three-way handshake (handshake de três vias). No entanto, resumir o pacote FIN e o pacote ACK é problemático porque enviar um pacote FIN tem o significado de "não haverá mais dados". No entanto, o remetente do pacote FIN pode continuar a receber dados; Isso é chamado de conexão meio fechada (a direção de recebimento ainda está aberta enquanto a direção de transmissão foi fechada). Por exemplo, é concebível enviar o início de uma solicitação HTTP diretamente no pacote SYN, para inserir dados adicionais assim que a conexão foi estabelecida e para fechar a direção da transmissão da conexão no último pacote de solicitação HTTP por meio de FIN. Na prática, no entanto, esse método não é usado. Se o navegador fechar imediatamente a conexão dessa maneira, o servidor também pode fechar a conexão em vez de responder completamente à solicitação.
Estrutura geral do cabeçalho TCP
O segmento TCP sempre consiste em duas partes, o cabeçalho e a carga útil. A carga útil contém os dados a serem transferidos, que por sua vez podem corresponder às informações do protocolo da camada da aplicação, como HTTP ou FTP. O cabeçalho contém dados necessários para a comunicação, bem como a informação descritiva do formato do arquivo. Uma vez que o campo de opções geralmente não é usado, um cabeçalho típico tem um tamanho de 20 bytes. Os valores são dados na ordem dos bytes big-endian.
Controle de sobrecarga / controle de congestionamento (controle de congestionamento)
Na Internet, onde muitas redes com diferentes propriedades estão conectadas, a perda de dados de pacotes individuais é bastante normal. Se uma conexão estiver fortemente carregada, mais e mais pacotes são descartados, o que deve ser repetido de acordo. A repetição, por sua vez, aumenta o peso, sem medidas adequadas, haverá engarrafamento.
A taxa de perda é constantemente monitorada por uma rede IP. Dependendo da taxa de perda, a taxa de transmissão é influenciada por algoritmos adequados: Normalmente, uma conexão TCP / IP é iniciada lentamente (início lento) e a taxa de transmissão é aumentada passo a passo até a perda de dados ocorrer. Uma perda de dados reduz a taxa de transmissão, sem perda é aumentada novamente. Em geral, a taxa de dados está se aproximando do máximo disponível disponível por enquanto e permanece aproximadamente lá. Uma sobrecarga é evitada.
Referências
https://pdfs.semanticscholar.org/9206/4a40da71f5f78b0a33d7ee2e546908ff4909.pdf
http://br.ccm.net/contents/284-o-protocolo-tcp
https://www.tecmundo.com.br/o-que-e/780-o-que-e-tcp-ip-.htm
https://www.tecmundo.com.br/internet/57947-internet-diferenca-entre-protocolos-udp-tcp.htm
http://www.clubedohardware.com.br/artigos/redes/como-o-protocolo-tcp-ip-funciona-parte-1-r34823/
http://www.teleco.com.br/tutoriais/tutorialip/pagina_5.asp
https://www.citisystems.com.br/protocolo-tcp-ip/