Title: SOCKETS
1SOCKETS
AMPLIACION DE SISTEMAS OPERATIVOS
- AIRAN GODOY HERNANDEZ
- JOSE MARIA RODRIGUEZ RODRIGUEZ
- 5º INGENIERIA EN INFORMATICA
2Definición de Socket
- Punto de comunicación entre procesos, mediante el
cual pueden emitir o recibir información. - Uso de Descriptores.
3Características de un socket
- A cada socket le corresponde una constante
simbólica definida en ltsys/socket.hgt - Dominio Conjunto de sockets con los cuales se
podrá establecer comunicación. - Tipo Define las propiedades de las
comunicaciones en las cuales está implicado.
4Dominio de socket
- Dominio Unix estos sockets se destinan a una
comunicación local les corresponden direcciones
locales que son referencias a Unix idénticas a
las de los archivos. - ls, rm
- Dominio Internet la conexión a una dirección
Internet de este tipo de socket necesita la
preparación de un objeto que tenga la estructura
sockaddr_in. Para ello - Conocimiento de la dirección de la máquina local
gethostname, gethostbyname, INADDR_ANY - Elección de un número de puerto getservbyname,
IPPORT_RESERVED -
5Dominio de un socket
- Formato de direcciones y protocolos
- Dominio UNIX (AF_UNIX) Los sockets son locales
donde se definen. - struct sockaddr_un
- short sun_family / dominio UNIX /
- char sun_data108 / referencia de dirección
/ -
6Dominio de un socket
- Dominio Internet (AF_INET) Asigna un servicio a
una máquina determinada. - struct in_addr
- u_long s_addr
-
- struct sockaddr_in
- short sin_family / familia de dirección
AF_INET / - u_short sin_port / número de
puerto / - struct in_addr sin_addr / dirección Internet
/ - char sin_zero8 / campo de 8 ceros /
-
7Tipo de un socket
- Propiedades de comunicación
- Fiabilidad de la transmisión.
- Conservación del orden de los datos.
- No duplicación de datos.
- Comunicación en modo conectado.
- Conservación de los límites de los mensajes.
- Envío de mensajes ltlturgentesgtgt.
8Tipo de un socket
- Tipos disponibles
- (características, propiedades, protocolo)
- SOCK_DGRAM Destinados a la comunicación en modo
no conectado para envío de datagramas de tamaño
limitado. Propiedad 5. UDP. - SOCK_STREAM Comunicaciones fiables en modo
conectado. Propiedades 1-4. Propiedad 6. TCP. - SOCK_RAW Acceso a los protocolos de más bajo
nivel. Superusuario. IP.
9FUNCIONES BASICAS
- SOCKET
- BIND
- CONNECT
- CLOSE
- LISTEN
- ACCEPT
- WRITE
- SEND
- READ
- RECV
- SENDTO
- RECVFROM
- SHUTDOWN
- GETSOCKNAME
- GETPEERNAME
10FUNCIONES
- int socket (dominio,tipo,protocolo)
- Crea un socket para comunicaciones.
- Devuelve un descriptor ó -1.
- Cuando se crea un proceso hijo hereda este
descriptor. - Dominio
- PF_UNIX, PF_LOCAL, PF_INET, PF_INET6,
PF_IPX, PF_NETLINK, - PF_X25, PF_AX25, PF_ATMPVC, PF_APPLETALK,
PF_PACKET - Tipo
- SOCK_STREAM, SOCK_DGRAM, SOCK_RAW,
SOCK_SEQPACKET, - SOCK_RDM
11FUNCIONES
- int bind (socket,localaddr,addrlen)
- int connect (socket, addr,addrlen)
Especifica una dirección local y un número de
puerto del protocolo Asigna un nombre
(dirección puerto) al socket. Orientado a
conexión-gt Establece una conexión con el otro
socket No orientado a conexión-gt addr es la
dirección por defecto a la cual se envían los
datagramas.
12FUNCIONES
- int close (socket)
- int listen (socket, qlen)
Si n procesos usan el socket decrementa las
referencias y lo libera cuando n0. Cierra la
conexión y libera el socket. Establece una
conexión pasiva ( Espera peticiones de entrada)
qlen Longitud de la cola para socket
establecidos completamente Solo se aplica a los
socket SOCK_STREAM, SOCK_SEQPACKET Y SOCK_RDM
13FUNCIONES
- int accept (dominio,addr,len)
Retira una petición de la cola de peticiones
pendientes (definida en listen) Si no hay
pendientes y el socket es con bloqueo queda
esperando Llena la estructura apuntada por addr
con la dirección y puerto remoto.
14FUNCIONES
- int write (socket, buf, len)
- - Envía datos a traves de la conexión TCP.
- int send (socket, mensaje, lon, flags)
- Envia un mensaje
- Solo cuando el socket este en estado connected
- Flags especifica si el mensaje es fuera de banda
15FUNCIONES
- int read (socket, buf, len)
- - Lee datos de una conexión TCP.
- int recv (socket, mensaje, lon, flags)
- Recibe un datagrama
- Solo cuando el socket este en estado connected
16FUNCIONES
- int sendto (int socket, const void mensaje, int
lon, - unsigned int flags, const struct
sockaddr to, int tolen) - - Envía un mensaje.
- int recvfrom (int socket, const void mensaje,
int lon, - unsigned int flags, const struct
sockaddr from, - int fromlen)
- -Recibe datos de un socket.
17FUNCIONES
inet_aton, inet_ntoa Convierte entre una
string que especifica la dirección IP expresada
en decimal separada por . en su valor binario
en formato de red y viceversa. inet_pton,
inet_ntop Convierte entre una string que
especifica la dirección IP expresada en decimal
separada por . en una estructura de direccion
de red y viceversa. htons - Convierte enteros
binarios del orden nativo del equipo al orden
estándar de red y viceversa.
18FUNCIONES
- int shutdown (socket, direccion)
- Getsockname, getpeername
- Cierra la conexión en una sola dirección
- 0 Entrada
- 1 Salida
- 2 Ambas
- Obtiene la dirección y puerto de los extremos
19EJEMPLO
20INTRODUCCION
- El cliente DNS se encarga de enviar un paquete al
puerto 53 mediante UDP con una pregunta, y el
servidor responde con otro paquete con la
respuesta. - En la pregunta el usuario especifica el tipo de
interrogación que desea (A, NS, SOA ...) - Para utilizar el programa se usa la ste. Sintaxis
- ./cliente DirIPServidor NombreDominio
21INTRODUCCION
CABECERA
PREGUNTA
RESPUESTA
AUTORIDAD
ADICIONAL
RRs
RRs
RRs
22INTRODUCCION
Identificador Identificador Identificador Identificador Identificador Identificador Identificador Identificador
QR Cód. Int AA TC RD RA Z Cód. Resp
QD Count QD Count QD Count QD Count QD Count QD Count QD Count QD Count
AN Count AN Count AN Count AN Count AN Count AN Count AN Count AN Count
NS Count NS Count NS Count NS Count NS Count NS Count NS Count NS Count
AR Count AR Count AR Count AR Count AR Count AR Count AR Count AR Count
QR Pregunta (0) Respuesta (1)
Cód. Resp No error (0) Errores(1-5) Cód.
Int Pregunta(0) Preg. Inversa (1) Status (2)
QDCount Nº de preguntas AA Respuesta con
autorización ANCount Nº de RRs de
respuestas TC Truncado NSCount
Nº de RRs de autoridad RD Solicita
recursividad ARCount Nº de RRs de
Adicional RA Recursividad disponible Z
Reservado
23INTRODUCCION
QNAME . .
QTYPE
QCLASS
QNAME Puede ser una secuencia de etiquetas
acabadas en un 0, acabadas en un puntero o
puede ser un puntero. QTYPE Tipo de
interrogación (1 A 2 NS 5 NS - 6 SOA 11 WKS
12 PTR 13 HINFO 15 MX 16 TXT) QCLASS
Clase de interrogación ( 1 IN 2 CS - 3 CH 4
CH)
24INTRODUCCION
Formato del Registro de Recurso
NOMBRE . .
TIPO
CLASE
TTL (32)
LONGITUD DATOS
DATOS DESCRIPTIVOS
COMPRESION Reemplazar un nombre de dominio
completo o la parte
final de un nombre de dominio por un puntero a
una ocurrencia anterior.
1 1 OFFSET
25INTRODUCCION
Formato de los Datos
PTRDNAME
PTR
MNAME
RNAME
SERIAL
REFRESH
RETRY
EXPIRE
MINIMUM
CNAME
CNAME
PREFERENCE
EXCHAGE
MX
SOA
ADDRESS
A
CPU
OS
HINFO
ADDRESS ADDRESS
PROTOCOL BITMAP
BITMAP BITMAP
WKS
NSDNAME
NS
TXTDATA
TXT
26PETICION/RESPUESTA
Ejemplo Queremos saber quien es el
administrador de la página de playboy
27PETICION/RESPUESTA
Ejemplo Queremos saber quien es el
administrador de la página de playboy
28PETICION/RESPUESTA
Ejemplo Queremos saber quien es el
administrador de la página de playboy
29EJEMPLOS
30EJEMPLOS
31ESTRUCTURAS
- typedef struct
- unsigned id 16 // IDENTIFICADOR
- unsigned rd 1 // FLAG DE RECURSIVIDAD
- unsigned tc 1 // FLAG DE TRUNCAMIENTO
- unsigned aa 1 // RESPUESTA
AUTORITATIVA - unsigned opcode 4 // TIPO DE CONSULTA
- unsigned qr 1 // FLAG DE PREGUNTA O
RESPUESTA -
- unsigned rcode 4 // CODIGO DE RESPUESTA
- unsigned z 3 // NO USADO
- unsigned ra 1 // RECURSION DISPONIBLE
- unsigned qdcount 16 // NUMERO DE PREGUNTAS
- unsigned ancount 16 // NUMERO DE RRs de
RESPUESTA - unsigned nscount 16 // NUMERO DE RRs de
AUTORIDAD - unsigned arcount 16 // NUMERO DE RRs
ADICIONALES
32ESTRUCTURAS
- typedef struct
- unsigned qtype 16 // TIPO DE PREGUNTA
- unsigned qclass 16 // CLASE DE PREGUNTA
- PREGUNTA
- typedef struct
- unsigned type 16 // TIPO DE RECURSO
- unsigned class 16 // CLASE DE RECURSO
- unsigned ttl1 16 // TIEMPO DE VIDA
- unsigned ttl216
- unsigned rdlength 16 // LONGITUD DE LOS DATOS
- RECURSO
- typedef struct // ESTRUCTURA PARA OBTENER UNA
DIRECCION IP
33ESTRUCTURAS
- typedef struct
- unsigned serial116 // SERIAL
- unsigned serial216
- unsigned refresh116 // TIEMPO DE REFRESCO
- unsigned refresh216
- unsigned retry116 // TIEMPO DE REINTENTO
- unsigned retry216
- unsigned expire116 // TIEMPO DE EXPIRACION
- unsigned expire216
- unsigned minimum116 // VALOR PREDETERMINADO
PARA TTL - unsigned minimum216
- SOAREG
34FUNCIONES
- int CodificaNombre(char buf, char qname, int
qnamelen) - Recibe un puntero a la zona del paquete donde irá
el nombre codificado (buf), el nombre a codificar
(qname) y la longitud de dicho nombre (qnamelen).
- Empieza en el ultimo punto sustituyéndolo por un
0 (marca de fin de nombre) y cada vez que
encuentra otro lo sustituye por un valor numérico
que coincide con el número de caracteres hasta el
siguiente punto. - Ejemplo www.dis.ulpgc.es. se transformaría en
3www3dis5ulpgc2es0 - void Imprime (u_char posmem, u_char buf)
- Recibe una posición de memoria (posmem) y la
posición de inicio del paquete (buf). - Se encarga de imprimir un nombre de dominio por
pantalla teniendo en cuenta que puede ser un
conjunto de etiquetas acabado en 0, un conjunto
de etiquetas acabados en un puntero o un puntero. - Cuando se acaba de imprimir, posmem apunta ahora
a la siguiente dirección después del nombre.
35FUNCIONES
- void MuestraRR(u_char pointer,u_char buf,int
cont) - Recibe la posición de memoria del RR (pointer),
el inicio del paquete (buf) y el numero de RR
(cont). - Imprime por pantalla los registros de recursos
(tantos como diga la variable cont) a partir de
pointer - Imprime el nombre de dominio.
- La estructura RECURSO (clase, tipo, ttl y long.
datos). - Para mostrar el contenido de los datos se tiene
en cuenta el tipo interrogación (A, NS, SOA). - Ej si es A se imprime una dirección IP
(estructura AR). - si es SOA se muestra el
nombre del servidor, la dirección de
correo y luego la estructura SOAREG. - Se hace uso de la función Imprime.
- Cuando se acaba de imprimir pointer apunta ahora
al siguiente registro de recurso (Autoridad ó
Adicional).
36FUNCIONES
- Int ConstruyePaquete(char buf, char qname, int
qnamelen) - Recibe un puntero al inicio del paquete (buf), el
nombre del dominio (qname) y la longitud de dicho
nombre (qnamelen). - Se crea un paquete con la pregunta
- Se rellenan los campos de la cabecera (estructura
HEADER) - hp.id CodPaquete
- hp.qr 0 // PREGUNTA
- hp.opcode 0 // PREGUNTA ESTANDAR
- hp.z 0 // Z DEBE ESTAR A 0
- hp.qdcount htons(1) // NUMERO DE
PREGUNTAS - hp.tc 0 // NO TRUNCAR
- hp.rd 1 // PREGUNTA RECURSIVA
- Seguidamente nos encargamos de la pregunta
- 1 - Llamamos a la función CodificaNombre
- 2 - Pedimos al usuario el tipo de interrogación
que desea y ponemos la clase a 1 (IN).
37FUNCIONES
CODIGO
- int DecodificaPaquete(u_char buf, int buflen)
- Recibe un puntero al inicio del paquete (buf), la
longitud del paquete (buflen). - Muestra la información que contiene el paquete de
respuesta. - Va accediendo a las posiciones de memoria de la
cabecera, la pregunta (QNAME, tipo y clase) y los
registros de recursos (para mostrar los datos se
hace uso de la función MuestraRR). - int main(int argc, char argv)
- Recibe como parámetros el nº argumentos y los
argumentos (dirección IP - del servidor y el nombre de dominio).
- Si el nombre de dominio no acaba en punto se le
añade. - Se inicializa y crea el socket (puerto 53 UDP)
- Empaquetamos (función ConstruyePaquete) y
enviamos el paquete. - Recibimos la respuesta y la desempaquetamos
(función DecodificaPaquete)
38FIN