Un socket de red es una estructura de software dentro de un nodo de red de una red informática que sirve como punto final para enviar y recibir datos a través de la red. La estructura y las propiedades de un socket están definidas por una interfaz de programación de aplicaciones (API) para la arquitectura de red. Los sockets se crean únicamente durante la vida útil de un proceso de una aplicación que se ejecuta en el nodo.
Debido a la estandarización de los protocolos TCP/IP en el desarrollo de Internet , el término socket de red se utiliza con mayor frecuencia en el contexto del conjunto de protocolos de Internet y, por lo tanto, también se lo suele denominar socket de Internet . En este contexto, un socket se identifica externamente ante otros hosts por su dirección de socket , que es la tríada de protocolo de transporte , dirección IP y número de puerto .
El término socket también se utiliza para el punto final de software de la comunicación entre procesos internos del nodo (IPC), que a menudo utiliza la misma API que un socket de red.
El uso del término socket en software es análogo a la función de un conector eléctrico hembra , un dispositivo en hardware para la comunicación entre nodos interconectados con un cable eléctrico . De manera similar, el término puerto se utiliza para puntos finales físicos externos en un nodo o dispositivo.
La interfaz de programación de aplicaciones (API) para la pila de protocolos de red crea un identificador para cada socket creado por una aplicación, comúnmente denominado descriptor de socket . En los sistemas operativos tipo Unix , este descriptor es un tipo de descriptor de archivo . El proceso de aplicación lo almacena para usarlo con cada operación de lectura y escritura en el canal de comunicación.
En el momento de la creación con la API, un socket de red se vincula a la combinación de un tipo de protocolo de red que se utilizará para las transmisiones, una dirección de red del host y un número de puerto . Los puertos son recursos numerados que representan otro tipo de estructura de software del nodo. Se utilizan como tipos de servicio y, una vez creados por un proceso, sirven como un componente de ubicación direccionable externamente (desde la red), de modo que otros hosts puedan establecer conexiones.
Los sockets de red pueden estar dedicados a conexiones persistentes para la comunicación entre dos nodos, o pueden participar en comunicaciones sin conexión y de multidifusión .
En la práctica, debido a la proliferación de los protocolos TCP/IP que se utilizan en Internet, el término socket de red suele referirse al uso del protocolo de Internet (IP). Por ello, también se suele denominar socket de Internet .
Una aplicación puede comunicarse con un proceso remoto intercambiando datos con TCP/IP conociendo la combinación de tipo de protocolo, dirección IP y número de puerto. Esta combinación se conoce a menudo como dirección de socket . Es el identificador de acceso de cara a la red al socket de red. El proceso remoto establece un socket de red en su propia instancia de la pila de protocolos y utiliza la API de red para conectarse a la aplicación, presentando su propia dirección de socket para que la utilice la aplicación.
Una pila de protocolos , que normalmente la proporciona el sistema operativo (en lugar de una biblioteca independiente, por ejemplo), es un conjunto de servicios que permite que los procesos se comuniquen a través de una red utilizando los protocolos que implementa la pila. El sistema operativo reenvía la carga útil de los paquetes IP entrantes a la aplicación correspondiente extrayendo la información de la dirección del socket de los encabezados de protocolo de transporte e IP y eliminando los encabezados de los datos de la aplicación.
La interfaz de programación de aplicaciones (API) que utilizan los programas para comunicarse con la pila de protocolos, mediante sockets de red, se denomina API de socket . El desarrollo de programas de aplicación que utilizan esta API se denomina programación de sockets o programación de red . Las API de sockets de Internet suelen basarse en el estándar de sockets de Berkeley . En el estándar de sockets de Berkeley, los sockets son una forma de descriptor de archivos , debido a la filosofía de Unix de que "todo es un archivo", y las analogías entre sockets y archivos. Ambos tienen funciones para leer, escribir, abrir y cerrar. En la práctica, las diferencias tensan la analogía y se utilizan diferentes interfaces (envío y recepción) en un socket. En la comunicación entre procesos , cada extremo generalmente tiene su propio socket.
En los protocolos estándar de Internet TCP y UDP, una dirección de socket es la combinación de una dirección IP y un número de puerto , de forma similar a como un extremo de una conexión telefónica es la combinación de un número de teléfono y una extensión particular . Los sockets no necesitan tener una dirección de origen, por ejemplo, solo para enviar datos, pero si un programa vincula un socket a una dirección de origen, el socket puede usarse para recibir datos enviados a esa dirección. En función de esta dirección, los sockets de Internet entregan los paquetes de datos entrantes al proceso de aplicación apropiado .
El término socket suele hacer referencia específicamente a un socket de Internet o a un socket TCP. Un socket de Internet se caracteriza mínimamente por lo siguiente:
Las distinciones entre un socket (representación interna), descriptor de socket (identificador abstracto) y dirección de socket (dirección pública) son sutiles y no siempre se distinguen en el uso cotidiano. Además, las definiciones específicas de un socket difieren entre autores. En IETF Request for Comments , Internet Standards , en muchos libros de texto, así como en este artículo, el término socket se refiere a una entidad que se identifica de forma única por el número de socket. En otros libros de texto, [1] el término socket se refiere a una dirección de socket local, es decir, una "combinación de una dirección IP y un número de puerto". En la definición original de socket dada en RFC 147, [2] tal como estaba relacionada con la red ARPA en 1971, "el socket se especifica como un número de 32 bits con sockets pares que identifican sockets receptores y sockets impares que identifican sockets emisores". Hoy, sin embargo, las comunicaciones por socket son bidireccionales.
Dentro del sistema operativo y la aplicación que creó un socket, a un socket se le hace referencia mediante un valor entero único llamado descriptor de socket .
En sistemas operativos tipo Unix y Microsoft Windows , las herramientas de línea de comandos netstat o ss [3] se utilizan para enumerar los sockets establecidos y la información relacionada.
Este ejemplo, modelado según la interfaz de socket de Berkeley, envía la cadena "Hello, world!" a través de TCP al puerto 80 del host con dirección 203.0.113.0. Ilustra la creación de un socket (getSocket), su conexión al host remoto, el envío de la cadena y, finalmente, el cierre del socket:
Zócalo mysocket = getSocket(tipo = "TCP")conectar(mysocket, dirección = "203.0.113.0", puerto = "80")send(mysocket, "¡Hola, mundo!")cerrar(mysocket)
Existen varios tipos de tomas de Internet disponibles:
Otros tipos de sockets se implementan sobre otros protocolos de transporte, como la Arquitectura de Red de Sistemas [10] y los sockets de dominio Unix para la comunicación interna entre procesos.
Los procesos informáticos que proporcionan servicios de aplicación se denominan servidores y crean sockets al iniciarse que están en estado de escucha . Estos sockets esperan iniciativas de los programas cliente .
Un servidor TCP puede atender a varios clientes simultáneamente creando un socket exclusivo y dedicado para cada conexión de cliente en un nuevo proceso secundario o subproceso de procesamiento para cada cliente. Estos se encuentran en estado establecido cuando se establece una conexión virtual de socket a socket o circuito virtual (VC), también conocida como sesión TCP , con el socket remoto, lo que proporciona un flujo de bytes dúplex .
Un servidor puede crear varios sockets TCP establecidos simultáneamente con el mismo número de puerto local y dirección IP local, cada uno asignado a su propio proceso secundario del servidor, que atiende a su propio proceso cliente. El sistema operativo los trata como sockets diferentes, ya que la dirección del socket remoto (la dirección IP del cliente o el número de puerto) es diferente; es decir, ya que tienen diferentes tuplas de pares de sockets.
Los sockets UDP no tienen un estado establecido , porque el protocolo no tiene conexión . Un proceso de servidor UDP maneja los datagramas entrantes de todos los clientes remotos de manera secuencial a través del mismo socket. Los sockets UDP no se identifican por la dirección remota, sino solo por la dirección local, aunque cada mensaje tiene una dirección remota asociada que se puede recuperar de cada datagrama con la interfaz de programación de aplicaciones (API) de redes.
Los sockets locales y remotos que se comunican se denominan pares de sockets . Cada par de sockets se describe mediante una tupla de 4 única que consta de direcciones IP de origen y destino y números de puerto, es decir, direcciones de socket locales y remotos. [11] [12] Como se mencionó anteriormente, en el caso TCP, un par de sockets está asociado en cada extremo de la conexión con una tupla de 4 única.
El término socket se remonta a la publicación de RFC 147 en 1971, cuando se utilizó en ARPANET. La mayoría de las implementaciones modernas de sockets se basan en los sockets de Berkeley (1983) y otras pilas como Winsock (1991). La API de sockets de Berkeley en Berkeley Software Distribution (BSD) se originó con el sistema operativo Unix 4.2BSD como una API. Sin embargo, recién en 1989, UC Berkeley pudo lanzar versiones de su sistema operativo y biblioteca de redes libres de las restricciones de licencia del Unix protegido por derechos de autor de AT&T .
En 1987, AT&T introdujo la interfaz de capa de transporte (TLI) basada en STREAMS en UNIX System V Release 3 (SVR3) [13] y continuó en Release 4 (SVR4) [14] .
Otras implementaciones tempranas fueron escritas para TOPS-20 , [15] MVS , [15] VM , [15] IBM-DOS (PCIP). [15] [16]
El socket es principalmente un concepto utilizado en la capa de transporte del conjunto de protocolos de Internet o la capa de sesión del modelo OSI . Los equipos de red como los enrutadores , que funcionan en la capa de Internet , y los conmutadores , que funcionan en la capa de enlace , no requieren implementaciones de la capa de transporte. Sin embargo, los cortafuegos de red con estado , los traductores de direcciones de red y los servidores proxy realizan un seguimiento de los pares de sockets activos. En los conmutadores multicapa y el soporte de calidad de servicio (QoS) en los enrutadores, los flujos de paquetes se pueden identificar extrayendo información sobre los pares de sockets.
Los sockets sin formato suelen estar disponibles en equipos de red y se utilizan para protocolos de enrutamiento como IGRP y OSPF , y para el Protocolo de mensajes de control de Internet (ICMP).