Los sockets Unix son una forma de comunicación entre dos procesos que aparece como un archivo en el disco. Este archivo puede ser utilizado por otros programas para determinar conexiones muy rápidas entre dos o más procesos sin ninguna sobrecarga de red.
¿Qué son los enchufes?
Los sockets son una conexión directa entre dos procesos. Imagínese si quisiera llamar a su amigo en el futuro; podría hacer una llamada, hacer que se enrute a través de su compañía telefónica y regresar a su casa, o podría tender un cable de forma directa a su casa y quitar al intermediario. Esto último es por lo visto impráctico en la vida real, pero en el mundo de Unix es muy común determinar estas conexiones directas entre programas.
El nombre correcto para los sockets Unix es Sockets de dominio Unix, debido a que todos residen dentro de una computadora. En cierto sentido, los sockets son una red que está totalmente contenida dentro del kernel; en lugar de usar interfaces de red para enviar datos, esos mismos datos se pueden enviar de forma directa entre programas.
Pese a crear archivos en el disco, los sockets Unix en realidad no escriben los datos que envían al disco, puesto que eso sería demasiado lento. En cambio, todos los datos se retienen en la memoria del kernel; el único punto del archivo de socket es mantener una referencia al socket y darle permisos del sistema de archivos para controlar el acceso. A modo de ejemplo, el socket de MySQL suele estar en:
/var/lib/mysql/mysql.sock
Este archivo no contiene nada y no debe modificarlo de forma directa, excepto los permisos cuando corresponda. Es solo un nombre.
¿Cómo funcionan los enchufes?
Los sockets simplemente proporcionan el hardware real para mover datos. Los sockets basados en TCP se denominan sockets de flujo, donde todos los datos llegarán en orden. Los sockets basados en UDP son sockets de datagramas, donde el pedido (o inclusive la entrega) no está garantizado. Además hay sockets sin formato, que no disponen ninguna restricción, y se usan para poner en práctica diferentes protocolos y utilidades que necesitan inspeccionar el tráfico de red de bajo nivel, como Wireshark.
Los sockets de forma general aún usan TCP o UDP, puesto que no son nada especial más que una tubería elegante dentro del kernel. TCP y UDP son protocolos de transporte que definen cómo se trasladan los datos de un lugar a otro, pero en realidad no les importa qué datos son. TCP y UDP proporcionan la plataforma para la mayoría de los otros protocolos como FTP, SMTP y RDP, que operan a niveles más altos.
Es factible que una aplicación utilice una implementación de TCP ligeramente distinto; tomas de corriente usan el SOCK_STREAM
protocolo, que es lo que TCP además utiliza para el transporte casi todo el tiempo, y aún cuando son simplemente intercambiables, técnicamente son ligeramente diferentes. Aún cuando esto es algo de bajo nivel y en realidad no se trata de algo de lo que deba preocuparse, solo sepa que la mayoría el tráfico enviado a través de sockets de dominio UNIX está basado en TCP o UDP, o al menos bastante semejante, y el TCP enviado a través de sockets de dominio UNIX es más rápido que TCP a través de interfaces de red como puertos.
Uso del zócalo en la práctica
Los sockets Unix se usan de forma general como una alternativa a las conexiones TCP sustentadas en red cuando los procesos se ejecutan en la misma máquina. Por lo general, los datos se siguen enviando a través de los mismos protocolos; simplemente permanece dentro de la misma máquina y sabe que se está ejecutando en el mismo dominio (de ahí el nombre sockets de dominio UNIX), por lo que nunca tiene que molestar a una interfaz de red de bucle invertido para conectarse a sí mismo.
El mayor ejemplo de esto es Redis, un almacén de valores clave extremadamente rápido que opera totalmente dentro de la memoria. Redis se utiliza muchas veces en el mismo servidor que accede a él, por lo que regularmente podrá utilizar sockets. A niveles tan bajos y con lo rápido que es Redis, los sockets proporcionan un Aumento del rendimiento del 25% en algunos benchmarks sintéticos.
Si se está conectando a una base de datos MySQL, además puede utilizar un socket. Regularmente te conectarías a host:port
desde un sistema remoto, pero si se está conectando a una base de datos en el mismo servidor (a modo de ejemplo, una API REST que accede a una base de datos), puede utilizar sockets para acelerar. Esto no afectará al uso normal, pero es muy notable cuando está bajo carga, más del 20% en 24 núcleos de gama alta con 128 usuarios simultáneos y un millón de consultas por segundo. Si verá o no un beneficio de los sockets es una historia distinto, pero en ese punto probablemente querrá buscar en la replicación y el equilibrio de carga de todos modos.
Si desea trabajar con sockets manualmente, puede usar el socat
utilidad para exponerlos a través de puertos de red:
socat TCP-LISTEN:12345 UNIX-CONNECT:/var/lib/socket.sock
Técnicamente, esto anula el propósito de los sockets de dominio Unix, pero se puede utilizar para depurar en la capa de transporte.