Professional Documents
Culture Documents
:: Redes ::
aplicacin
Redes : : Transporte
fsica
Contenidos
Introduccin Protocolo de Datagramas de Usuario (UDP) Protocolo de Control de Transporte (TCP) Sockets BSD Servidores y Clientes para el servicio UPPER
Redes : : Transporte
Introduccin
La capa de transporte es el corazn de toda la jerarqua de protocolos. Es la que realmente ofrece servicios de valor a los usuarios y aplicaciones.
Redes : : Transporte
capas superiores
Usuario del servicio de transporte
Introduccin
La capa de transporte se encarga de proveer:
Comunicaciones entre procesos. Mecanismos de control de flujo. Mecanismos de control de errores. Establecimiento de conexiones
Redes : : Transporte
Redes : : Transporte
Nota
Una aplicacin puede enviar paquetes de datos, incorporando una direccin destino en cada paquete. La aplicacin receptora los recibir como entidades separadas, de modo que la informacin debe manejarse mensaje por mensaje. Este servicio resulta adecuado para aplicaciones que deben manejar muchos mensajes pequeos y de tamao acotado.
Redes : : Transporte
No garantiza la entrega de mensajes No garantiza el orden ni evita la duplicidad de mensajes. El protocolo realiza una multiplexacin del trfico IP para que pueda ser manejado por varias aplicaciones concurrentes. Tambin hace un control de errores bsico. El direccionamiento de procesos, en un mismo host, se realiza por medio de un identificador de 16 bits llamado puerto UDP.
Redes : : Transporte
UDP :: Cabecera
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
Si se indica el puerto fuente es para que el receptor pueda responder a la aplicacin emisora, si lo necesita.
Redes : : Transporte
El cksum IP slo afecta a la cabecera IP. Si se quiere confiabilidad sobre los datos debe usarse el cksum UDP.
Se ofrece a la aplicacin el interfaz de una conexin establecida extremo a extremo. Las aplicaciones disponen de uno a varios circuitos virtuales en los que la informacin transmitida se maneja como un
Lo suelen utilizar aplicaciones que necesitan intercambio de datos de tamaos indeterminados, sin tener que preocuparse de subdividirlos en mensajes.
Redes : : Transporte
Es un protocolo que ofrece un servicio orientado a conexin. Garantiza la integridad del flujo de datos. Se encarga, de forma transparente, de control de flujo y congestin, prdida, repeticin y orden de paquetes, etc. Se encarga de la multiplexacin del trfico IP para que pueda ser manejado por varios aplicaciones concurrentes El direccionamiento de procesos se realiza por medio de un identificador de 16 bits llamado puerto TCP.
Redes : : Transporte
10
TCP
Las conexiones TCP son full duplex y punto a punto. TCP no soporta multicast ni difusin. Cada dato de la carga de un segmento TCP tiene su propio n de secuencia de 32 bits. Utiliza un sistema de control de flujo de ventana deslizante
11
TCP :: Cabecera
1 2 3 0 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
checksum opciones
acuse de recibo: Si ACK est activo, indica el nmero de secuencia del siguiente byte que espera recibir.
12
TCP :: Cabecera
offset: tamao de la cabecera TCP (en palabras de 4 bytes). Indica donde comienzan la carga del segmento. URG: activa el puntero urgente ACK: activa el acuse de recibo PSH: indica que los datos entregarse inmediatamente. RST: sirve para rechazar un intento de conexin o resetear una conexin activa. SYN: Se usa para el establecimiento de conexiones. Junto al bit ACK sirve para el inicio de conexin de 3 vas. FIN: se utiliza para finalizar conexiones. Puede ser unidireccional o bidireccional. ventana: Se usan en los segmentos ACK, indica cuantos bytes est dispuesto a aceptar el receptor.
Redes : : Transporte
13
TCP :: Opciones
1. Fin de opciones 2. Nop 3. Tamao mximo de segmento. Indicado por el receptor durante la conexin. Se conoce como MSS (Maximum Segment Size) 4. Escala de ventana. Indica que se va a usar una ventana de 32 bits en lugar de 16. Se negocia en la conexin 5. SACK permitido. Reconocimiento selectivo activado 6. SACK. Reconocimiento de segmentos concretos 7. Marca de tiempo.
Redes : : Transporte
14
Redes : : Transporte
15
Nota
Los datos no se envan byte a Los datos no se envan byte a byte sino en grupos llamados byte sino en grupos llamados segmentos, que pueden ser segmentos, que pueden ser de tamao arbitrario de tamao arbitrario
Redes : : Transporte
buffer de recepcin
proceso receptor
16
Cada extremo utiliza una numeracin independiente. El primer nmero de secuencia es aleatorio, no tiene porqu ser 0. Estos nmeros de secuencia se utilizan en los mecanismos de control de flujo y errores.
Redes : : Transporte
17
18
Su tamao indica cuntos bytes caben todava en el buffer de recepcin. Puede cambiar durante la conexin.
Ventana de envo:
Indica qu bytes del buffer de envo se pueden enviar en cada momento sin tener que esperar una confirmacin. Nota
Redes : : Transporte
proceso emisor
buffer de envo 27 26 25 24 23 ventana de envo 22 21 20
La ventana de envo no La ventana de envo no debe ser mayor que la debe ser mayor que la de recepcin de recepcin
19
proceso emisor
Redes : : Transporte
buffer de envo 29 28 27 26 25
ventana de envo 24 23 22
20
proceso emisor
Redes : : Transporte
buffer de envo 31 30 29 28 27
ventana de envo 26 25 24
21
proceso emisor
Redes : : Transporte
buffer de envo 35 34 33 32 31
ventana de envo 30 29 28
22
proceso emisor
Redes : : Transporte
buffer de envo 35 34 33 29 32 31 30 29 28
23
Cuando el receptor cierra la ventana, debe esperar a tener una cantidad considerable de espacio antes de volver a abrirla. El emisor debe esperar a tener una cantidad adecuada de datos (clumping) antes de enviar un nuevo segmento.
Redes : : Transporte
24
Redes : : Transporte
25
manteniendo el orden de los datos sin errores sin partes ausentes o duplicadas corruptos fuera de orden perdidos duplicados
Redes : : Transporte
Tambin incluye los mecanismos de correccin una vez detectados estos errores.
David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/
26
Si es correcto, enva al emisor un acuse de recibo. Si es incorrecto, descarta el segmento. Si no llega un acuse de recibo antes de que el temporizador expire, se reenva el segmento correspondiente
Redes : : Transporte
27
timer
timer
timer
timeout
Redes : : Transporte
timer
retransmis in
0 ack: 18
28
timer
timer
timer
01 ack: 18
Redes : : Transporte
29
timer
1 2
timer
timer
01 ack: 18
timeout
Redes : : Transporte
timer
retransmis in
descartar
0 ack: 18
30
timer
timer
timer
Redes : : Transporte
0 ack: 18
31
TCP :: Temporizadores
TCP utiliza 4 temporizadores: Retransmisin Persistencia Keep alive Fin de conexin
Redes : : Transporte
32
Redes : : Transporte
33
34
Redes : : Transporte
35
Redes : : Transporte
36
Redes : : Transporte
37
En el arranque, el tamao de la ventana de congestin es MSS Por cada segmento reconocido se incrementa el tamao de la ventana de congestin en MSS bytes Esto ocurre hasta que el tamao de la ventana de congestin alcanza la mitad del tamao mximo de la ventana.
Aumento aditivo:
Una vez alcanzado el umbral anterior, la ventana de congestin aumenta en MSS por cada acuse recibido, aunque el acuse corresponda a varios segmentos. Este crecimiento contina hasta que el tamao de la ventana de congestin alcance el umbral, cuyo valor es igual a la ventana de recepcin. Nota
Todo lo anterior slo es aplicable si los acuses de recibo llegan Todo lo anterior slo es aplicable si los acuses de recibo llegan antes de que expiren los temporizadores correspondientes antes de que expiren los temporizadores correspondientes
Redes : : Transporte
38
Se aplica cuando expira un temporizador de retransmisin, aunque ello ocurra durante el proceso de arranque lento o el aumento aditivo. Consiste en situar el umbral a la mitad de la ventana de congestin anterior y comenzar de nuevo con un arranque lento.
timeout
umbral
umbral
Redes : : Transporte
segmentos
39
SYN
1. El cliente indica su ISN (Initial Sequence Number) y otros parmetros de conexin como el MSS 2. El servidor confirma, indica su ISN y otros datos de conexin 3. El cliente confirma y puede enviar datos en ese segmento
, a ck : 1 q: 4800 se
201
Redes : : Transporte
seq: 1201 ,a
ACK
ck: 4801
40
TCP :: desconexin
Cualquiera de los extremos puede indicar al otro que ya no desea enviar ms datos en esa conexin. Cuadruple apretn de manos:
A
seq: 2500 , a ck : 0 0 , a ck se q : 7 0 0 1 , a ck se q : 7 0
CK FIN + A ACK
B
FIN
1. A indica a B que ya no le va a enviar ms datos, pero seguir recibiendo. 2. B confirma que la comunicacin A->B queda cerrada. B puede seguir enviando. 3. Cuando B termine indica a A que ya no le va a enviar ms datos. 4. A confirma la peticin de B
41
: 2501 : 2501
Redes : : Transporte
seq: 2501 ,a
ACK
ck: 7002
TCP :: Conexin/Desconexin
Redes : : Transporte
+---------+ ---------\ active OPEN | CLOSED | \ ----------+---------+<---------\ \ create TCB | ^ \ \ snd SYN passive OPEN | | CLOSE \ \ ------------ | | ---------\ \ create TCB | | delete TCB \ \ V | \ \ +---------+ CLOSE | \ | LISTEN | ---------- | | +---------+ delete TCB | | rcv SYN | | SEND | | ----------| | ------| V +---------+ snd SYN,ACK / \ snd SYN +---------+ | |<---------------------------------->| | | SYN | rcv SYN | SYN | | RCVD |<-----------------------------------------------| SENT | | | snd ACK | | | |------------------------------------| | +---------+ rcv ACK of SYN \ / rcv SYN,ACK +---------+ | -------------| | ----------| x | | snd ACK | V V | CLOSE +---------+ | ------| ESTAB | | snd FIN +---------+ | CLOSE | | rcv FIN V ------| | ------+---------+ snd FIN / \ snd ACK +---------+ | FIN |<---------------------------------->| CLOSE | | WAIT-1 |-----------------| WAIT | +---------+ rcv FIN \ +---------+ | rcv ACK of FIN ------| CLOSE | | -------------snd ACK | ------- | V x V snd FIN V +---------+ +---------+ +---------+ |FINWAIT-2| | CLOSING | | LAST-ACK| +---------+ +---------+ +---------+ | rcv ACK of FIN | rcv ACK of FIN | | rcv FIN -------------- | Timeout=2MSL -------------- | | ------x V -----------x V \ snd ACK +---------+delete TCB +---------+ ------------------------>|TIME WAIT|------------------>| CLOSED | +---------+ +---------+
42
Redes : : Transporte
rea de datos IP
terminador de la trama
43
44
Sockets :: Tipos
A parte de los sockets STREAM y DGRAM es habitual disponer de otros tipos de sockets como RAW o UNIX Los sockets RAW suelen requerir privilegios especiales.
Aplicacin Aplicacin
Stream sockets Datagram sockets raw sockets
TCP TCP
UDP UDP IP IP
Redes : : Transporte
45
htons() - host to network short (16 bits) htonl() - host to network long (32 bits) ntohs() - network to host short ntohl() - networt to host long
Redes : : Transporte
46
inet_aton() - Direccin en ASCII a formato binario inet_ntoa() - de formato binario a direccin en ASCII
Redes : : Transporte
47
Sockets
EL API de sockets BSD al igual que todas las llamadas al sistema Unix estn implementadas como funciones C. Por simplicidad, pero sin perdida de generalidad, nosotros veremos la librera de sockets de Python, que no es ms que un wrapper de las llamadas al sistema C
Redes : : Transporte
48
Clase Socket
En Python los sockets son objetos, cuyo constructor es: socket(familia, tipo, [proto])
familia: AF_INET, AF_INET6, AF_UNIX, AF_PACKET,etc tipo: SOCK_STREAM, SOCK_DGRAM, SOCK_RAW proto: En caso de que el tipo dado permita varios protocolos.
En el caso de IPv4 se utiliza AF_INET con SOCK_DGRAM para UDP y SOCK_STREAM para TCP.
Redes : : Transporte
SOCK_RAW permite construir paquetes directamente sobre el nivel de enlace o tramas sobre el nivel fsico.
49
Clase Socket
bind(address) - Vincula el socket a una direccin.
address: El formato depende de la familia de socket. En el caso de AF_INET es una tupla (host, puerto).
connect(address)
Si se utiliza STREAM conecta el socket local al socket remoto que est en la direccin indicada. Si se utiliza DGRAM indica cual es el destino y origen por defecto de los datagramas.
listen(backlog)
backlog Indica cuantos clientes como mximo quedarn a la espera. Las dems conexiones sern rechazadas. Slo tiene sentido en STREAM
Redes : : Transporte
50
Clase Socket
accept() - Acepta una nueva conexin. Slo STREAM.
Devuelve una tupla (conn, address):
conn: Es un socket recin creado para materializar la conexin con el cliente remoto. address: La direccin del otro extremo de la conexin (el cliente)
send(data, [flags]) - Enva data al socket remoto. Si es un recv(size, [flags]) - size es la cantidad de bytes que se
desean leer. Devuelve los datos recibidos.
Redes : : Transporte
socket DGRAM enva a la direccin indicada en el connect(). Devuelve la cantidad de bytes recibidos.
51
Clase Socket
sendto(data, [flags], address) - Enva data al socket
indicado en address. Slo se puede utilizar con sockets DGRAM. desean leer. Devuelve una tupla (data, address):
52
fileno() retorna el descriptor entero de fichero asociado al socket. makefile() retorna un objeto de clase fichero asociado al socket.
El paquete socket tambin dispone de la funcin fromfd() que permite obtener un objeto socket a partir de un manejador de fichero
Redes : : Transporte
53
socket() bind()
socket()
recvfrom()
close()
54
Cliente UDP
Listado Completo
#!/usr/bin/python "Usage: %s <server> <port>" from sys import argv, exit from socket import * if len(argv) != 3: print __doc__ % argv[0] exit(1)
Redes : : Transporte
sock.sendto(data, (argv[1], int(argv[2]))) msg, server = sock.recvfrom(1024) print "La respuesta es '%s'" % msg sock.close()
55
Redes : : Transporte
56
Listado Completo
if len(argv) != 2: print __doc__ % argv[0] exit(1) sock= socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.bind(('', int(argv[1]))) n = 0 children = [] while 1: msg, client = sock.recvfrom(1024) n += 1 collect_children(children) pid = os.fork() if pid: children.append(pid) else: handle(sock, msg, client, n) exit()
Redes : : Transporte
57
if len(argv) != 2: print __doc__ % argv[0] exit(1) sock = socket(AF_INET, SOCK_DGRAM) sock.bind(('', int(argv[1]))) lock = threading.Lock() n = 0 while 1: msg, client = sock.recvfrom(1024) n += 1 thread.start_new_thread(handle, (sock, msg, client, n))
Redes : : Transporte
58
Redes : : Transporte
59
Listado Completo
#!/usr/bin/python "Usage: %s <port>" from sys import argv, exit from SocketServer import * import time JOB = 1 class UpperHandler(DatagramRequestHandler): def handle(self): print 'New request:', self.client_address msg = self.rfile.read().upper() time.sleep(JOB) self.wfile.write(msg)
Redes : : Transporte
60
accept()
send()
recv() close()
Redes : : Transporte
send() close()
Cliente TCP
61
Cliente TCP
Listado Completo
#!/usr/bin/python "Usage: %s <server> <port>" from sys import argv, exit from socket import * if len(argv) != 3: print __doc__ % argv[0] exit(1)
sock = socket(AF_INET, SOCK_STREAM) sock.connect((argv[1],int(argv[2]))) while 1: data = raw_input() if not data: break # acaba con '' sent = sock.sendall(data) msg = '' while len(msg) < sent: msg += sock.recv(32) print "La respuesta es '%s'" % msg sock.close()
Redes : : Transporte
62
Redes : : Transporte
63
Redes : : Transporte
64
Redes : : Transporte
65
Listado Completo
#!/usr/bin/python "Usage: %s <port>" from sys import argv, exit from socket import * import thread, time JOB = 1 def handle(sock, client, n): print 'Client connected', n, client while 1: data = sock.recv(32) if not data: break time.sleep(JOB) # some job sock.sendall(data.upper()) sock.close()
if len(argv) != 2: print __doc__ % argv[0] exit(1) sock= socket(AF_INET, SOCK_STREAM) sock.bind(('', int(argv[1]))) sock.listen(5) n = 0 while 1: child_sock, client = sock.accept() n += 1 thread.start_new_thread(handle, (child_sock, client, n))
Redes : : Transporte
66
Redes : : Transporte
67
Redes : : Transporte
68
Listado Completo
#!/usr/bin/python "Usage: %s <port>" from sys import argv, exit from SocketServer import * import time JOB = 1 class UpperHandler(StreamRequestHandler): def handle(self): print 'Client connected:', self.client_address while 1: data = sock.recv(32) if not data: break time.sleep(JOB) # some job sock.sendall(data.upper()) self.request.close()
Redes : : Transporte
69
Listado Completo
Redes : : Transporte
70
Listado Completo
from sys import argv, exit from socket import * import asyncore, time JOB = 1
class ChildHandler(asyncore.dispatcher): def __init__(self, sock): asyncore.dispatcher.__init__(self, sock) self.buffer = '' def handle_read(self): self.buffer += self.recv(32) time.sleep(JOB) # some job def writable(self): return (len(self.buffer) > 0) def handle_write(self): sent = self.send(self.buffer.upper()) self.buffer = self.buffer[sent:] def handle_close(self): self.close()
Redes : : Transporte
71
class ParentHandler(asyncore.dispatcher): def __init__(self): asyncore.dispatcher.__init__(self) self.create_socket(AF_INET, SOCK_STREAM) self.set_reuse_addr() self.bind(('', int(argv[1]))) self.listen(5) def handle_accept(self): child_sock, client = self.accept() print 'Client connected', client ChildHandler(child_sock) ParentHandler() asyncore.loop()
Redes : : Transporte
72
Servidor de procesos
Un servidor de procesos (o superservidor) es un programa especial que escucha en muchos puertos a la vez (TCP y UDP) para servicios de uso espordico. Cuando hay una peticin o conexin a alguno de esos puertos, el superservidor instancia un programa concreto para manejar ese servicio. En GNU/Linux se llama inetd y se configura por medio del fichero /etc/inetd.conf
Redes : : Transporte
73
Servidor de procesos
Ejercicio
Utilizando Python estndar, escribe un servidor de procesos que implemente internamente servidores de echo, daytime, time y discard tanto TCP como UDP. Y que pueda utilizar servidores externos estndar de ftp, tftp y telnet.
Redes : : Transporte
74
Referencias
Se recomienda repasar y profundizar el contenido de este tema utilizando (al menos) la siguiente bibliografa bsica: A.S. Redes de computadores. Pearson Educacin, Cuarta edicin, 2003.
CISCO Systems. Inc. Gua del primer ao. CCNA 1 y 2. Cisco Press, 2003.
Redes : : Transporte
Nota
Todos los listados de este tema estn disponibles para descarga en la direccin:
https://arco.esi.uclm.es/svn/public/misc/python_networking/upper/
75