CS 779/879 Design of Network Protocols Spring 2009 Midterm Exam Time 2 & 1/2 hours Open Book Name: Login: All questions are of equal weights. Question 1: Consider the following commands: % hostname something % ifconfig –a lo0: flags=2001000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4,VIRTUAL> mtu 8232 index 1 inet 127.0.0.1 netmask ff000000 eri0: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 1500 index 2 inet 128.82.4.210 netmask fffffe00 broadcast 128.82.5.255 hme0: flags=1000842<BROADCAST,RUNNING,MULTICAST,IPv4> mtu 1500 index 3 inet 0.0.0.0 netmask 0 lo0: flags=2002000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv6,VIRTUAL> mtu 8252 index 1 inet6 ::1/128 eri0: flags=2004841<UP,RUNNING,MULTICAST,DHCP,IPv6> mtu 1500 index 2 inet6 fe80::203:baff:fe2a:67ff/10 A. What is hme0 is used for? Sudo tcpdump –i hme0 B. What are the ipv4 and the ipv6 address of this host? inet 128.82.4.210 inet6 fe80::203:baff:fe2a:67ff C. Assume you have no permission to login to a given host name N. Describe how to obtain: I. The ipv4 address of N nslookup N II. The ipv6 address of N Not possible. Question 2: A. Without using tcpdump, how can you tell if a certain TCP connection has terminated via a simultaneous close? If both ends detect the state: TIME_WAIT B. Using tcpdump, how can you tell if a certain TCP connection is established via a simultaneous open? Detect SYN segment at almost the same time. Question 3: A. TCP server called Q3Srv has the following code: main(int argc, char *argv[]) { int sd, psd; struct sockaddr_in name; sd = socket (PF_INET,SOCK_STREAM,0); name.sin_family = AF_INET; name.sin_addr.s_addr = htonl(INADDR_ANY); name.sin_port = htons(10333); bind( sd, (SA *) &name, sizeof(name) ); listen(sd,0); for(;;) { psd = accept (sd, 0,0); sleep (atoi (argv[1])); close (psd); } } A. Assume we have three TCP clients tried to simultaneously connect to Q3Srv. Describe what might happens to each of the three clients, if the Q3Srv is invoked as: 1. Q3Srv 10 All THREE will connect 2. Q3Srv 1000 First TWO will connect To test use: % Q3Clt_sh <host> 10333 B. If you try to execute Q3Srv on one of our “something” machines and you get an error message: “Address already in use”. How to find the user name of the process causing this error? Is it possible to do the same if this happens on a “fast” machine? Use lsof which have no permission to use on fast. Question 4: A TCP server Q4Srv has the same code as QSrv3 expect that the statement: name.sin_addr.s_addr = htonl(INADDR_ANY); Is replaced with: gethostname(ThisHost, 80); hp = gethostbyname(ThisHost) bcopy ( hp->h_addr, &(name.sin_addr.s_addr), hp->h_length); A TCP client Q4Clt has the following code: main(int argc, char *argv[] ) { int struct struct sd; sockaddr_in server; hostent *hp, *gethostbyname(); sd = socket (AF_INET,SOCK_STREAM,0); server.sin_family = AF_INET; hp = gethostbyname(argv[1]); bcopy ( hp->h_addr, &(server.sin_addr.s_addr), hp->h_length); server.sin_port = htons(12345); if (connect(sd, (SA *) &server, sizeof(server))<0){ printf("connect error\n"); exit(-1); } else printf("connected\n"); } Assume we started the server as: something % Q4Srv 10 What is the output of each of the following statements? something % Q4Clt 128.82.4.210 something % Q4Clt 127.0.0.1 Question 5: A. A UDP server Q5Srv has the following code. Modify this code so that the server receives multicast messages. The multicast group is given as argv[2]. int main(int argc, char *argv[]) { int sd; struct sockaddr_in server; char buf[512]; int rc; server.sin_family = AF_INET; server.sin_addr.s_addr = htonl(INADDR_ANY); server.sin_port = htons(atoi(argv[1])); sd = socket (AF_INET,SOCK_DGRAM,0); bind( sd, (SA *) &server, sizeof(server)); for(;;){ rc=recv (sd, buf, sizeof(buf), 0); buf[rc]= (char) NULL; printf("Received: %s\n", buf); } } See Q5Srv.c B. A UDP client Q5Clt has the following code: main(int argc, char *argv[]) { int sendsock; struct sockaddr_in dest; sendsock = socket(PF_INET,SOCK_DGRAM, 0); dest.sin_family = AF_INET; dest.sin_addr.s_addr = inet_addr(argv[1]); dest.sin_port = htons(atoi(argv[2])); sendto(sendsock,argv[3],strlen(argv[3]),0,(SA*)&dest,sizeof(dest)); } Give an example to show how to use Q5Srv and Q5Clt to receive and send: In both unicast and multicast: % Q5Srv 224.0.0.10 10111 I. A unicast message % Q5Clt 128.82.4.98 10111 HI II. A multicast message % Q5Clt 224.0.0.10 10111 HI