Licenciaturas em Informática e Gestão de Empresas, Engenharia de Telecomunicações e Informática e Engenharia Informática Redes Digitais III Relatório 1º Laboratório: O Java e os Sockets Licenciatura: ETI Turma : ETC1 Grupo : rd3_t3_02 Data: 22/02/2010 Número do Aluno Nome do Aluno 28400 André Coelho 28428 Carlos Duque I. TCP: Cliente-Servidor I.3. Pare a captura e analise-a para validar a funcionalidade cliente - servidor e tente responder às seguintes perguntas: a) Qual o protocolo de transporte utilizado? TCP. b) Qual o porto do cliente e como este foi escolhido? O porto é o 1040, foi escolhido um porto não atribuído, de forma aleatória, dentro de uma gama utilizada normalmente pelo protocolo TCP. c) Que tipo de encerramento de ligação TCP foi utilizado (simétrico ou assimétrico)? Que alterações de código seriam necessárias para que o tipo de encerramento fosse alterado? Implemente as alterações necessárias para alterar a forma de encerrar a ligação e valide-as experimentalmente. Através da captura observámos que o cliente enviou o fyn e desligou-se de imediato, sendo este tipo de encerramento assimétrico. Todos os dados enviados posteriormente por parte do servidor serão perdidos, pois o cliente já não se encontra ligado. Para que o encerramento seja simétrico o cliente tem de enviar o fyn, avisando o servidor que se vai desligar. De seguida, o cliente aguarda pelo seu fyn + ack, enviado pelo servidor e responde com um ack, concluindo assim o encerramento de ligação, para satisfazer o protocolo de 3 vias. 1
Para encerrar o cliente de forma simétrica, pode ser usado o método shutdownoutput da classe Socket,ou seja: clientsocket.shutdownoutput(); public void shutdownoutput() throws IOException Disables the output stream for this socket. For a TCP socket, any previously written data will be sent followed by TCP's normal connection termination sequence. If you write to a socket output stream after invoking shutdownoutput() on the socket, the stream will throw an IOException. Throws: IOException - if an I/O error occurs when shutting down this socket. No PC pcx-2 arranque dois clientes em simultâneo após ter iniciado a captura de pacotes. Analisando a captura e o output produzido por cada cliente explique como é que o servidor consegue diferenciar os dois clientes, relativamente à comunicação através de sockets. O servidor distingue os dois clientes através do porto atribuído a cada um deles, são atribuídos os portos 1041 e 1042. Sendo assim, quando o servidor pretende responder ao cliente 1 encaminha a sua resposta para o porto 1041 e ao cliente 2 para o porto 1042. Tente arrancar em primeiro lugar o cliente e só depois o servidor. Recorrendo à captura efectuada, descreva o que aconteceu com mensagens pertinentes retiradas dessa captura. Ao observar esta captura podemos ver que na resposta do servidor, a flag reset [RST] está activa. Isto indica que o servidor pretende que se seja feito um reset à ligação pois não tem nenhuma ligação activa naquele porto. I.4. Como é que pode simular do lado do servidor (ver I.2) um atraso na sua resposta ao cliente? O atraso pode ser simulado através de um sleep. try { sleep(1500);} catch (InterruptedException e){ System.out.println("Delay: " + e.getmessage());} 2
Que mensagem aparece no cliente quando existe uma situação de timeout? Justifique-a. A mensagem que aparece do lado do cliente é IO: Read timed out, valor de e.getmessage(). Quando ocorre timeout é lançada uma IOException que é apanhada pelo catch onde é dado o output de descrição do erro. catch (IOException e) { System.out.println("IO: " + e.getmessage());} Poderia ser útil usar um temporizador do lado do servidor? Se sim, altere o código e experimente. Poderia ser utilizado o método setsotimeout, da classe ServerSocket, para implementar um temporizador. public void setsotimeout(int timeout) throws SocketException Enable/disable SO_TIMEOUT with the specified timeout, in milliseconds. With this option set to a non-zero timeout, a call to accept() for this ServerSocket will block for only this amount of time. If the timeout expires, a java.net.sockettimeoutexception is raised, though the ServerSocket is still valid. The option must be enabled prior to entering the blocking operation to have effect. The timeout must be > 0. A timeout of zero is interpreted as an infinite timeout. 3
II. UDP: Cliente-Servidor Pare a captura e analise-a para validar a funcionalidade cliente-servidor e tente responder às seguintes perguntas: a) Qual o porto do servidor? O porto do servidor é o 9876 b) Qual o porto do cliente e como este foi escolhido? O porto do cliente é o 1049 e tal como no exemplo do protocolo TCP, foi escolhido um porto livre dentro de uma gama normalmente utilizada pelo protocolo UDP. c) Verifique no código e depois confirme na captura, como é que o servidor teve acesso ao IP e porto do cliente, para depois lhe enviar a resposta. O servidor fica à espera de receber um pacote, quando recebe uma mensagem, retira dela tanto o porto como o ip de quem a enviou. /* O servidor bloqueia ate chegar um pacote dum potencial cliente. */ serversocket.receive(receivepacket); /* Obtem-se numa string a mensagem enviada pelo cliente. */ String sentence = new String(receivePacket.getData()); /* Obtem-se o endereço IP do cliente. */ InetAddress IPAddress = receivepacket.getaddress(); /* Obtem-se o porto do cliente. */ int port = receivepacket.getport(); 4
III. Multicast Deverá verificar a correcta funcionalidade desta aplicação Multicast, tentando analisar a captura efectuada e respondendo depois às seguintes perguntas: a) Qual é o protocolo de transporte utilizado? O protocolo de transporte utilizado é UDP. b) Qual o endereço MAC associado ao grupo multicast e como este é que é formado? O endereço MAC associado a este grupo é o 01:00:5e:00:00:01. Foi obtido de acordo com a seguinte figura: Os últimos 23 bits do endereço de IP multicast são traduzidos directamente nos últimos 23 bits do endereço MAC multicast. A gama de endereços MAC entre 01:00:5e:00:00:01 e 01:00:5E:7F:FF:FF está reservada para este efeito. c) Qual é o valor do campo TTL? O valor do campo TTL é 100. d) Como é que poderia aumentar o TTL? Observamos que no código da classe MulticastPeer esta definido para o valor de 100 saltos, no método, s.settimetolive(100). Para aumentarmos este valor bastaria passar um argumento maior neste método. 5
Altere o endereço do grupo para 224.0.0.50 e repita o cenário de teste anterior. Analise as capturas dos dois cenários de teste do multicast. e) Consegue visualizar mensagens do protocolo IGMP? Em caso afirmativo liste-as com os endereços de rede utilizados. Caso contrário justifique também. O protocolo Igmp é usado para gerir grupos de multicast. As mensagens Igmp Membership Report são usadas quando um cliente pretende aderir a um grupo multicast. Além disso, o Leave group é usado quando um host abandona um grupo multicast e é enviada a para o endereço de multicast 224.0.0.2. f) Qual a versão do protocolo IGMP? Versão 2 g) Verifique se está a ser utilizado o mecanismo de supressão de respostas a uma mensagem do tipo IGMP Query, baseado no Máximo Tempo de Resposta? Justifique a sua resposta. Podemos observar que o campo Max Response Time na mensagem Membership Query tem o valor de 10 segundos, isto significa que o mecanismo de supressão de resposta está a ser utilizado. Em todos os outros tipos de mensagem este campo é ignorado pelo receptor, sendo o seu valor colocado a 0 segundos pelo emissor. 6