Enlace de direcciones a sockets

El enlace de direcciones a sockets en el dominio de Internet requiere una serie de consideraciones. Los números de puerto se asignan fuera de espacios separados, uno para cada sistema y otro para cada dominio de ese sistema.

Nota: Puesto que la asociación se crea en dos pasos, el requisito de exclusividad de asociación indicado anteriormente podría violarse a menos que se tenga cuidado. Además, los programas de usuario no siempre conocen los valores adecuados para utilizar para la dirección local y el puerto local porque un host puede residir en varias redes, y el conjunto de números de puerto asignados no es directamente accesible para un usuario.

El direccionamiento de comodín se proporciona para ayudar al enlace de direcciones locales en el dominio de Internet. Cuando se especifica una dirección como INADDR_ANY (una constante definida en el archivo netinet/in.h ), el sistema interpreta la dirección como cualquier dirección válida.

Los sockets con direcciones locales comodín pueden recibir mensajes dirigidos al número de puerto especificado y enviados a cualquiera de las posibles direcciones asignadas a un host. Si un proceso de servidor desea conectar sólo los hosts de una red determinada, enlazará la dirección de los hosts de la red adecuada.

Un puerto local se puede especificar o dejar sin especificar (indicado por 0), en cuyo caso el sistema selecciona un número de puerto adecuado para él.

La restricción de asignación de puertos se ha realizado para permitir que los procesos que se ejecutan en un entorno seguro realicen la autenticación basándose en la dirección de origen y el número de puerto. Por ejemplo, el mandato rlogin (1) permite a los usuarios iniciar sesión en una red sin que se les solicite una contraseña, si se cumplen dos condiciones:
  • El nombre del sistema desde el que el usuario está iniciando sesión se encuentra en el archivo /etc/hosts.equiv del sistema en el que el usuario está intentando iniciar sesión (o el nombre del sistema y el nombre de usuario se encuentran en el archivo .rhosts del usuario en el directorio de inicio del usuario).
  • El proceso de inicio de sesión del usuario proviene de un puerto privilegiado en la máquina desde la que el usuario está iniciando sesión.

El número de puerto y la dirección de red de la máquina desde la que el usuario está iniciando sesión se pueden determinar mediante el resultado del parámetro De de la subrutina accept o mediante la subrutina getpeername .

En determinados casos, el algoritmo utilizado por el sistema al seleccionar números de puerto no es adecuado para un programa de aplicación. Esto se debe a que las asociaciones se crean en un proceso de dos pasos. Por ejemplo, FTP (Internet File Transfer Protocol) especifica que las conexiones de datos deben originarse siempre desde el mismo puerto local. Sin embargo, las asociaciones duplicadas se evitan conectándose a distintos puertos foráneos. En esta situación, el sistema no permite enlazar la misma dirección local y número de puerto a un socket si todavía existe un socket de conexión de datos anterior. Para alterar temporalmente el algoritmo de selección de puerto predeterminado, se debe realizar una subrutina setsockopt antes de enlazar la dirección.

La subrutina socket crea un socket sin ninguna asociación con direcciones locales o de destino. Para los protocolos de Internet, esto significa que no se ha asignado ningún número de puerto de protocolo local. En muchos casos, los programas de aplicación no se preocupan por la dirección local que utilizan y están dispuestos a permitir que el software de protocolo elija uno para ellos. Sin embargo, los procesos de servidor que operan en un puerto conocido públicamente deben poder especificar dicho puerto en el sistema. Una vez que se ha creado un socket, un servidor utiliza la subrutina bind para establecer una dirección local para el mismo.

No todos los enlaces posibles son válidos. Por ejemplo, el llamante puede solicitar un puerto de protocolo local que ya esté en uso por otro programa, o puede solicitar una dirección de Internet local no válida. En tales casos, la subrutina bind no es satisfactoria y devuelve un mensaje de error.