Sistemas de Transportes de Datos (STD) Tema III: UDP y TCP (Entrega 4) ___________________________________ Sockets ___________________________________ • Abstracción para las operaciones de E/S a través de la red. Generalización de mecanismos de acceso a ficheros para suministrar un punto a través del cual realizar las comunicaciones. • Operaciones: – Crear un socket. – Asociarlo a una dirección específica (diferencia con los ficheros: la creación lleva implícita la asociación a un archivo físico). – Establecer una c1onexión con una aplicación remota (). – Enviar y recibir datos. – Cerrar la conexión. Departamento Arquitectura Computadores UPC © J.C. Cruellas ___________________________________ ___________________________________ ___________________________________ ___________________________________ ___________________________________ Grupo de Aplicaciones Telemáticas ___________________________________ Aplicaciones, sockets y TCP/IP Aplicación Aplicación ___________________________________ ___________________________________ ___________________________________ Socket Socket ___________________________________ ___________________________________ TCP / UDP ___________________________________ IP Driver Departamento Arquitectura Computadores UPC © J.C. Cruellas Grupo de Aplicaciones Telemáticas ___________________________________ Terminología y números de puertos • Dirección de protocolo: Pareja formada por la @IP y un número de puerto. Un socket siempre acaba asociándose a una dirección de protocolo. • Una conexión TCP conecta dos aplicaciones que intercambian datos a través de sus correspondientes sockets, cada uno de los cuales se asocia a la correspondiente dirección de protocolo. • En general, para las aplicaciones cliente, el módulo TCP escoge un número de puerto temporal (efímero) y variable cada vez que se invoca, y es él quien asocia la dirección local al socket. 3 Departamento Arquitectura Computadores © J.C. Cruellas ___________________________________ ___________________________________ ___________________________________ ___________________________________ ___________________________________ ___________________________________ Grupo de Aplicaciones Telemáticas UPC Juan Carlos Cruellas Ibarz 1 Sistemas de Transportes de Datos (STD) Tema III: UDP y TCP (Entrega 4) ___________________________________ Terminología ynúmeros de puertos • Por el contrario, un servidor suele servir siempre en un número de puerto elegido por dicho servidor, y es él mismo quien solicita al kernel que asocie el socket a la dirección de protocolo formado por la @IP local y el número de puerto. ___________________________________ ___________________________________ ___________________________________ ___________________________________ ___________________________________ ___________________________________ Departamento Arquitectura Computadores © J.C. Cruellas Grupo de Aplicaciones Telemáticas UPC ___________________________________ Operaciones • Creación de un socket: int socket (int family, int type, int protocol) ; family: familia protocolos AF_INET: IPv4 AF_INET6: IPv6 type: tipo de comunicación deseada SOCK_STREAM: orientada a conexión. SOCK_DGRAM: no orientada a conexión. Departamento Arquitectura Computadores UPC © J.C. Cruellas ___________________________________ ___________________________________ ___________________________________ ___________________________________ ___________________________________ ___________________________________ Grupo de Aplicaciones Telemáticas ___________________________________ Operaciones • Asociar socket a una dirección de protocolo local (para servidores) int bind (int sockfd, const struct sockaddr *myaddr, socklen_t addrlen) ; sockfd: descriptor de socket -devuelto por socket()myaddr: dirección local de protocolo a la que se asocia el socket (puntero a estructura específica con la dirección de protocolo local). addrlen: longitud de la estructura que contiene la dirección de protocolo. Departamento Arquitectura Computadores © J.C. Cruellas ___________________________________ ___________________________________ ___________________________________ ___________________________________ ___________________________________ ___________________________________ Grupo de Aplicaciones Telemáticas UPC Juan Carlos Cruellas Ibarz 2 Sistemas de Transportes de Datos (STD) Tema III: UDP y TCP (Entrega 4) ___________________________________ Operaciones • Solicitar conexión a una dirección de protocolo (@IP + número de puerto) remota. Operación típicamente invocada por la aplicación cliente. int connect (int sockfd, const struct sockaddr *servaddr, socklen_t addrlen) ; sockfd: descriptor de socket -devuelto por socket()servaddr: dirección de protocolo remota con la que desea conectarse la aplicación a través de su socket. addrlen: longitud de la estructura que contiene la dirección de protocolo antes mencionada. Departamento Arquitectura Computadores © J.C. Cruellas ___________________________________ ___________________________________ ___________________________________ ___________________________________ ___________________________________ ___________________________________ Grupo de Aplicaciones Telemáticas UPC ___________________________________ Operaciones • Operación para convertir un socket activo (uno a través del cual un cliente puede solicitar establecer una conexión) en un socket pasivo (uno a través del cual un servidor escucha si algún cliente le solicita establecer una conexión). • Invocada por un servidor despúes de invocar a socket() y bind(). Lo coloca en el estado de LISTEN del grafo de estados. listen(int sockfd, int backlog) ; sockfd: descriptor de socket -devuelto por socket()backlog: Número máximo de conexiones que el kernel Departamento Arquitectura Computadores UPC © J.C. Cruellas ___________________________________ ___________________________________ ___________________________________ ___________________________________ ___________________________________ ___________________________________ Grupo de Aplicaciones Telemáticas ___________________________________ Operaciones de TCP encolará para este socket. TCP gestiona dos colas por cada socket: – Cola de conexiones incompletas (el 3-way handshake no se ha completado -servidor en SYN_RCVD). Cuando se recibe el SYN de un cliente, se le añade una entrada correspondiente a esta conexión solicitada. – Cola de conexiones completadas (la conexión se ha establecido -servidor en ESTABLISHED). Cuando se recibe el ack del SYN enviado al cliente, se quita la anotación de la cola anterior y se le añade a ésta. Contiene las entradas de las conexiones que han sido establecidas y están a la espera de que el servidor comience a trabajar para ellas. Departamento Arquitectura Computadores UPC © J.C. Cruellas Juan Carlos Cruellas Ibarz ___________________________________ ___________________________________ ___________________________________ ___________________________________ ___________________________________ ___________________________________ Grupo de Aplicaciones Telemáticas 3 Sistemas de Transportes de Datos (STD) Tema III: UDP y TCP (Entrega 4) ___________________________________ Operaciones • El proceso de llegar al estado ESTABLISHED es algo transparente para el servidor. • Cuando el servidor invoca la función accept(), TCP le entrega la primera entrada de la última cola. • Números variables, porque la propia definición del backlog es algo confusa: desde un valor de 5 iniciales, a valores de 64 o más. • En los modernos sistemas operativos se permite ajustar su valor mediante variables de entorno. Departamento Arquitectura Computadores © J.C. Cruellas ___________________________________ ___________________________________ ___________________________________ ___________________________________ ___________________________________ ___________________________________ Grupo de Aplicaciones Telemáticas UPC ___________________________________ Operaciones • Aceptación por parte del servidor de una conexión establecida por su módulo TCP. Esta operación le devuelve al servidor la primera conexión que se encuentra en la cola de conexiones establecidas por el módulo TCP. int accept(int sockfd, sotruct sockaddr *cliaddr, socklen_t *addrlen) ; sockfd: descriptor del socket -listening socketdevuelto por socket(). cliaddr: (out) dirección de protocolo remota del proceso con el que se comunicará (típicamente una aplicación cliente). Departamento Arquitectura Computadores UPC © J.C. Cruellas ___________________________________ ___________________________________ ___________________________________ ___________________________________ ___________________________________ ___________________________________ Grupo de Aplicaciones Telemáticas ___________________________________ Operaciones valor devuelto: un descriptor correspondiente a la nueva conexión -connected socket• Un servidor crea normalmente: – Un solo “listening socket” por el que recibe las peticiones de conexión, y que pervive mientras el servidor esté en pie. – Un “connected socket” por cada conexión que es aceptada, y que desaparece cuando la correspondiente conexión se cierra. ___________________________________ ___________________________________ ___________________________________ ___________________________________ ___________________________________ ___________________________________ • Si no hay conexiones establecidas, accept() queda a la espera del establecimiento de alguna (bloqueo). Departamento Arquitectura Computadores © J.C. Cruellas Grupo de Aplicaciones Telemáticas UPC Juan Carlos Cruellas Ibarz 4 Sistemas de Transportes de Datos (STD) Tema III: UDP y TCP (Entrega 4) ___________________________________ Operaciones • Envío de datos a la aplicación remota. size_t write (int sockfd, const char *buffer, size_t length); buffer: dirección del buffer con los datos a enviar. length: número de bytes a enviar. Valor devuelto: código de error. • Operación send: argumento para flags (datos urgentes, pe) Departamento Arquitectura Computadores © J.C. Cruellas ___________________________________ ___________________________________ ___________________________________ ___________________________________ ___________________________________ ___________________________________ Grupo de Aplicaciones Telemáticas UPC ___________________________________ Operaciones • Recepción de datos a través de un socket. size_t read (int sockfd, const char *buffer, size_t num); buffer: dirección del buffer donde depositar los datos recibidos. num: número de bytes a leer. Valor devuelto: código de error. • Operación bloqueante: no devuelve valor hasta que lee datos. La aplicación normalmente detiene su trabajo a la espera de que read() devuelva algún valor. Departamento Arquitectura Computadores UPC © J.C. Cruellas ___________________________________ ___________________________________ ___________________________________ ___________________________________ ___________________________________ ___________________________________ Grupo de Aplicaciones Telemáticas ___________________________________ Operaciones • Finalización de una conexión. Int close(int sockfd); • El descriptor no se utilizará más en esta conexión. • El módulo TCP intenta enviar todos los datos que todavía no ha enviado. • Cuando lo ha hecho, inicia el intercambio de segmentos para finalizar la conexión. Departamento Arquitectura Computadores © J.C. Cruellas ___________________________________ ___________________________________ ___________________________________ ___________________________________ ___________________________________ ___________________________________ Grupo de Aplicaciones Telemáticas UPC Juan Carlos Cruellas Ibarz 5 Sistemas de Transportes de Datos (STD) Tema III: UDP y TCP (Entrega 4) ___________________________________ Secuenciamiento de invocaciones Aplicación Servidor ___________________________________ ___________________________________ socket() ___________________________________ bind() -a puerto conocido- ___________________________________ listen() Aplicación Cliente ___________________________________ socket() accept() ___________________________________ Establecimiento conexión -3WH- connect() Datos Bloqueo hasta conexión con cliente read() write() Procesado Datos read() write() EOF close() Departamento Arquitectura Computadores read() close() Grupo de Aplicaciones Telemáticas © J.C. Cruellas UPC ___________________________________ ___________________________________ ack CLOSED close LAST_ACK ___________________________________ ___________________________________ ___________________________________ ___________________________________ TIME_WAIT ___________________________________ FIIN_WAIT 2 CLOSE_WAIT ack FIN Close (act.) FIN_WAIT 1 Retorno read Read devuelve 0 Retorno de read <serv. Procesa> write read -espera ret- Retorno accept read -espera ret- ESTABLISHED write read -espera ret- Data (r equ est) ESTABLISHED Retorno Connect SYN SYN_SENT Socket, connect -espera ret- FIN © J.C. Cruellas ack Departamento Arquitectura Computadores UPC ply) Data (re ack N, SY ack SYN_RCVD Socket,bind, listen LISTEN Accept -espera ret- Invocaciones, devoluciones y estados Grupo de Aplicaciones Telemáticas ___________________________________ Servidores concurrentes 1. Cliente conecta con servidor desde puerto 1300 a dirección de protocolo 205.63.23.31.21 (*.21,*.*): Espera conexión por puerto 21 en cualquier interfaz (*.21) desde cualquier @IP y cualquier puerto (*.*) 205.63.223.31 2.Servidor crea un proceso hijo 1 servidor (fork) copia de él mismo, para Pet. conexión conexión con el cliente {*.21,*.*} “listening socket” cliente n ió 3.Cliente y servidor intercamx 2 ne bian información a través de la puerto 1300 co 3 t. conexión formada por los Pe servidor dos sockets en los extremos 4 Connected socket cliente 4. Otro proceso cliente en Con :{205.63.223.31.21,197.67.8.1.1300} 197.67.8.1 pide conexión a puerto 1301 través de otro puerto efímero 6 5 1301 197.67.8.1 ___________________________________ ___________________________________ ___________________________________ ___________________________________ ___________________________________ ___________________________________ servidor Connected socket 5. Servidor crea otro proceso hijo (connected socket) para Con: {205.63.223.31.21,197.67.8.1.1301} Departamento Arquitectura Computadores © J.C. Cruellas la nueva conexión 6. Intercambio en nueva conexión Grupo de Aplicaciones Telemáticas UPC Juan Carlos Cruellas Ibarz 6 Sistemas de Transportes de Datos (STD) Tema III: UDP y TCP (Entrega 4) ___________________________________ Servidores concurrentes y sockets Servidor: ha hecho socket(), connect(),bind(),listen() -descriptor: listenfd-,y accept():éste NO hace return porque no hay conexión de cliente: espera que lo haga. {*.21,*.*} servidor listenfd “listening socket” . 1 P. C cliente connfd 5 2 connect() Co 3 fork() ne 4 xió n Cliente: Inicialmente ha invocado socket(). servidor listenfd connfd Departamento Arquitectura Computadores 1. Cliente conecta con servidor invocando a connect() 2.Función accept() devuelve un valor. El kernel ha generado un nuevo socket connfd -connected socket3.Servidor hace un fork y crea un hijo copia de sí mismo 4.La conexión queda establecida entre el cliente y el connfd del hijo. ___________________________________ ___________________________________ ___________________________________ ___________________________________ ___________________________________ ___________________________________ 5 5. Padre cierra su“connfd” y el Connected socket hijo cierra su “listenfd” 6. El padre queda con su socket de escucha y el hijo con su socket conectado. Otra petición de conexión volverá a desencadenar un proceso similar. © J.C. Cruellas Grupo de Aplicaciones Telemáticas UPC ___________________________________ Supervisión de conexiones: netstat • Aplicación netstat: informa de estado de diversos aspectos del soft de red y el estado actual de las comunicaciones. • Opción -ni: información de los interfaces de red (lo, eth0, etc) • Opción -rn: información de tabla de encaminamiento (idéntico a comando route). • -a -f inet: estado de las conexiones en curso. Tabla: Proto Recv-Q Send-Q Loc. Add. For. Add. State Departamento Arquitectura Computadores UPC © J.C. Cruellas ___________________________________ ___________________________________ ___________________________________ ___________________________________ ___________________________________ ___________________________________ Grupo de Aplicaciones Telemáticas ___________________________________ Supervisión de conexiones: netstat • Columna de protocolo: TCP, UDP, etc. • Columna de estado: estado del kernel. • Columnas Loc. Add. y For. Add. hacen referencia a direcciones de protoclo (@IP.numero de puerto) local y remota. Alguna notación: – En un servidor: Loc. Add. *.21 en estado LISTEN indica que escucha por todos los interfaces de red (@IP=*) máquina multihomed), pero por el puerto 21. – En un servidor: For. Add. *.* en estado LISTEN indica que espera conexiones desde cualquier @IP y desde cualquier puerto. Departamento Arquitectura Computadores © J.C. Cruellas ___________________________________ ___________________________________ ___________________________________ ___________________________________ ___________________________________ ___________________________________ Grupo de Aplicaciones Telemáticas UPC Juan Carlos Cruellas Ibarz 7 Sistemas de Transportes de Datos (STD) Tema III: UDP y TCP (Entrega 4) ___________________________________ Supervisión de conexiones: netstat – En servidor: Loc Add. @IP.puerto, For Add @IP’.p’ y estado ESTABLISHED: se ha establecido una conexión entre el servidor, a través de su @IP, con un cliente con @IP’ y a través del puerto remoto p’. ___________________________________ ___________________________________ ___________________________________ ___________________________________ ___________________________________ ___________________________________ Departamento Arquitectura Computadores © J.C. Cruellas Grupo de Aplicaciones Telemáticas UPC Juan Carlos Cruellas Ibarz 8