Cursos

[Noticias][grids]

O que são soquetes Unix e como eles funcionam?

 

Sockets Unix são uma forma de comunicação entre dois processos que aparecem como um arquivo no disco. Este arquivo pode ser usado por outros programas para estabelecer conexões muito rápidas entre dois ou mais processos sem qualquer sobrecarga de rede.

O que são soquetes?

Sockets são uma conexão direta entre dois processos. Imagine se você quisesse ligar para seu amigo mais adiante; você pode fazer uma chamada e encaminhá-la para a companhia telefônica e de volta para a casa deles, ou você pode ligar diretamente para a casa deles e cortar o intermediário. O último é obviamente impraticável na vida real, mas no mundo do Unix é muito comum estabelecer essas conexões diretas entre programas.

O nome apropriado para sockets Unix é Unix Domain Sockets, porque todos eles residem em um computador. De certa forma, os soquetes são uma rede inteiramente contida no kernel; em vez de usar interfaces de rede para enviar dados, esses mesmos dados podem ser enviados diretamente entre programas.

Apesar de criar arquivos no disco, os soquetes Unix não gravam realmente os dados que enviam para o disco, pois isso seria muito lento. Em vez disso, todos os dados são retidos na memória do kernel; o único ponto do arquivo de soquete é manter uma referência ao soquete e dar a ele permissões de sistema de arquivos para controlar o acesso. Por exemplo, o soquete do MySQL está geralmente em:

 /var/lib/mysql/mysql. sock 

Este arquivo não contém nada e você não deve modificá-lo diretamente, exceto para as permissões, quando aplicável. É apenas um nome.

Como funcionam os soquetes?

Os soquetes simplesmente fornecem o hardware real para mover os dados. Os soquetes baseados em TCP são chamados de soquetes de fluxo, onde todos os dados chegarão em ordem. Os sockets baseados em UDP são sockets de datagrama, onde a encomenda (ou mesmo a entrega) não é garantida. Existem também sockets raw, que não têm nenhuma restrição e são usados ​​para implementar diferentes protocolos e utilitários que precisam inspecionar o tráfego de rede de baixo nível, como o Wireshark.

Publicidade

Sockets geralmente ainda usam TCP ou UDP, já que eles não são nada de especial além de um canal sofisticado dentro do kernel. TCP e UDP são protocolos de transporte que definem como os dados vão de um lugar para outro, mas não se importam realmente com o que os dados são. TCP e UDP fornecem a plataforma para a maioria dos outros protocolos, como FTP, SMTP e RDP, que operam em níveis mais altos.

É possível que um aplicativo use uma implementação ligeiramente diferente do TCP; stream sockets usam o protocolo SOCK_STREAM, que é o que TCP também usa para transporte quase todo o tempo, e embora sejam basicamente intercambiáveis, eles são tecnicamente um pouco diferentes. Embora isso seja algo de baixo nível e não seja realmente algo com que você terá que se preocupar, saiba apenas que a maior parte do tráfego enviado através de soquetes de domínio UNIX é baseado em TCP ou UDP, ou pelo menos bastante semelhante a ele , e o TCP enviado por soquetes de domínio UNIX é mais rápido do que o TCP por interfaces de rede, como portas.

Uso de soquete na prática

Soquetes Unix são geralmente usados ​​como uma alternativa para conexões TCP baseadas em rede quando os processos estão rodando na mesma máquina. Os dados geralmente ainda são enviados pelos mesmos protocolos; ele apenas permanece na mesma máquina e sabe que está sendo executado no mesmo domínio (daí o nome soquetes de domínio UNIX), então nunca precisa incomodar uma interface de rede de loopback para se conectar a si mesmo.

O maior exemplo disso é o Redis, um armazenamento de valores-chave extremamente rápido que opera inteiramente na memória. O Redis é freqüentemente usado no mesmo servidor que o está acessando, portanto, você normalmente poderá usar sockets. Em níveis tão baixos e com a velocidade do Redis, os soquetes fornecem um aumento de desempenho de 25% em alguns benchmarks sintéticos.

Se você estiver se conectando a um banco de dados MySQL, também pode usar um soquete. Normalmente, você se conectaria a host: port de um sistema remoto, mas se estiver se conectando a um banco de dados no mesmo servidor (por exemplo, uma API REST acessando um banco de dados), você pode usar soquetes para um aumento de velocidade . Isso não afetará o uso normal, mas é muito perceptível quando sob carga, mais de 20% em um núcleo 24 de ponta com 128 usuários simultâneos e um milhão de consultas por segundo. Se você verá ou não um benefício com os soquetes é uma história diferente, mas nesse ponto você provavelmente desejará analisar a replicação e o balanceamento de carga de qualquer maneira.

Publicidade

Se você deseja trabalhar com soquetes manualmente, pode usar o utilitário socat para expô-los nas portas de rede:

 socat TCP-LISTEN: 12345 UNIX-CONNECT: /var/lib/socket. sock 

Isso invalida tecnicamente o propósito dos soquetes de domínio Unix, mas pode ser usado para depuração na camada de transporte.