Puertos y Sockets

Puertos y Sockets

Puertos

Cada proceso que se comunica con otro proceso se identifica a sí mismo a la familia de protocolos TCP/IP por uno o más puertos. Un puerto es un número de 16 bits, usado por el protocolo host-a-host para identificar a qué protocolo de más alto nivel o programa de aplicación (proceso) debe entregar los mensajes de entrada.
Como algunos programas de más alto nivel son protocolos por sí mismos, estandarizados en la familia de protocolos TCP/IP, tales como telnet y ftp, usan el mismo número de puerto en todas las realizaciones de TCP/IP. Aquellos números de puerto "asignados" se denominan puertos bien-conocidos y las aplicaciones estándares servicios bien-conocidos.
Los puertos "bien-conocidos" los controla y asigna la Autoridad de Números Asignados de Internet (IANA) y en la mayoría de los sistemas sólo pueden usarlo los procesos del sistema o programas ejecutados con privilegios de usuario. Los puertos "bien-conocidos" asignados ocupan números de puerto en el rango de 0 a 1023. Los puertos con números dentro del rango 1024-65535 no los controla la IANA y la mayor parte de los sistemas únicamente usan programas desarrollados por usuarios.
La confusión debida a que dos aplicaciones diferentes intentan usar los mismos números de puerto sobre un host se evita escribiendo esas aplicaciones para pedir un puerto TCP/IP disponible. Puesto que este número de puerto se asigna dinámicamente, debe diferir de una invocación de una aplicación a la próxima.

Sockets

Consideremos la terminología siguiente:
  • Un socket es un tipo especial de manejador de fichero que utiliza un proceso para pedir servicios de red al sistema operativo.
  • Una dirección de socket es la tripleta: {protocolo, dirección-local, proceso-local}En la familia TCP/IP, por ejemplo: {tcp, 193.44.234.3, 12345}
  • Una conversación es el enlace de comunicación entre dos procesos.
  • Una asociación es la quíntupla que especifica completamente los dos procesos que comprende una conexión:{protocolo, dirección-local, proceso-local, dirección-externa, proceso-externo}
    En la familia TCP/IP, por ejemplo:
    {tcp, 193.44.234.3, 1500, 193.44.234.5, 21}
    podría ser una asociación válida.
  • Una media-asociación es:{protocolo, dirección-local, proceso-local}
    o
    {protocolo, dirección-externa, proceso-externo}
    que especifica cada mitad de una conexión.
  • La media-asociación se denomina también socket o dirección de transporte. Esto es, un socket es un punto terminal para comunicación que puede nombrarse y direccionarse en una red.
La interfaz socket es una de las muchas APIs para los protocolos de comunicación. Diseñada para ser una interfaz de programación de comunicación, fue introducida primero por el sistema UNIX 4.2BSD. Aunque no se ha estandarizado, ha llegado a ser un estándar en la industria.
4.2BSD permitía dos dominios de comunicación diferentes: Internet y UNIX. 4.3BSD ha añadido los protocolos del Sistema de Red de Xerox (XNS) y 4.4BSD añadirá una interfaz extendida para dar soporte a los protocolos ISO OSI.

Llamadas socket básicas

A continuación se lista algunas llamadas de la interfaz socket básica. En la próxima sección se verá un escenario ejemplo del uso de estas llamadas de la interfaz socket.
  • Inicializar un socketFORMATO: int sockfd = socket(int familia, int tipo, int protocolo)
    donde:
    • familia simboliza familia de direccionamiento . Puede tomar valores tales como AF_UNIX, AF_INET, AF_NS y AF_IUCV. Su propósito es especificar el método de direccionamiento utilizado por el socket.
    • tipo simboliza el tipo de interface de socket a usar. Puede tomar valores tales como SOCK_STREAM, SOCK_DGRAM, SOCK_RAW, y SOCK_SEQPACKET.
    • protocolo puede ser UDP, TCP, IP o ICMP.
    • sockfd es un entero (similar a un descriptor de fichero) que devuelve llamada socket.
  • Ligar (registro) un socket a una dirección de puertoFORMATO: int bind(int sockfd, struct sockaddr *localaddr, int addrlen)
    donde:
    • sockfd es el mismo entero devuelto por la llamada socket.
    • localaddr es la dirección local que devuelve la llamada bind.
    Nótese que después de la llamada bind, ya se tienen valores para los tres primeros parámetros dentro de la asociación 5-tupla:
    {protocolo, dirección-local, proceso-local, dirección-externa, proceso-externo}
  • Indicar premura para recibir conexionesFORMATO: int listen(int sockfd, int tamaño-cola)
    donde:
    • sockfd es el mismo entero que devuelve la llamada socket.
    • tamaño-cola indica el número de conexiones pedida que puede introducir en la cola el sistema mientras el proceso local no haya emitido la llamada accept.
  • Aceptar una conexiónFORMATO: int accept(int sockfd, struct sockaddr *dirección-externa, int addrlen)
    donde:
    • sockfd es el mismo entero que devuelve la llemada socket.
    • dirección-externa es la dirección del proceso externo (cliente) que devuelve la llamada accept.
    Nótese que esta llamada accept la emite un proceso servidor en vez de un proceso cliente. Si existe una petición de conexión esperando en la cola por este socket de conexión, accept toma la primera petición de la cola y crea otro socket con las mismas propiedades que sockfd; en caso contrario, accept bloqueará al proceso llamador hasta que llegue una petición de conexión.
  • Petición de conexión al servidorFORMATO: int connect(int sockfd, struct sockaddr *dirección-externa, int addrlen)
    donde:
    • sockfd es el mismo entero devuelto por la llamada socket.
    • dirección-externa es la dirección del proceso externo (servidor) que devuelve la llamada connect.
    Nótese que esta llamada la emite un proceso cliente mejor que un proceso servidor.
  • Enviar y/o recibir datosLas llamadas read(), readv(sockfd, char *buffer, int addrlen), recv(), readfrom(), send(sockfd, msg, len, flags), write() pueden usarse para recibir y enviar datos en una asociación de socket establecida (o conexión).
    Nótese que estas llamadas son similares a las llamadas del sistema de E/S de ficheros estándar read y write.
  • Cerrar un socketFORMATO: int close(int sockfd)
    donde sockfd es el mismo entero que devuelve la llamada socket.

Un escenario ejemplo

Como ejemplo, considerar las llamadas del sistema socket para un protocolo orientado a conexión.
Considerar las llamadas del sistema socket anterior en términos de especificar los elementos de la asociación:
La interfez socket se diferencia por los servicios distintos que proporciona. Flujo, datagrama, y raw sockets cada uno de ellos define un servicio distinto disponible para aplicaciones.
  • Interfaz socket de flujo (SOCK_STREAM): Define un servicio orientado a conexión confiable (sobre TCP por ejemplo). Los datos se envían sin errores o duplicación y se reciben en el mismo orden de como fueron enviados. El control de flujo está integrado para evitar overruns. No se imponen límites en el intercambio de datos, que se considera flujo de bytes. Ejemplo de aplicación que use sockets de flujo es el Programa de Transferencia de Ficheros (FTP).
  • Interfaz socket de datagrama (SOCK_DGRAM): Define un servicio no orientado a conexión (sobre UDP por ejemplo). Los datagramas se nevían como paquetes independientes. El servicio no proporciona garantías; los datos se pueden perder o duplicar y los datagramas pueden llegar fuera de orden. No realiza desensamblado y reensamblado de paquetes. Ejemplo de aplicación que utilice sockets de datagrama es el Sistema de Ficheros de Red.
  • Interfaz socket raw (SOCK_RAW): Permite acceso directo a protocolos de capas más bajas tales como IP e ICMP. Esta interfaz se utiliza a menudo para comprobar nuevas implementaciones de protocolos. Ejemplo de aplicación que use sockets raw es la orden ping.
SHARE

Oscar perez

Arquitecto especialista en gestion de proyectos si necesitas desarrollar algun proyecto en Bogota contactame en el 3006825874 o visita mi pagina en www.arquitectobogota.tk

  • Image
  • Image
  • Image
  • Image
  • Image
    Blogger Comment
    Facebook Comment

0 comentarios:

Publicar un comentario