Você está na página 1de 75

Versin 28/02/11

:: Redes ::
aplicacin

transporte red enlace

Redes : : Transporte

fsica

Capa de transporte TCP/IP

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

Contenidos
Introduccin Protocolo de Datagramas de Usuario (UDP) Protocolo de Control de Transporte (TCP) Soc ets !SD Ser"idores # Clientes para el ser"icio UPP$%
Redes : : Transporte

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

Introduccin
La capa de transporte es el cora'n de toda la jerarqu a de protocolos. !s la que realmente ofrece servicios de valor a los usuarios " aplicaciones.
Redes : : Transporte
capas superiores
Usuario del servicio de transporte

transporte red enlace fsica


Pro"eedor del servicio de transporte

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

&

Introduccin
La capa de transporte se encar#a de proveer:

$omunicaciones entre procesos. %ecanismos de control de flu)o. %ecanismos de control de errores. !sta&lecimiento de cone'iones

La capa de transporte en (nternet ofrece dos tipos de servicios a la capa de aplicaci)n:

*o orientados a cone'i)n +con ,D-. /rientados a cone'i)n +con 0$-.

Redes : : Transporte

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

Direccionamiento de procesos ++ puertos


La capa de red se encar#a de la comunicaci)n ,ost a ,ostA mientras que los protocolos de transporte reali1an comunicaci)n proceso a proceso (multiple-acin)
La IP identifica una interfa1 de red de un ,ost. ,n puerto identifica un proceso en la m2quina. !l puerto es un n3mero de 45 &its:

entidades de transporte +procesos.


P1 P2 P& P(

6 7 4.689: :;ien conocidos< 4.68= 7 =>.4?4: @e#istrados =>4?8 7 5?-?9?: Din2micos


La La asi#naci)n asi#naci)n oficial oficial de de puertos puertos est2 est2 disponi&le disponi&le en: en: http://www.iana.org/assignments/port-numbers http://www.iana.org/assignments/port-numbers
*

transporte red enlace fsica

Redes : : Transporte

Nota

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

Ser"icio /0 orientado a cone-in en la capa de transporte

,na aplicaci)n puede enviar paquetes de datosA incorporando una direcci)n destino en cada paquete. La aplicaci)n receptora los reci&ir2 como entidades separadasA de modo que la informaci)n de&e manejarse mensaje por mensaje. !ste servicio resulta adecuado para aplicaciones que de&en manejar muchos mensajes pequeBos " de tamaBo acotado.
Redes : : Transporte

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

UDP (User Datagram Protocol)


!s un protocolo que ofrece un servicio no orientado a cone-in

RFC RFC 768 768

*o #aranti1a la entre#a de mensajes *o #aranti1a el orden ni evita la duplicidad de mensajes. !l protocolo reali1a una multiple-acin del tr2fico (- para que pueda ser manejado por varias aplicaciones concurrentes. 0am&iCn hace un control de errores &2sico. !l direccionamiento de procesosA en un mismo hostA se reali1a por medio de un identificador de 45 &its llamado puerto UDP.

Redes : : Transporte

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

UDP ++ Ca3ecera
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

puerto ,D- ori#en lon#itud del mensaje ,D+completo. +opcional.

puerto ,D- destino checDsum +opcional.

cuerpo del mensaje

Ei se indica el puerto fuente es para que el receptor pueda responder a la aplicaci)n emisoraA si lo necesita.
Redes : : Transporte

!l cDsum (- s)lo afecta a la ca&ecera (-. Ei se quiere confia&ilidad so&re los datos de&e usarse el cDsum ,D-.

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

Ser"icio orientado a cone-in en la capa de transporte

Ee ofrece a la aplicaci)n el interfa1 de una cone-in esta3lecida e-tremo a e-tremo. Las aplicaciones disponen de uno a varios circuitos "irtuales en los que la informaci)n transmitida se maneja como un

flu)o continuo de datos.

Lo suelen utili1ar aplicaciones que necesitan intercam&io de datos de tamaBos indeterminadosA sin tener que preocuparse de su&dividirlos en mensajes.
Redes : : Transporte

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

TCP (Transmission Control Protocol)

RFC RFC 793 793 1122 1122

!s un protocolo que ofrece un servicio orientado a cone-in. Faranti1a la inte#ridad del flujo de datos. Ee encar#aA de forma transparenteA de control de flujo " con#esti)nA pCrdidaA repetici)n " orden de paquetesA etc. Ee encar#a de la multiple-acin del tr2fico (- para que pueda ser manejado por varios aplicaciones concurrentes !l direccionamiento de procesos se reali1a por medio de un identificador de 45 &its llamado puerto TCP.
Redes : : Transporte

La unidad de datos se denomina: segmento

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

15

TCP
Las cone'iones 0$- son full duplex " punto a punto. 0$- no soporta multicast ni difusi)n. $ada dato de la car#a de un se#mento 0$- tiene su propio nG de secuencia de 98 &its. ,tili1a un sistema de control de flujo de ventana desli1ante

Los mecanismos de confirmaci)n de recepci)n " del control de la ventana son independientes.

La tasa de salida se controla mediante la ventana con#esti)nA la ventana de recepci)n " el um&ral.
Redes : : Transporte

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

11

TCP ++ Ca3ecera
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

puerto 0$- ori#en

puerto 0$- destino

n3mero de secuencia n3mero de acuse de reci&o


offset reservado
,@F H$I -EJ @E0 EK* L(*

ventana puntero ur#ente relleno

checDsum opciones

cuerpo del mensaje

n6mero de secuencia+ !l n3mero de secuencia del primer &"te del se#mento. Ei


Redes : : Transporte
EK* est2 activoA indica el n3mero de secuencia inicial +n.. K el primer &"te ser2 nM4

acuse de reci3o+ Ei H$I est2 activoA indica el n3mero de secuencia del si#uiente &"te que espera reci&ir.

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

12

TCP ++ Ca3ecera
offset+ tamaBo de la ca&ecera 0$- +en pala&ras de = &"tes.. (ndica donde comien1an la car#a del se#mento. U%7+ activa el puntero ur#ente 8C9+ activa el acuse de reci&o PS:+ indica que los datos entre#arse inmediatamente. %ST+ sirve para recha1ar un intento de cone'i)n o resetear una cone'i)n activa. S;/+ Ee usa para el esta&lecimiento de cone'iones. Nunto al &it H$I sirve para el inicio de conexin de 3 vas. <I/+ se utili1a para finali1ar cone'iones. -uede ser unidireccional o &idireccional. "entana+ Ee usan en los se#mentos H$IA indica cuantos &"tes est2 dispuesto a aceptar el receptor.

Redes : : Transporte

puntero urgente+ Ei ,@F est2 activoA es el puntero al primer &"te ur#ente

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

1&

TCP ++ 0pciones
1= <in de opciones 2= /op &= Tama>o m?-imo de segmento= (ndicado por el receptor durante la cone'i)n. Ee conoce como %EE (Maximum Segment Size) (= $scala de "entana= (ndica que se va a usar una ventana de 98 &its en lu#ar de 45. Ee ne#ocia en la cone'i)n *= S8C9 permitido= @econocimiento selectivo activado .= S8C9= @econocimiento de se#mentos concretos 1= @arca de tiempo=
Redes : : Transporte

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

1(

TCP ++ Ser"icio orientado a flu)o


!n una cone'i)n 0$- los datos no se a#rupan en unidades independientes como en ,D-. !n 0$- el proceso emisor produce el flujo de &"tes " el receptor lo consume.

Redes : : Transporte

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

1*

TCP ++ !uffers de en"o # recepcin


Dado que el emisor no emite datos a la misma velocidad que el receptor los consume es necesario utili1ar :&uffers<.
proceso emisor
&uffer de env o

Nota

Los Los datos datos no no se se env env an an &"te &"te a a &"te &"te sino sino en en #rupos #rupos llamados llamados segmentos segmentosAA que que pueden pueden ser ser de de tamaBo tamaBo ar&itrario ar&itrario

Redes : : Transporte

vac o por enviar enviadoA no confirmado reci&idoA no procesado


David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

&uffer de recepci)n

proceso receptor
1.

TCP ++ /umeracin de 3#tes


Los n3meros de secuencia de 0$- identifican cada &"te de la cone'i)n. 0$- no numera los se#mentos.

sequence num&er acDnowled#ement num&er

$ada e'tremo utili1a una numeraci)n independiente. !l primer n3mero de secuencia es aleatorioA no tiene porquC ser 6. !stos n3meros de secuencia se utili1an en los mecanismos de control de flujo " errores.
Redes : : Transporte

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

11

TCP ++ /umeracin de 3#tes


/6meros de secuencia+ !l valor de este campo de la ca&ecera 0$- corresponde al primer 3#te de la car#a del se#mento. /6meros de acuse de reci3o (reconocimiento)+ !l valor del campo 0$- indica cual es el n3mero de secuencia del siguiente 3#te que este e'tremo espera reci&ir.
Redes : : Transporte

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

12

TCP ++ Control de flu)o


0$- utili1a un protocolo de ventana desli1ante. Ventana de recepci)n:

Eu tamaBo indica cu2ntos &"tes ca&en todav a en el &uffer de recepci)n. -uede cam&iar durante la cone'i)n.

Ventana de env o:

(ndica AuB 3#tes del &uffer de env o se pueden enviar en cada momento sin tener que esperar una confirmaci)n. Nota

Redes : : Transporte

proceso emisor
&uffer de env o 8O 85 8? 8= 89 "entana de en"o 88 84 86

La La ventana ventana de de env env o o no no de&e de&e ser ser ma"or ma"or que que la la de de recepci)n recepci)n

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

14

TCP ++ Deslizamiento de la "entana


-artiendo del estado anteriorA se reci&e un se#mento con los si#uientes datos:

acuse de reci&o: 88 tamaBo de ventana: 5

!l &uffer de env o queda:

proceso emisor

Redes : : Transporte

&uffer de env o 8> 8P 8O 85 8?

"entana de en"o 8= 89 88

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

25

TCP ++ 8umento de la "entana


-artiendo del estado anteriorA el emisor env a 9 &"tes Q89-8?R " reci&e un se#mento con los si#uientes datos:

acuse de reci&o: 8= tamaBo de ventana: P

!l &uffer de env o queda:

proceso emisor

Redes : : Transporte

&uffer de env o 94 96 8> 8P 8O

"entana de en"o 85 8? 8=

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

21

TCP ++ %educcin de la "entana


-artiendo del estado anteriorA el emisor env a 8 &"tes Q85-8OR " reci&e un se#mento con los si#uientes datos:

acuse de reci&o: 8P tamaBo de ventana: ?

!l &uffer de env o queda:

proceso emisor

Redes : : Transporte

&uffer de env o 9? 9= 99 98 94

"entana de en"o 96 8> 8P

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

22

TCP ++ Cierre de la "entana


Ee produce cuando el receptor no est2 dispuesto a aceptar nada de tr2fico. Ee reci&e un se#mento con los si#uientes datos:

acuse de reci&o: 8P tamaBo de ventana: 6

!l &uffer de env o queda:

proceso emisor

"entana de en"o cerrada

Redes : : Transporte

&uffer de env o 9? 9= 8> 99 98 94 96 8> 8P

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

2&

TCP ++ Sndrome de la ventana tonta


/curre cuando cada acuse de reci3o anuncia una pequeBa cantidad de espacio disponi&le " por tanto cada nuevo segmento es peAue>oA desperdiciando recursos en la red " en los hosts. -revenci)n:

RFC RFC 896 896

$uando el receptor cierra la ventanaA de&e esperar a tener una cantidad considera&le de espacio antes de volver a a&rirla. !l emisor de&e CesperarD a tener una cantidad adecuada de datos +clumpin#. antes de enviar un nuevo se#mento.

Redes : : Transporte

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

2(

TCP ++ Sndrome de la ventana tonta


8lgoritmo de /agle
Si se generan nuevos datos pero no se han reconocido los anteriores, los nuevos se almacenan en el buffer de salida hasta que alcancen el MSS !uando llegue un acuse de recibo se puede enviar el contenido del buffer
if hay nuevos datos para enviar: if el tamao de ventana y los datos disponibles >= MSS: enviar un segmento completo de tamao de MSS ahora else: if hay datos sin confirmar en espera: encolar los datos en el buffer hasta recibir un else: enviar los datos ahora

Redes : : Transporte

!"

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

2*

TCP ++ Control de errores


0$- #aranti1a la entre#a de todo el flujo de datos:

manteniendo el orden de los datos sin errores sin partes ausentes o duplicadas corruptos fuera de orden perdidos duplicados

!l control de errores inclu"e detecci)n de se#mentos:


Redes : : Transporte

0am&iCn inclu"e los mecanismos de correcci)n una ve1 detectados estos errores.
David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

2.

TCP ++ Control de errores


!l receptor de un se#mento comprue&a el c,ec sum:

Ei es correctoA env a al emisor un acuse de reci3o. Ei es incorrectoA descarta el se#mento. Ei no lle#a un acuse de reci&o antes de que el tempori1ador e-pireA se reen"a el se#mento correspondiente

!l emisor inicia un tempori'ador al enviar cada se#mento

Redes : : Transporte

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

21

segmento corrupto o perdido


emisor receptor

TCP ++ Control de errores

timer

seq: 4864 A 866; seq: 4=64 A 866; seq: 4564 A 866;


51 ac + 1.

timer

timer

se#mento corrupto o perdido

timeout

Redes : : Transporte

timer

seq: 4564 A 866;

retransmis i)n

51 ac + 12

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

22

acuse de reci3o corrupto o perdido


emisor receptor

TCP ++ Control de errores

timer

seq: 4864 A 866; seq: 4=64 A 866; seq: 4564 A 866;


51 ac + 1. 51 ac + 12

timer

Redes : : Transporte

timer

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

24

TCP ++ Control de errores


segmento duplicado
emisor receptor

timer

4 8

seq: 4864 A 866; seq: 4=64 A 866; seq: 4564 A 866;


51 ac + 1. 51 ac + 12
acuse perdido o lle#a despuCs del timeout

timer

timer

timeout

Redes : : Transporte

timer

seq: 4564 A 866;

retransmis i)n

descartar

51 ac + 12

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

&5

TCP ++ Control de errores


segmento fuera de orden
emisor receptor

timer

seq: 4864 A 866; seq: 4=64 A 866; seq: 4564 A 866;


51 ac + 1(

timer

timer

Redes : : Transporte

51 ac + 12

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

&1

TCP ++ Tempori'adores
0$- utili1a = tempori1adores: @etransmisi)n -ersistencia :Ieep alive< Lin de cone'i)n

Redes : : Transporte

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

&2

TCP ++ Tempori'ador de retransmisin


!s el tempori1ador utili1ado para retransmitir se#mentos cuando no lle#a el acuse de reci&o correspondiente. !ste tempori1ador es diferente en cada cone'i)n " cam&ia durante una misma cone'i)n. Ee recalcula cada ve1 que se reci&e un acuse de reci&o: 8 ' @00 !l @00 se puede calcular con:

la opci)n :marca de tiempo< enviando un se#mento " midiendo el tiempo hasta el acuse

@00 S ' @00 previo M +4 - . ' @00 actual


Los acuses de reci&o de segmentos retransmitidos no se tienen en cuenta en este c2lculo +Hl#oritmo de Iarn..

Redes : : Transporte

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

&&

TCP ++ Tempori'ador de Persistencia


$uando el emisor reci&e un mensaje de cierre de la "entana queda en espera de un nuevo acuse indicando la apertura. Ei ese acuse se pierdeA los dos e'tremos de la cone'i)n quedan &loqueados. -ara evitar estoA el emisor inicia un tempori1ador " cuando e'pira env a un segmento especial de prue3a para que el receptor le informe del estado de su ventana. !l valor de este tempori1ador empie1a siendo i#ual al de retransmisi)n pero se duplica cada ve1A hasta un m2'imo de 56s.
Redes : : Transporte

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

&(

TCP ++ Tempori'ador C9eep 8li"eD


!ste tempori1ador se utili1a para evitar que una cone'i)n quede a&ierta indefinidamente. !l servidor inicia el tempori1ador con un valor de 8 horas. $ada ve1 que reci&e un se#mento del clienteA reinicia el tempori1ador Ei el tempori1ador e'piraA el servidor env a una prue&a al cliente. Ei despuCs de 46 prue&as enviadas cada O? sA el cliente no contestaA el servidor cierra la cone'i)n.

Redes : : Transporte

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

&*

TCP ++ Tempori'ador de fin de cone-in


$uando se cierra una cone'i)nA Csta queda en un estado de :lim&o< durante un periodo de tiempo dado por este tempori1ador. Eu valor es normalmente el do&le del tiempo de vida de un se#mento. $uando el tempori1ador e'pira se finali1a realmente la cone'i)n " se recicla el puerto asi#nado.

Redes : : Transporte

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

&.

TCP ++ Control de congestin


Ei la red descarta paquetes porque est2 con#estionada " los emisores retransmiten esos paquetesA la con#esti)n se a#ravar2 a3n m2s. 0$- asume que la perdida de paquetes est2 causada siempre por la con#esti)n. De modo que el tamaBo de la ventana de emisi)n est2 dado por:

!l tamaBo de ventana permitido por el receptor. !l tamaBo de la "entana de congestin.

Redes : : Transporte

ventana de envo = mnimo (ventana del receptor, ventana de congestin)

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

&1

TCP ++ Pre"encin de la congestin


8rranAue lento:

!n el arranqueA el tamaBo de la ventana de con#esti)n es %EE -or cada segmento reconocido se incrementa el tamaBo de la ventana de con#esti)n en %EE &"tes !sto ocurre hasta que el tamaBo de la ventana de con#esti)n alcan1a la mitad del tamaBo m2'imo de la ventana.

8umento aditi"o+

,na ve1 alcan1ado el um&ral anteriorA la ventana de con#esti)n aumenta en %EE por cada acuse reci3idoA aunque el acuse corresponda a varios se#mentos. !ste crecimiento contin3a hasta que el tamaBo de la ventana de con#esti)n alcance el um3ralA cu"o valor es i#ual a la ventana de recepci)n. Nota
0odo 0odo lo lo anterior anterior slo slo es es aplica&le aplica&le si si los los acuses acuses de de reci&o reci&o lle#an lle#an antes antes de de que que e'piren e'piren los los tempori1adores tempori1adores correspondientes correspondientes

Redes : : Transporte

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

&2

TCP ++ Pre"encin de la congestin


Disminucin multiplicati"a:

Ee aplica cuando e'pira un tempori1ador de retransmisi)nA aunque ello ocurra durante el proceso de arranAue lento o el aumento aditi"o. $onsiste en situar el um3ral a la mitad de la ventana de con#esti)n anterior " comen1ar de nuevo con un arranAue lento.
timeout

tamaBo de ventana de con#esti)n

um&ral

um&ral

Redes : : Transporte

se#mentos

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

&4

TCP ++ esta3lecimiento de cone-in


$ada e'tremo de&e o&tener permiso del otro e'tremo antes de comen1ar la transmisi)n de datos. ,n e'tremo tiene un rol activo +cliente. " el otro pasivo +servidor.. 0riple :apret)n de manos<:
cliente servidor

seq: 4866 A a cD : H$I EK* M

EK*

4. !l cliente indica su (E* ("nitial Sequence #umber) " otros par2metros de cone'i)n como el %EE 8. !l servidor confirmaA indica su (E* " otros datos de cone'i)n 9. !l cliente confirma " puede enviar datos en ese se#mento

4 6 A a cD : 6 P = : q se

864

Redes : : Transporte

seq: 4864 Aa

H$I

cD: =P64

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

(5

TCP ++ descone-in
$ualquiera de los e'tremos puede indicar al otro que "a no desea enviar m2s datos en esa cone'i)n. $uadruple :apret)n de manos<:

A
seq: 8?66 A a cD : 6 6 A a cD se q : O 6 6 4 A a cD se q : O 6
$I L(* M H H$I

B
L(*

4. H indica a ; que "a no le va a enviar m2s datosA pero se#uir2 reci&iendo. 8. ; confirma que la comunicaci)n H->; queda cerrada. ; puede se#uir enviando. 9. $uando ; termine indica a H que "a no le va a enviar m2s datos. =. H confirma la petici)n de ;
(1

: 8?64 : 8?64

Redes : : Transporte

seq: 8?64 Aa

H$I

cD: O668

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

TCP ++ Cone-in/Descone-in

Redes : : Transporte

+---------+ ---------\ active OPEN | CLOSED | \ ----------+---------+<---------\ \ create C! | " \ \ #$% S&N 'a##ive OPEN | | CLOSE \ \ ------------ | | ---------\ \ create C! | | %e(ete C! \ \ ) | \ \ +---------+ CLOSE | \ | L*S EN | ---------- | | +---------+ %e(ete C! | | rcv S&N | | SEND | | ----------| | ------| ) +---------+ #$% S&N+,C- . \ #$% S&N +---------+ | |<----------------------------------/| | | S&N | rcv S&N | S&N | | 0C)D |<-----------------------------------------------| SEN | | | #$% ,C| | | |------------------------------------| | +---------+ rcv ,C- 12 S&N \ . rcv S&N+,C+---------+ | -------------| | ----------| 3 | | #$% ,C| ) ) | CLOSE +---------+ | ------| ES ,! | | #$% 4*N +---------+ | CLOSE | | rcv 4*N ) ------| | ------+---------+ #$% 4*N . \ #$% ,C+---------+ | 4*N |<----------------------------------/| CLOSE | | 5,* -1 |-----------------| 5,* | +---------+ rcv 4*N \ +---------+ | rcv ,C- 12 4*N ------| CLOSE | | -------------#$% ,C| ------- | ) 3 ) #$% 4*N ) +---------+ +---------+ +---------+ |4*N5,* -2| | CLOS*N6 | | L,S -,C-| +---------+ +---------+ +---------+ | rcv ,C- 12 4*N | rcv ,C- 12 4*N | | rcv 4*N -------------- | i7e18t92:SL -------------- | | ------3 ) -----------3 ) \ #$% ,C+---------+%e(ete C! +---------+ ------------------------/| *:E 5,* |------------------/| CLOSED | +---------+ +---------+

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

(2

Soc ets TCP / UDP


Las aplicaciones que quieran manejar tr2fico de&en utili1ar una direcci)n (- +para direccionar un host. " un puerto +para direccionar un proceso. La tupla +(-A puerto. se denomina soc et. ,na cone'i)n se identifica con un par de socDets: (soc et1E soc et2) Los se#mentos 0$- " ,D- se encapsulan so&re data#ramas (-. La ca&ecera (- indica la (-A la ca&ecera 0$- o ,D- indica el puerto.
Ee#mento 0$- o ,Dca&ecera datos

Redes : : Transporte

ca&ecera (ca&ecera de trama

2rea de datos (-

2rea de datos de la trama

terminador de la trama

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

(&

Programacin con Soc ets !SD


,n socDet es un e'tremo en una cone'i)n de red. Los socDets son el H-( que permite utili1ar los servicios de la capa de transporte. La interfa1 de socDets ori#inal era parte de ,ni' ;EDA por lo que se les suele llamar socDets ;ED. !n los sistemas ,ni' se implementan como llamadas al sistemaA cu"o tratamiento es mu" similar al de los ficheros convencionales.
Redes : : Transporte

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

((

Soc ets ++ Tipos


H parte de los socDets S#$% M " &'$ M es ha&itual disponer de otros tipos de socDets como $ ( o )*+, Los socDets $ ( suelen requerir privile#ios especiales.

Hplicaci)n Hplicaci)n
Etream socDets Data#ram socDets :raw< socDets

0$0$-

,D,D((-

Redes : : Transporte

$apas $apas inferiores inferiores

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

(*

Soc ets ++ 0rdenamiento de 3#tes


Los computadores pueden optar por dos tipos de ordenamiento: &i#-endian +%otorola. o little endian +(ntel. 0am&iCn es una caracter stica de los protocolos de red. Los protocolos de la pila 0$-/(- usan &i#-endian. Ee necesitan funciones para convertir el ordenamiento del computador al de la red.

htons-. - host to networD short +45 &its. htonl-. - host to networD lon# +98 &its. ntohs-. - networD to host short ntohl-. - networt to host lon#

Redes : : Transporte

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

(.

Soc ets ++ Transformacin de direcciones


0am&iCn se dispone de funciones para transformar direcciones (- en su representaci)n HE$(( utili1ando n3meros decimales con puntos

inet/aton-. - Direcci)n en HE$(( a formato &inario inet/ntoa-. - de formato &inario a direcci)n en HE$((

Redes : : Transporte

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

(1

Soc ets
!L H-( de socDets ;ED al i#ual que todas las llamadas al sistema ,ni' est2n implementadas como funciones $. -or simplicidadA pero sin perdida de #eneralidadA nosotros veremos la li&rer a de socDets de -"thonA que no es m2s que un $rapper de las llamadas al sistema $

Redes : : Transporte

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

(2

Clase Soc et
!n -"thon los socDets son o&jetosA cu"o constructor es: soc0et-familia1 tipo1 2proto3.

familia: 4/+*%#1

4/+*%#51

4/)*+,1

4/6 !"%#1etc

tipo: S7!"/S#$% M1 S7!"/&'$ M1 S7!"/$ ( proto: !n caso de que el tipo dado permita varios protocolos.

!n el caso de (-v= se utili1a 4/+*%# con S7!"/&'$ M para ,D- " S7!"/S#$% M para 0$-.
Redes : : Transporte

S7!"/$ ( permite construir paquetes directamente so&re el nivel de enlace o tramas so&re el nivel f sico.

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

(4

Clase Soc et
bind-address. - Vincula el socDet a una direcci)n.

address: !l formato depende de la familia de socDet. !n el caso de HLT(*!0 es una tupla +hostA puerto..

connect-address.
Ei se utili1a E0@!H% conecta el socDet local al socDet remoto que est2 en la direcci)n indicada. Ei se utili1a DF@H% indica cual es el destino " ori#en por defecto de los data#ramas.

listen-bac0log.
bac0log (ndica cuantos clientes como m2'imo quedar2n a la espera. Las dem2s cone'iones ser2n recha1adas. E)lo tiene sentido en S#$% M
Redes : : Transporte

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

*5

Clase Soc et
accept-. - Hcepta una nueva cone'i)n. E)lo E0@!H%.
Devuelve una tupla -conn1 address.:

conn: !s un socDet reciCn creado para materiali1ar la cone'i)n con el cliente remoto. address: La direcci)n del otro e'tremo de la cone'i)n +el cliente.

send-data1 2flags3. - !nv a data al socDet remoto. Ei es un recv-si8e1 2flags3. - si8e es la cantidad de &"tes que se
desean leer. Devuelve los datos reci&idos.
Redes : : Transporte

socDet &'$ M env a a la direcci)n indicada en el connect-.. Devuelve la cantidad de &"tes reci&idos.

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

*1

Clase Soc et
sendto-data1 2flags31 address. - !nv a data al socDet
indicado en address. E)lo se puede utili1ar con socDets &'$ M. desean leer. Devuelve una tupla -data1 address.:

recvfrom-si8e1 2flags3. - si8e es la cantidad de &"tes que se


data: Eon los datos reci&idos address: !s la direcci)n del socDet que ha enviado el data#rama

E)lo tiene sentido para socDets &'$ M.

shutdown-how. 9 -ermite cerrar una cone'i)n +S#$% M. de forma


unidireccional o &idireccional
Redes : : Transporte

close-. 9 $ierra la cone'i)n +si la ha". " li&era los recursos del
socDet

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

*2

Soc ets como fic,eros


!l H-( de socDets en $ tiene funciones read-. " write-. completamente compati&les con las que se utili1an so&re ficheros. !n -"thonA la clase socDet no dispone de esos mCtodosA ni se le pueden aplicar directamente otros funciones como flush-.. Ein em&ar#oA dispone de dos mCtodos para o&tener el manejador de fichero asociado al socDet.

fileno-. retorna el descriptor entero de fichero asociado al socDet. ma0efile-. retorna un o&jeto de clase fichero asociado al socDet.

!l paquete socDet tam&iCn dispone de la funci)n fromfd-. que permite o&tener un o&jeto socDet a partir de un manejador de fichero
Redes : : Transporte

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

*&

$sAuema cliente/ser"idor UDP


Servidor )&6 !lientes )&6

soc0et-. bind-.

soc0et-.

sendto-. recvfrom-. procesamiento sendto-.


Redes : : Transporte

recvfrom-.

close-.

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

*(

Cliente UDP
Listado Completo

:;/usr/bin/python <)sage: =s >server> >port>< from sys import argv1 e?it from soc0et import @ if len-argv. ;= A: print //doc// = argv2B3 e?it-C.

soc0 = soc0et- 4/+*%#1 S7!"/&'$ M. while C: data = raw/input-. if not data: brea0

# acaba con ''

Redes : : Transporte

soc0.sendto-data1 -argv2C31 int-argv2D3... msg1 server = soc0.recvfrom-CBDE. print <Fa respuesta es G=sG< = msg soc0.close-.

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

**

Ser"idor UDP 3?sico (sncrono)


Listado Completo
:;/usr/bin/python <)sage: =s >port>< from sys import argv1 e?it from soc0et import @ import time H7I = C def handle-soc01 msg1 client1 n.: print G*ew reJuestG1 n1 client time.sleep-H7I. # some job soc0.sendto-msg.upper-.1client. if len-argv. ;= D: print //doc// = argv2B3 e?it-C. soc0 = soc0et- 4/+*%#1 S7!"/&'$ M. soc0.bind--GG1 int-argv2C3... n = B while C: msg1 client = soc0.recvfrom-CBDE. n K= C handle-soc01 msg1 client1 n.

Redes : : Transporte

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

*.

Ser"idor UDP ++ un proceso por peticin (I)


:;/usr/bin/python <)sage: =s >port>< from sys import argv1 e?it import soc0et import os1 time M ,/!L+F&$%* = EB H7I = C def handle-soc01 msg1 client1 n.: print G*ew reJuestG1 n1 client time.sleep-H7I. # some job soc0.sendto-msg.upper-.1client. def collect/children-children.: while children: if len-children. > M ,/!L+F&$%*: opts = os.(*7L *' else: opts = B pid1 status = os.waitpid-B1 opts. if not pid: brea0 children.remove-pid.

Listado Completo

if len-argv. ;= D: print //doc// = argv2B3 e?it-C. soc0= soc0et.soc0et-soc0et. 4/+*%#1 soc0et.S7!"/&'$ M. soc0.bind--GG1 int-argv2C3... n = B children = 23 while C: msg1 client = soc0.recvfrom-CBDE. n K= C collect/children-children. pid = os.for0-. if pid: children.append-pid. else: handle-soc01 msg1 client1 n. e?it-.

Redes : : Transporte

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

*1

Ser"idor UDP ++ un ,ilo por peticin


Listado Completo
:;/usr/bin/python <)sage: =s >port>< from sys import argv1 e?it from soc0et import @ import thread1 threading1 time H7I = C def handle-soc01 msg1 client1 n.: print G*ew reJuestG1 n1 client time.sleep-H7I.# some job loc0.acJuire-. try: soc0.sendto-msg.upper-.1 client. e?cept error1 e: print e1 client loc0.release-.

if len-argv. ;= D: print //doc// = argv2B3 e?it-C. soc0 = soc0et- 4/+*%#1 S7!"/&'$ M. soc0.bind--GG1 int-argv2C3... loc0 = threading.Foc0-. n = B while C: msg1 client = soc0.recvfrom-CBDE. n K= C thread.start/new/thread-handle1 -soc01 msg1 client1 n..

Redes : : Transporte

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

*2

Ser"idor UDP ++ Soc etSer"er=UDPSer"er


Listado Completo
:;/usr/bin/python <)sage: =s >port>< from sys import argv1 e?it from Soc0etServer import @ import time H7I = C class )pperLandler-&atagram$eJuestLandler.: def handle-self.: print G*ew reJuest:G1 self.client/address msg = self.rfile.read-..upper-. time.sleep-H7I. self.wfile.write-msg.

Redes : : Transporte

if len-argv. ;= D: print //doc// = argv2B3 else: )&6Server--GG1 int-argv2C3..1 )pperLandler..serve/forever-.

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

*4

Ser"idor UDP ++ Soc etSer"er=<or ingUDPSer"er


(Un proceso por peticin)

Listado Completo
:;/usr/bin/python <)sage: =s >port>< from sys import argv1 e?it from Soc0etServer import @ import time H7I = C class )pperLandler-&atagram$eJuestLandler.: def handle-self.: print G*ew reJuest:G1 self.client/address msg = self.rfile.read-..upper-. time.sleep-H7I. self.wfile.write-msg.

Redes : : Transporte

if len-argv. ;= D: print //doc// = argv2B3 else: 4or0ing)&6Server--GG1 int-argv2C3..1 )pperLandler..serve/forever-.

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

.5

$sAuema cliente/ser"idor TCP


soc0et-. bind-. listen-. $reaci)n de un procesoA hilo o #esti)n as ncrona soc0et-. connect-.

accept-.

send-.

Servidor #!6 6adre


recv-. trabaMo

recv-. close-.

Redes : : Transporte

send-. close-.

!liente #!6

Servidor #!6 LiMo


David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

.1

Cliente TCP
Listado Completo
:;/usr/bin/python <)sage: =s >server> >port>< from sys import argv1 e?it from soc0et import @ if len-argv. ;= A: print //doc// = argv2B3 e?it-C.
soc0 = soc0et- 4/+*%#1 S7!"/S#$% M. soc0.connect--argv2C31int-argv2D3... while C: data = raw/input-. if not data: brea0 # acaba con '' sent = soc0.sendall-data. msg = GG while len-msg. > sent: msg K= soc0.recv-AD. print <Fa respuesta es G=sG< = msg soc0.close-.

Redes : : Transporte

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

.2

Ser"idor TCP 3?sico


Listado Completo
:;/usr/bin/python <)sage: =s >port>< from sys import argv1 e?it from soc0et import @ import time H7I = C def handle-soc01 client.: print G!lient connected:G1 client while C: data = soc0.recv-AD. if not data: brea0 time.sleep-H7I. # some job soc0.sendall-data.upper-.. soc0.close-. if len-argv. ;= D: print //doc// = argv2B3 e?it-C. soc0 = soc0et- 4/+*%#1 S7!"/S#$% M. soc0.setsoc0opt-S7F/S7!"%#1 S7/$%)S% &&$1 C. soc0.bind--GG1 int-argv2C3... soc0.listen-N. while C: child/soc01 client = soc0.accept-. handle-child/soc01 client.

Redes : : Transporte

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

.&

Ser"idor TCP ++ un proceso por cone-in (I)


Listado Completo
:;/usr/bin/python <)sage: =s >port>< from sys import argv1 e?it import soc0et import os1 time M ,/!L+F&$%* = EB H7I = C def handle-soc01 client1 n.: print G!lient connectedG1 n1 client while C: data = soc0.recv-AD. if not data: brea0 time.sleep-H7I. # some job soc0.sendall-data.upper-.. soc0.close-. def collect/children-children.: while children: if len-children. > M ,/!L+F&$%*: opts = os.(*7L *' else: opts = B pid1 status = os.waitpid-B1 opts. if not pid: brea0 children.remove-pid.

Redes : : Transporte

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

.(

Ser"idor TCP ++ un proceso por cone-in (II)


if len-argv. ;= D: print //doc// = argv2B3 e?it-C. soc0 = soc0et.soc0et-soc0et. 4/+*%#1 soc0et.S7!"/S#$% M. soc0.bind--GG1 int-argv2C3... soc0.listen-N. n = B children = 23 while C: child/soc01 client = soc0.accept-. n K= C collect/children-children. pid = os.for0-.

Redes : : Transporte

if pid: children.append-pid. else: handle-child/soc01 client1 n. e?it-.


David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

.*

Ser"idor TCP ++ un ,ilo por cone-in

Listado Completo
#!/usr/bin/python <)sage: =s >port>< from sys import argv1 e?it from soc0et import @ import thread1 time H7I = C def handle-soc01 client1 n.: print G!lient connectedG1 n1 client while C: data = soc0.recv-AD. if not data: brea0 time.sleep-H7I. # some job soc0.sendall-data.upper-.. soc0.close-.

if len-argv. ;= D: print //doc// = argv2B3 e?it-C. soc0= soc0et- 4/+*%#1 S7!"/S#$% M. soc0.bind--GG1 int-argv2C3... soc0.listen-N. n = B while C: child/soc01 client = soc0.accept-. n K= C thread.start/new/thread-handle1 -child/soc01 client1 n..

Redes : : Transporte

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

..

Ser"idor TCP asncrono ++ select-.


Listado Completo
:;/usr/bin/python <)sage: =s >port>< from sys import argv1 e?it from soc0et import @ import select1 time H7I = C def !hildLandler-s.: data = s.recv-AD. if not data: s.close-. soc0s.remove-s. return def 6arentLandler-s.: child/soc01 client = s.accept-. soc0s.append-child/soc0. print G!lient connected:G1 client ss = soc0et- 4/+*%#1 S7!"/S#$% M. ss.bind--GG1 int-argv2C3... ss.listen-N. soc0s = 2ss3 while C: rd = select.select-soc0s1 231 23.2B3 for i in rd: if i == ss: 6arentLandler-i. else: !hildLandler-i.

Redes : : Transporte

time.sleep-H7I. # some job s.sendall-data.upper-..

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

.1

Ser"idor TCP ++ Soc etSer"er=TCPSer"er


Listado Completo
:;/usr/bin/python <)sage: =s >port>< from sys import argv1 e?it from Soc0etServer import @ import time H7I = C class )pperLandler-Stream$eJuestLandler.: def handle-self.: print G!lient connected:G1 self.client/address while C: data = soc0.recv-AD. if not data: brea0 time.sleep-H7I. # some job soc0.sendall-data.upper-.. self.reJuest.close-.

Redes : : Transporte

if len-argv. ;= D: print //doc// = argv2B3 else: server = #!6Server--GG1int-argv2C3..1 )pperLandler. server.serve/forever-.

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

.2

Ser"idor TCP ++ Soc etSer"er=<or ingTCPSer"er


(un proceso por cone-in)

Listado Completo
:;/usr/bin/python <)sage: =s >port>< from sys import argv1 e?it from Soc0etServer import @ import time H7I = C class )pperLandler-Stream$eJuestLandler.: def handle-self.: print G!lient connected:G1 self.client/address while C: data = soc0.recv-AD. if not data: brea0 time.sleep-H7I. # some job soc0.sendall-data.upper-.. self.reJuest.close-.

Redes : : Transporte

if len-argv. ;= D: print //doc// = argv2B3 else: server = 4or0ing#!6Server--GG1int-argv2C3..1 )pperLandler. server.serve/forever-.

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

.4

Ser"idor TCP ++ Soc etSer"er=T,readingTCPSer"er


(un ,ilo por cone-in)
:;/usr/bin/python <)sage: =s >port>< from sys import argv1 e?it from Soc0etServer import @ import time H7I = C class )pperLandler-Stream$eJuestLandler.: def handle-self.: print G!lient connected:G1 self.client/address while C: data = soc0.recv-AD. if not data: brea0 time.sleep-H7I. # some job soc0.sendall-data.upper-.. self.reJuest.close-.

Listado Completo

Redes : : Transporte

if len-argv. ;= D: print //doc// = argv2B3 else: server = #hreading#!6Server--GG1int-argv2C3..1 )pperLandler. server.serve/forever-.

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

15

Ser"idor TCP ++ PaAuete 8s#ncore


:;/usr/bin/python <)sage: =s >port><

Listado Completo

from sys import argv1 e?it from soc0et import @ import asyncore1 time H7I = C

class !hildLandler-asyncore.dispatcher.: def //init//-self1 soc0.: asyncore.dispatcher.//init//-self1 soc0. self.buffer = GG def handle/read-self.: self.buffer K= self.recv-AD. time.sleep-H7I. # some job def writable-self.: return -len-self.buffer. > B. def handle/write-self.: sent = self.send-self.buffer.upper-.. self.buffer = self.buffer2sent:3 def handle/close-self.: self.close-.

Redes : : Transporte

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

11

Ser"idor TCP ++ PaAuete 8s#ncore (II)

class 6arentLandler-asyncore.dispatcher.: def //init//-self.: asyncore.dispatcher.//init//-self. self.create/soc0et- 4/+*%#1 S7!"/S#$% M. self.set/reuse/addr-. self.bind--GG1 int-argv2C3... self.listen-N. def handle/accept-self.: child/soc01 client = self.accept-. print G!lient connectedG1 client !hildLandler-child/soc0. 6arentLandler-. asyncore.loop-.

Redes : : Transporte

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

12

Ser"idor de procesos
,n servidor de procesos +o superservidor. es un pro#rama especial que escucha en muchos puertos a la ve1 +0$- " ,D-. para servicios de uso espor2dico. $uando ha" una petici)n o cone'i)n a al#uno de esos puertosA el superservidor instancia un pro#rama concreto para manejar ese servicio. !n F*,/Linu' se llama inetd " se confi#ura por medio del fichero /etc/inetd.conf
Redes : : Transporte

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

1&

Ser"idor de procesos
Ejercicio

,tili1ando -"thon est2ndarA escri&e un servidor de procesos que implemente internamente servidores de echoA daytimeA time " discard tanto 0$- como ,D-. K que pueda utili1ar servidores e'ternos est2ndar de ftpA tftp " telnet.

Redes : : Transporte

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

1(

%eferencias
Ee recomienda repasar " profundi1ar el contenido de este tema utili1ando +al menos. la si#uiente &i&lio#raf a &2sica: H.E. @edes de computadores. -earson !ducaci)nA $uarta edici)nA 8669.

$ap tulos 5. Hpartados 4 - ?.46 $ap tulos > " 4> %)dulo =

$(E$/ E"stems. (nc. Fu a del primer aBo. $$*H 4 " 8. $isco -ressA 8669.

%aterial e-learnin# $(E$/ $$*H !'ploration

Redes : : Transporte

Nota

0odos los listados de este tema est2n disponi&les para descar#a en la direcci)n:

https://arco.esi.uclm.es/svn/public/misc/python/networ0ing/upper/

David Villa <David.Villa@uclm.es> :: http://www.inf-cr.uclm.es/www/dvilla/

1*