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 solo 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 más comúnmente en el contexto del conjunto de protocolos de Internet y, por lo tanto, a menudo también se lo denomina 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 del software de comunicación entre procesos (IPC) interna del nodo , 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 conocido como descriptor de socket . En sistemas operativos tipo Unix , este descriptor es un tipo de descriptor de archivo . El proceso de aplicación lo almacena para su uso 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 está vinculado 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 servicios 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 con el Protocolo de Internet (IP). Por eso a menudo también se le llama enchufe 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 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 , generalmente proporcionada por el sistema operativo (en lugar de una biblioteca separada, 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 del 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 redes . 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 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 manera muy 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 se puede usar para recibir datos enviados a esa dirección. Según esta dirección, los sockets de Internet entregan los paquetes de datos entrantes al proceso de aplicación correspondiente .
Socket a menudo se refiere específicamente a un socket de Internet o un socket TCP. Una toma de internet se caracteriza mínimamente por lo siguiente:
Las distinciones entre un socket (representación interna), un descriptor de socket (identificador abstracto) y una 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 socket difieren entre los autores. En la Solicitud de comentarios del IETF , Estándares de Internet , 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] en relación con la red ARPA en 1971, "el socket se especifica como un número de 32 bits con sockets pares que identifican los sockets receptores y sockets impares que identifican los sockets emisores". Hoy en día, sin embargo, las comunicaciones por socket son bidireccionales.
Dentro del sistema operativo y la aplicación que creó un socket, se hace referencia a un socket 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 "¡Hola, mundo!" vía TCP al puerto 80 del host con dirección 203.0.113.0. Ilustra la creación de un socket (getSocket), conectándolo al host remoto, enviando la cadena y finalmente cerrando el socket:
Socket misocket = getSocket(tipo = "TCP")conectar(mysocket, dirección = "203.0.113.0", puerto = "80")enviar(mysocket, "¡Hola mundo!")cerrar (misocket)
Están disponibles varios tipos de toma de Internet:
Otros tipos de sockets se implementan sobre otros protocolos de transporte, como Systems Network Architecture [10] y sockets de dominio Unix para la comunicación interna entre procesos.
Los procesos informáticos que proporcionan servicios de aplicaciones se denominan servidores y crean sockets al inicio que se encuentran en estado de escucha . Estos sockets están esperando iniciativas de los programas clientes .
Un servidor TCP puede servir a varios clientes simultáneamente creando un socket dedicado único para cada conexión de cliente en un nuevo proceso hijo o subproceso de procesamiento para cada cliente. Estos están en el estado establecido cuando se establece una conexión virtual o circuito virtual (VC) de socket a socket , también conocido 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 servidor-hijo, sirviendo 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, porque 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 forma 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 red.
Los sockets locales y remotos que se comunican se denominan pares de sockets . Cada par de sockets se describe mediante una tupla única de 4 que consta de direcciones IP de origen y destino y números de puerto, es decir, direcciones de socket locales y remotas. [11] [12] Como se analizó anteriormente, en el caso de TCP, un par de sockets está asociado en cada extremo de la conexión con una única tupla de 4.
El término socket data de la publicación del RFC 147 en 1971, cuando se utilizaba en ARPANET. La mayoría de las implementaciones modernas de sockets se basan en 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 API. Sin embargo, sólo en 1989 la 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 .
Cª. 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 la Versión 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 capa de sesión del modelo OSI . Los equipos de red, como los enrutadores , que operan en la capa de Internet , y los conmutadores , que operan en la capa de enlace , no requieren implementaciones de la capa de transporte. Sin embargo, los firewalls de red con estado , los traductores de direcciones de red y los servidores proxy realizan un seguimiento de los pares de sockets activos. En conmutadores multicapa y soporte de calidad de servicio (QoS) en 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).