Prácticas:
Lista de parejas de prácticas
Metodología: En algunas sesiones explicaré comandos, la configuración del laboratorio, detalles sobre las prácticas y daré descripciones del funcionamiento de algunos servicios de Internet. El resto del tiempo se podrá dedicar a realizar las prácticas o los ejercicios propuestos
Evaluación: Programas y memoria, sobre 3 puntos. No hay nota mínima
El día del examen anterior a Navidades.
Guión de las prácticas:
Fecha de entrega de prácticas: 21 de Diciembre del 2001
Organización prevista de las sesiones (puede variar):
![]() |
Supongamos una empresa con la topología de red representada en la figura de la izquierda.
En la Red A se esperan conectar 213 hosts, en la Red B 13, en la Red C 2, en la Red D 12 y en la Red E ninguno. Estas cifras no cuentan a los interfaces de los routers. Se le asigna a esta empresa el espacio de direcciones 21.143.188/23. Suponiendo que todos los routers soportan CIDR cree las subredes oportunas, haga el reparto, asigne direcciones y máscaras a los interfaces de los routers, especifique los rangos de direcciones disponibles y las direcciones de broadcast de cada red y la configuración de las tablas de los routers. |
![]() |
Supongamos una empresa con la topología de red representada en la figura de la izquierda.
En la Red A no se esperan conectar ningún host, en la Red B 20, en la Red C 2400, en la Red D 3200, en la Red E 15 y en la Red F 4. Estas cifras no cuentan a los interfaces de los routers. Se le asigna a esta empresa el espacio de direcciones 145.2/16. Suponiendo que todos los routers soportan CIDR cree las subredes oportunas, haga el reparto, asigne direcciones y máscaras a los interfaces de los routers, especifique los rangos de direcciones disponibles y las direcciones de broadcast de cada red y la configuración de las tablas de los routers.. Suponiendo que los routers no soportan CIDR pero sí Subnetting haga de nuevo el reparto y configuración. Suponga finalmente que R2 no soporta CIDR pero los demás routers (y hosts) sí. |
[daniel@tlm61 daniel]$ /usr/sbin/traceroute 10.1.1.253 traceroute to 10.1.1.253 (10.1.1.253), 30 hops max, 38 byte packets 1 tlm3 (1.1.1.3) 1.047 ms 0.491 ms 0.489 ms 2 tlm1 (1.1.1.1) 153.462 ms 145.815 ms 149.403 ms 3 RouterBred1.maqueta.tlm.unavarra.es (10.1.1.253) 152.593 ms 152.915 ms 149.483 msPor qué en la línea 2 se indica la IP 1.1.1.1?
int func_snd(char *dir, short puerto)
{
int mysocket;
struct sockaddr_in dirsock;
struct hostent *elhost;
if ((mysocket=socket(PF_INET,SOCK_DGRAM,0))==-1)
return 1;
dirsock.sin_family=AF_INET;
elhost=gethostbyname(dir);
if (elhost==NULL)
return 2;
dirsock.sin_addr.s_addr=*(unsigned int *)elhost->h_addr_list[0];
dirsock.sin_port=htons(puerto);
if (sendto(mysocket, "Hola", 5, 0, (struct sockaddr *)&dirsock, sizeof(dirsock))==-1)
return 4;
if (sendto(mysocket, "Adios", 6, 0, (struct sockaddr *)&dirsock, sizeof(dirsock))==-1)
return 8;
close(mysocket);
return 0;
}
int func_rcv(unsigned short puerto)
{
int mysocket,addlen;
struct sockaddr_in dirsock;
char aux[10];
int err=0;
if ((mysocket=socket(PF_INET,SOCK_DGRAM,0))==-1)
return 1;
dirsock.sin_family=AF_INET;
dirsock.sin_addr.s_addr=INADDR_ANY;
dirsock.sin_port=htons(puerto);
if (bind(mysocket,(struct sockaddr *)&dirsock,sizeof(struct sockaddr_in)))
return 2;
addlen=sizeof(dirsock);
if (recvfrom(mysocket,aux,10,0,(struct sockaddr *)&dirsock,&addlen)==-1)
return 4;
if (strcmp(aux,"Hola"))
err=8;
if (recvfrom(mysocket,aux,10,0,(struct sockaddr *)&dirsock,&addlen)==-1){
err|=16;
return err;
}
if (strcmp(aux,"Adios"))
err|=32;
return err;
}
Un programa emplea una de ellas de la forma func_rcv(valor_de_puerto) y otro programa la otra func_snd(nombre_de_la_otra_maquina, valor_de_puerto). Cada función puede devolver diferentes valores de error. Explique qué situaciones deben darse para que se devuelva cada valor posible. Hay alguno imposible? (27/11/2001)
int func_snd(char *dir, short puerto)
{
int mysocket;
struct sockaddr_in dirsock;
struct hostent *elhost;
if ((mysocket=socket(PF_INET,SOCK_STREAM,0))==-1)
return 1;
dirsock.sin_family=AF_INET;
elhost=gethostbyname(dir);
if (elhost==NULL)
return 2;
dirsock.sin_addr.s_addr=*(unsigned int *)elhost->h_addr_list[0];
dirsock.sin_port=htons(puerto);
if (connect(mysocket,(struct sockaddr *)&dirsock,sizeof(dirsock))<0)
return 4;
if (write(mysocket,"Hola", 5)!=5)
return 8;
if (write(mysocket,"Adios", 6)!=6)
return 16;
close(mysocket);
return 0;
}
int func_rcv(unsigned short puerto)
{
int mysocket,susocket,addlen;
struct sockaddr_in dirsock;
char aux[10];
int err=0, tam;
if ((mysocket=socket(PF_INET,SOCK_STREAM,0))==-1)
return 1;
dirsock.sin_family=AF_INET;
dirsock.sin_addr.s_addr=INADDR_ANY;
dirsock.sin_port=htons(puerto);
if (bind(mysocket,(struct sockaddr *)&dirsock,sizeof(struct sockaddr_in)))
return 2;
if (listen(mysocket,5))
return 4;
addlen=sizeof(dirsock);
if ((susocket=accept(mysocket,(struct sockaddr *)&dirsock,&addlen))<0)
return 8;
if ((tam=read(susocket, aux, 10))!=5)
err|=16;
if (strcmp(aux,"Hola"))
err|=32;
if ((tam=read(susocket, aux, 10))!=6)
err|=64;
if (strcmp(aux,"Adios"))
err|=128;
return err;
}
Un programa emplea una de ellas de la forma func_rcv(valor_de_puerto) y otro programa la otra func_snd(nombre_de_la_otra_maquina, valor_de_puerto). Cada función puede devolver diferentes valores de error. Explique qué situaciones deben darse para que se devuelva cada valor posible. Hay alguno imposible? Compárelo con la situación en el ejercicio anterior. (27/11/2001)
4510 0034 9e2a 4000 4006 55b5 82ce a060
82ce a0d7 02f0 0016 9ad8 d531 fd6a 3a53
8010 76c8 970c 0000 0101 080a 00a6 5396
1c78 0691
Cuál es el protocolo que transporta este paquete IP? Puede identificar los campos de ese protocolo? (27/11/2001)
4520 0182 963d 4000 6606 39a6 a672 795a
82ce a0d7 042f 0050 017c 67ef c36f a470
5018 1f2c 4e07 0000 4745 5420 2f61 7369
676e 6174 7572 6173 2f62 692f 6269 3938
5f39 392f 6269 3038 2f69 6d61 6765 732f
616e 696d 616c 6573 2f43 4152 4131 2e47
4946 2048 5454 502f 312e 310d 0a41 6363
6570 743a 202a 2f2a 0d0a 5265 6665 7265
723a 2068 7474 703a 2f2f 7777 772e 746c
6d2e 756e 6176 6172 7261 2e65 732f 6173
6967 6e61 7475 7261 732f 6269 2f62 6939
385f 3939 2f62 6930 382f 6874 6d2f 616e
696d 616c 6573 2f43 4152 4143 4f4c 2e48
544d 0d0a 4163 6365 7074 2d4c 616e 6775
6167 653a 2065 730d 0a41 6363 6570 742d
456e 636f 6469 6e67 3a20 677a 6970 2c20
6465 666c 6174 650d 0a55 7365 722d 4167
656e 743a 204d 6f7a 696c 6c61 2f34 2e30
2028 636f 6d70 6174 6962 6c65 3b20 4d53
4945 2035 2e30 3b20 5769 6e64 6f77 7320
3938 3b20 4469 6745 7874 290d 0a48 6f73
743a 2077 7777 2e74 6c6d 2e75 6e61 7661
7272 612e 6573 0d0a 436f 6e6e 6563 7469
6f6e 3a20 4b65 6570 2d41 6c69 7665 0d0a
0d0a
Cuál es el protocolo que transporta este paquete IP? Puede identificar los campos de ese protocolo? Y el servicio que transporta ese nuevo protocolo? Continúe la decodificación hasta donde sea capaz. (27/11/2001)
#include <stdio.h>
#include <netdb.h>
main(int argc, char *argv[])
{
if (argc>1) {
printf("Resolviendo %s ...\n", argv[1]);
if (gethostbyname(argv[1])!=NULL)
printf("Resuelto\n");
else printf("Error!\n");
}
}
Lo guardamos como prog.c, lo compilamos y lo ejecutamos en la máquina tlm11 obteniendo el siguiente resultado:
% gcc prog.c -o progdns % ./progdns dominiofalso.com Resolviendo dominiofalso.com ... Error!Antes de ejecutar el programa ejecutamos el comando netstat con el argumento -a. Entre la aparición del texto Resolviendo dominiofalso.com ... y de Error! transcurre suficiente tiempo para que en otro terminal ejecutemos en esa misma máquina de nuevo un netstat -a. Entre la primer ejecución de comando y la segunda observamos una única diferencia, en la segunda aparece una nueva línea, la siguiente:
udp 0 0 *:1467 *:*Qué está sucediendo? Qué significado tiene esa línea? Por qué se crea, para qué, por quién? Al terminar la ejecución del programa hacemos de nuevo netstat -a y ya no aparece, por qué? (12/12/2001)
Estas páginas pueden sufrir modificaciones frecuentes | Última actualización 19:31 12/12/2001 |