17
1 Material parcialmente adaptado del libro Computer Networking: A Top Down Approach Featuring the Internet, 3 rd edition. Jim Kurose, Keith Ross, Ed. Addison-Wesley, Julio 2004 Sockets (TCP) Tema 2.- Nivel de aplicación en Internet Dr. Daniel Morató Redes de Computadores Ingeniero Técnico en Informática de Gestión, 2º curso 27 Oct Sockets TCP 1/33 Temario 0.- Presentación de la asignatura 1.- Introducción 2.- Nivel de aplicación en Internet 3.- Nivel de transporte en Internet 4.- Nivel de red en Internet 5.- Nivel de enlace

Sockets (TCP) - tlm.unavarra.esdaniel/docencia/rc_itig/rc_itig04_05/... · 1 Material parcialmente adaptado del libro Computer Networking: A Top Down Approach Featuring the Internet,

Embed Size (px)

Citation preview

1

Material parcialmente adaptado del libro Computer Networking: A Top Down Approach Featuring the Internet,3rd edition. Jim Kurose, Keith Ross, Ed. Addison-Wesley, Julio 2004

Sockets (TCP)Tema 2.- Nivel de aplicación en Internet

Dr. Daniel MoratóRedes de Computadores

Ingeniero Técnico en Informática deGestión, 2º curso

27 Oct Sockets TCP 1/33

Temario0.- Presentación de la asignatura1.- Introducción

2.- Nivel de aplicación en Internet3.- Nivel de transporte en Internet4.- Nivel de red en Internet5.- Nivel de enlace

2

27 Oct Sockets TCP 2/33

Temario0.- Presentación de la asignatura1.- Introducción

2.- Nivel de aplicación en Internet Principios Funcionamiento de servicios Diseño y programación de servicios

3.- Nivel de transporte en Internet4.- Nivel de red en Internet5.- Nivel de enlace

27 Oct Sockets TCP 3/33

Tema 2: ServiciosObjetivo:» Aprender a construir aplicaciones

cliente/servidor que se comunicanempleando sockets

3

27 Oct Sockets TCP 4/33

Programación con Sockets

API de Sockets» Introducida en el UNIX

BSD4.2 en 1983» Centrada en el

paradigmacliente/servidor

» Ofrece dos tipos deservicios de transporte: STREAM: flujo de datos

fiable orientado aconexión

DGRAM: datagramas

Un interfaz local al host,creado por la aplicación,controlado por el S.O.,

mediante el cual procesosde aplicación pueden

enviar y recibir mensajeshacia/desde otros

procesos de aplicación

socket

27 Oct Sockets TCP 5/33

Programación con Sockets TCP

Socket: una puerta entre el proceso deaplicación y el protocolo de transporte(UCP o TCP)

Servicio TCP: transferencia fiable de bytesde un proceso a otro

proceso

TCP

socket

Controlado por elprogramador de la

aplicación

Controlado por elSistema Operativo

host oservidor

proceso

TCP

socket

Controlado por elprogramador de laaplicación

Controlado por elSistema Operativo

host oservidor

internet

4

27 Oct Sockets TCP 6/33

Programación con Sockets TCP

El cliente debe contactarcon el servidor

» El servidor debe estarejecutándose primero

» El servidor debe habercreado un socket por elque espera que el clientecontacte con él

» El cliente crea su propiosocket

» Especifica la dirección IPdel servidor y el puerto dela aplicación

» Entonces se establece laconexión TCP con elservidor

» Cuando el servidor escontactado crea un nuevosocket TCP para lacomunicación con el cliente Permite que el servidor se

comunique con variosclientes simultáneamente

La dirección IP del clientey el puerto empleado porsu aplicación sirven paradistringuirlos (más cuandoveamos TCP)

TCP ofrece transferenciafiable, en orden, de bytes

(una “pipe”) entre cliente y servidor

Para la aplicación

27 Oct Sockets TCP 7/33

Stream» Un stream es una secuencia de bytes

que fluye hacia o desde un proceso» Un stream de lectura se encuentra

asociado a un dispositivo de entrada (ej.,teclado, socket)

» Un stream de escritura está asociado aun dispositivo de salida (ej., monitor osocket)

» Un socket TCP ofrece un streambidireccional full duplex

5

27 Oct Sockets TCP 8/33

Sockets TCP» Cliente TCP» Servidor TCP

27 Oct Sockets TCP 9/33

Creación de un Socketint socket(int domain, int type, int protocol)

» int domain

Hay diferentes tipos de sockets paradiferentes familias de protocolos

» int type

SOCK_STREAM, SOCK_DGRAM, (otros)

» int protocol

En caso de que haya varios protocolos en lamisma categoría

6

27 Oct Sockets TCP 10/33

Network Order vs Host Order» Host byte order

Los números de más deun byte se puedenguardar en memoriaempezando

» Por el más significativo:BIG ENDIAN

» Por el menos significativo:LITTLE ENDIAN

Las CPUs normalmentesoportan solo un modo oal menos solo empleanuno

» Intel, AMD: LITTLE ENDIAN» SPARC, Motorola, IBM:

BIG ENDIAN

» Network byte order Máquinas de

diferentesarquitecturas deben“entenderse”

Ej. ¿la dirección IPdestino en el paqueteIP, en qué orden va?

Network byte order =BIG ENDIAN

27 Oct Sockets TCP 11/33

Network Order vs Host OrderNetwork Order -> Host order

» int ntohl(int)

Para 32bits

» short ntohs(short)

Para 16bits

Host Order -> Network order

» int htonl(int)

Para 32bits

» short htons(short)

Para 16bits

7

27 Oct Sockets TCP 12/33

struct hostent *gethostbyname(char *)

» DNS» Se le pasa una cadena

con un nombre dedominio “www.tlm.unavarra.es”

» o una cadena con elnombre en formato “dot-decimal” “130.206.160.215”

» Devuelve un puntero auna estructura

» Dicha estructura existedentro de la librería

» Siempre es la misma» Entre sus campos está la

IP (en network byte order)

ret1=gethostbyname()

ret1

ret2

ret2=gethostbyname()

27 Oct Sockets TCP 13/33

Conectarint connect(int s, struct sockaddr *name, int len)

» int s Socket

» struct sockaddr *name Identifica al socket del otro extremo

con su:» Dirección IP» Puerto

» int len Tamaño (bytes) de la estructura a la

que apunta el segundo argumento

8

27 Oct Sockets TCP 14/33

El Socket» Es un descriptor de fichero (file descriptor)» Se pueden emplear con él funciones

típicas que trabajan con descriptores ssize_t read(int, void *, size_t)

ssize_t write(int, void *, size_t)

int dup(int)

int dup2(int, int)

int close(int)

select()

27 Oct Sockets TCP 15/33

Ejemplo en pseudo-código» Cliente

1. Crear el socket TCP(Stream)

2. Solicitar al S.O. que loconecte con un destino(IP+puerto) concreto

3. Conexión establecida4. Escribir/Leer del socket...

5. Cerrar el socket/conexión

» Servidor1. Crear el socket TCP (Stream)2. Asignarle el puerto en el que

esperar3. Solicitar al S.O. que escuche

y acepte esas conexiones

4. Esperar una conexión...

5. Nueva conexión. Un socketnuevo hace referencia a laconexión, el original sigueaceptando conexiones

6. Escribir/Leer del socket...7. Cierre de la conexión

Three-wayhandshake

Dat

os

Finalización

9

27 Oct Sockets TCP 16/33

» Cliente

int sockcliente, ret;struct sockaddr_in dirsock;struct hostent *resolvhost;

sockcliente=socket(PF_INET,SOCK_STREAM,0);if (sockcliente==-1) ERROR();

Cliente en C (1)» Servidor1. Crear el socket TCP (Stream)

2. Asignarle el puerto en el queesperar

3. Solicitar al S.O. que escuche yacepte esas conexiones

4. Esperar una conexión...

FísicoEnlace

RedTransporte

FísicoEnlace

RedTransporte

Servidor Acepta conexionesal puerto 80

Crea

r el

soc

ket

TCP

Cliente

27 Oct Sockets TCP 17/33

Cliente en C (2)» Cliente

dirsock.sin_family=AF_INET;resolvhost=gethostbyname(“servidor.tlm.unavarra.es”);if (resolvhost==NULL) ERROR();dirsock.sin_addr.s_addr=*(u_long*)resolvhost->h_addr_list[0];

dirsock.sin_port=htons(80);

ret=connect(sockcliente, (struct sockaddr*)&dirsock, sizeof(dirsock));if (ret==-1) ERROR();

» Servidor4. Esperar una conexión

5. Nueva conexión

FísicoEnlace

RedTransporte

FísicoEnlace

RedTransporte

ServidorCliente

Petición alservidor de DNS192.168.17.14

DN

S...

Cone

ctar

...

Conecta con la aplicaciónen 192.168.17.14, puerto 80

10

27 Oct Sockets TCP 18/33

Cliente en C (y 3)» Cliente

write(sockcliente,...);read(sockcliente,...);.......close(sockcliente);

» Servidor

6. Escribir/Leer del socket...

7. Cierre de la conexión...

FísicoEnlace

RedTransporte

FísicoEnlace

RedTransporte

ServidorCliente

Envi

ar/r

ecib

irCi

erre

27 Oct Sockets TCP 19/33

Compilación» ¿Headers?

#include <sys/types.h> #include <sys/socket.h>

#include <netdb.h> (gethostbyname()) #include <netinet/in.h> (htons())

» ¿Librerías? Según el UNIX: ninguna, -lsocket, -lnsl

...

11

27 Oct Sockets TCP 20/33

Pruébelo» Cree un cliente que se conecte a

un servidor Web» Que le solicite una página Web

mandando un mensaje de peticiónde HTTP

27 Oct Sockets TCP 21/33

Sockets TCP» Cliente TCP» Servidor TCP

12

27 Oct Sockets TCP 22/33

Socket» Creación con

int socket(int, int, int)

Igual que en el extremo del cliente

27 Oct Sockets TCP 23/33

“Asociar” a un puertoint bind(int s, struct sockaddr *name, int len)

» Da “nombre” a un socket» int s

El socket» struct sockaddr *name

El puerto en el que “escucha” el servidor Si el host tuviera varias direcciones IP (varios interfaces)

también se podría seleccionar una» int len

Tamaño de la estructura a la que apunta el segundoargumento

13

27 Oct Sockets TCP 24/33

Empezar a “escuchar”int listen(int s, int backlog)

» Indica al S.O. que empiece a aceptar conexiones alpuerto al que está asociado el socket

» int s

El socket» int backlog

El S.O. acepta conexiones sin interacción de la aplicaciónservidor

Limita cuántas puede tener aceptadas sin que el programalas atienda

27 Oct Sockets TCP 25/33

Atender a la conexiónint accept(int s, struct sockaddr *addr, int *len)

» Devuelve un nuevo socket» Está asociado a una de las conexiones aceptadas por el S.O.» Una de las conexiones en la cola del listen()» int s

El socket» struct sockaddr *addr

Debe ser el puntero a una estructura que exista en memoria La función rellena la estructura con información de la conexión

» int *len Puntero a un entero que debe existir en memoria Al llamar a la función debe tener el tamaño de la zona de memoria

apuntada por el segundo argumento Al salir de la función contiene el tamaño de la estructura

14

27 Oct Sockets TCP 26/33

El Socket» Es un descriptor de fichero (file descriptor)» Se pueden emplear con él funciones típicas que

trabajan con descriptores ssize_t read(int, void *, size_t)

ssize_t write(int, void *, size_t)

int dup(int)

int dup2(int, int)

int close(int)

select()

27 Oct Sockets TCP 27/33

Ejemplo en pseudo-código» Cliente

1. Crear el socket TCP (Stream)2. Solicitar al S.O. que lo conecte

con un destino (IP+puerto)concreto

3. Conexión establecida4. Escribir/Leer del socket...

5. Cerrar el socket/conexión

» Servidor1. Crear el socket TCP (Stream)2. Asignarle el puerto en el que esperar3. Solicitar al S.O. que escuche y acepte

esas conexiones4. Esperar una conexión...

5. Nueva conexión. Un socket nuevo hacereferencia a la conexión, el original sigueaceptando conexiones

6. Escribir/Leer del socket...7. Cierre de la conexión

Three-wayhandshake

Dat

os

Finalización

15

27 Oct Sockets TCP 28/33

» Cliente

Servidor en C (1)» Servidor

int sockservidor, sockconectado;int ret, dirlen=sizeof(dirsock);struct sockaddr_in dirsock;

sockservidor=socket(PF_INET,SOCK_STREAM,0);if (sockservidor==-1) ERROR();

dirsock.sin_family=AF_INET;dirsock.sin_addr.s_addr=INADDR_ANY;dirsock.sin_port=htons(80);

ret= bind(sockservidor, (struct sockaddr*)&dirsock,sizeof(dirsock));

if (ret==-1) ERROR();

FísicoEnlace

RedTransporte

FísicoEnlace

RedTransporte

Servidor

Crear el socket TCP...

Cliente

“bind”...

Puerto 80

27 Oct Sockets TCP 29/33

Servidor en C (2)» Cliente

1. Crear el socket TCP(Stream) ...

2. Solicitar al S.O. que loconecte con un destino(IP+puerto) concreto ...

» Servidorret=listen(sockservidor,5);if (ret==-1) ERROR();

sockconectado=accept(sockservidor, (structsockaddr*)&dirsock, &dirlen);

FísicoEnlace

RedTransporte

FísicoEnlace

RedTransporte

ServidorCliente Conecta con la aplicaciónen 192.168.17.14, puerto 80 Acepta conexiones

al puerto 80

“listen” ...A

ceptar conexió n

16

27 Oct Sockets TCP 30/33

Servidor en C (y 3)» Cliente1. Escribir/Leer del socket

2. Cerrar el socket/conexión

» Servidorwrite(sockconectado,...);read(sockconectado,...);.........close(sockconectado,...);

FísicoEnlace

RedTransporte

FísicoEnlace

RedTransporte

ServidorCliente

Enviar/RecibirCerrar

conexión...

27 Oct Sockets TCP 31/33

Tipos de servidores» Servidor iterativo

1. Acepta una conexión2. Realiza la

comunicación3. Cierra la conexión4. Vuelve al punto 1.

» Servidor concurrente Acepta una conexión Crea un nuevo proceso

El proceso original sigueesperando nuevasconexiones

fork()

El procesonuevo atiende a esaconexión y termina

accept()

read()/write()close()accept()

read()/write()close()accept()

Cliente

Cliente

Cliente

fork()

El procesonuevo atiende a esaconexión y termina

Cliente

Cliente

El procesooriginal sigueesperandoconexiones

17

27 Oct Sockets TCP 32/33

Servidores concurrentes» Permiten atender

varias peticionessimultáneamente

» No se detieneporque un serviciosea muy “largo” Gran fichero a servir Transferencia lenta

» Concurrencia: Mediante atención

alternada: select()

Mediante multiproceso» fork()

» Se heredan losdescriptores de fichero

» Aprovechan NxCPUs

Mediante multihilo» threads» Comparten el espacio de

memoria» Aprovechan NxCPUs

27 Oct Sockets TCP 33/33

Próximo día

Sockets UDP