O que são e como funcionam os Sockets
Aprenda como os sockets funcionam em baixo nível e como ele é fundamental para os sistemas distribuídos
Formalmente falando os sockets foram a forma de permitir que dois processos se comuniquem (Inter-process communication). Esses processos podem ou não estar na mesma máquina. Nesse artigo iremos entender como os sockets são implementados dentro do ambiente Unix, como linguagens e aplicações fazem uso dele.
Diversas aplicações que utilizamos no dia-a-dia fazem uso de sockets pra se comunicar. Nosso navegador web utiliza sockets pra requisitar páginas. Quando um sistema se integra com um banco de dados ele abre um socket. Quando fazemos um ssh em um servidor estamos abrindo e utilizando um socket.
Pra entender melhor o funcionamento dos sockets vamos começar voltando na estrutura onde ele se encaixa enquanto API. O modelo OSI especifica um padrão de redes para criação de protocolos. Esse modelo divide uma pilha de redes em 7 camadas, cada uma com suas responsabilidades.
A Internet utiliza como base para todas as suas comunicações a pilha TCP/IP que possui apenas 4 camadas. Baseado no modelo OSI, o TCP/IP é, atualmente, o padrão de comunicação em redes. A imagem abaixo apresenta uma comparação do modelo OSI com suas 7 camadas em relação as respectivas 4 camadas do modelo TCP/IP:
Considerando a Internet e o TCP/IP, os sockets estão entre a camada de transporte e a de aplicações. Estando nesse ponto de intercessão, eles conseguem fazer uma interface entre a aplicação e rede de maneira bem transparente. Assim, aplicações são implementadas através de uma comunicação lógica. Lógica no sentido de que para esses programas, eles estão se comunicando diretamente um com o outro, mas na prática, eles estão passando pela rede para trocar mensagens.
Até agora vimos que os sockets foram criados na forma de uma API que possibilita aplicações/processos se comunicarem. Quais são essas interfaces que permitem essas comunicações? Abaixo listamos alguns das principais funções utilizadas ao criar um programa utilizando sockets.
/**
* Principais funções para escrever programas com sockets
*/
getaddrinfo() // Traduz nomes para endereços sockets
socket() // Cria um socket e retorna o descritor de arquivo
bind() // Associa o socket a um endereço socket e uma porta
connect() // Tenta estabelecer uma conexão com um socket
listen() // Coloca o socket para aguardar conexões
accept() // Aceita uma nova conexão e cria um socket
send() // caso conectado, transmite mensagens ao socket
recv() // recebe as mensagens através do socket
close() // desaloca o descritor de arquivo
shutdown() // desabilita a comunicação do socket
Quando se programa utilizando sockets, uma arquitetura muito comum para esses programas, é utilizar o Cliente / Servidor (client/server). Para essa arquitetura temos que implementar um programa cliente e um programa servidor. Ambos fazem uso da mesma API de sockets.
Usando as mesmas funções vistas acima, um cliente e um servidor trocam mensagens através de seus sockets para tomar decisões de aplicação. Um exemplo do fluxo de trabalho (workflow) utilizando sockets seria:
Cliente
Servidor
Tipos de sockets
Os sockets do tipo TCP são orientados a conexão e tem um canal exclusivo de comunicação entre cliente e servidor. Eles garantem a ordem dos pacotes, são considerados confiáveis e sem perda. No entanto, quando se trata de se recuperar de falhas e perda de pacotes ele é mais burocrático e lento.
Já os sockets do tipo UDP desconsidera ordem de pacotes, recuperação de falhas e garantia de ordem. No entanto, por ser extremamente menos burocrático e simples, ele é mais rápido que o TCP para alguns tipos de aplicações.