Comunicação de Dados e Redes de Computadores 4ºAno LEEC Protocolos de Aplicação POP3 – Post Office Protocol version 3 o Filipe Alexandre da Silva Vila Real o Ricardo Filipe Rosário Faria Turma: 4ET12 Porto, 4 de Junho de 2001 CDRC1 – Protocolos de Aplicação / POP3 Operações Básicas POP3 2 1 O servidor inicia o serviço POP3 estando “à escuta” na porta TCP 110. Quando um cliente deseja usar o serviço, este estabelece uma ligação TCP com o servidor. Após a ligação estar estabelecida, o servidor POP3 envia uma saudação. Estão assim criadas as condições para que cliente e servidor POP3 troquem comandos e respostas, respectivamente, até a ligação ser fechada ou abortada. No POP3 os comandos são o meio de comunicação do cliente com o servidor. Todos os comandos são terminados com o par CRLF. Um comando é composto por uma palavra chave, de 3 ou 4 caracteres, uma palavra chave pode ou não ser seguida de um argumento. As respostas do servidor POP3 consistem de um indicador de estado seguido de informação adicional relativa ao comando enviado pelo cliente. Todas as respostas são terminadas com o par CRLF. As respostas podem ter um comprimento máximo de 512 caracteres, incluindo a terminação CRLF. Existem tipicamente dois indicadores de estado: positivo (“+OK”) e negativo (“-ERR”). Servers MUST send the "+OK" and "ERR" in upper case. Respostas a certos comandos ocupam mais do que uma linha. Nestes casos, após enviar a primeira linha e o par CRLF, são enviadas linhas adicionais, cada uma terminada com o par CRLF. Quando todas as linhas forem enviadas, uma linha final é enviada, consistindo num octeto de terminação (código decimal 046, “.”) e o par CRLF. Uma sessão de POP3 evolui sobre um diverso número de estados. Uma vez aberta a ligação TCP, e após o envio da saudação por parte do servidor, a sessão entra no estado AUTHORIZATION. Neste estado, o cliente deve fazer a sua identificação introduzindo o respectivo username e correspondente password. Tendo sido bem sucedida a identificação do cliente, a sessão entra no estado TRANSACTION. Neste estado, o cliente requisita acções ao servidor POP3 por meio de comandos. Quando o cliente invocar o comando QUIT, a sessão entra no modo UPDATE. Neste estado, o servidor liberta os recursos adquiridos no estado TRANSACTION. A ligação TCP é então fechada. 3 CDRC1 – Protocolos de Aplicação / POP3 2 Comandos Uma vez aberta a ligação TCP por um cliente POP3, a identificação do cliente é feita com recurso a dois comandos: USER name, PASS password. O servidor utiliza a informação enviada neste par de comandos para decidir se deverá ser dado ao cliente acesso a uma caixa de correio. Poderão ser dadas duas respostas por parte do servidor, positiva ou negativa: “+OK maildrop locked and ready”; “-ERR invalid password”. No estado de TRANSACTION, após ter sido bem sucedida a identificação do cliente, existem diversos comandos à disposição do cliente. Após cada comando, o servidor envia uma resposta. Eventualmente, o cliente pode invocar o comando QUIT, entrando a sessão no estado UPDATE. A seguir são apresentados, sucintamente, comandos válidos no estado TRANSACTION. STAT É um comando sem argumento. O servidor responde positivamente com uma linha contendo informação sobre a caixa de correio. A resposta consiste do indicador de estado positivo (“+OK”), do número de mensagens existentes na caixa de correio, e o tamanho da caixa de correio em octetos. LIST Este comando, tem um argumento opcional. No caso de ser passado um argumento (número da mensagem) , é recebida uma resposta positiva de uma linha com informação sobre a mensagem em causa. Após “+OK”, segue-se o número da mensagem (o argumento) e o tamanho exacto da mensagem em octetos. No caso de não ser passado qualquer argumento, a resposta possuí mais do que uma linha. 4 CDRC1 – Protocolos de Aplicação / POP3 Em cada linha é apresentada a informação respeitante às mensagens existentes, sendo a última linha reservada para a terminação. RETR É um comando que possuí obrigatoriamente um argumento, o número da mensagem. Se o servidor POP3 responde positivamente então estamos perante uma resposta multi-linha. Após “+OK”, o servidor envia a mensagem correspondente ao argumento. DELE Este comando tem um argumento obrigatório que diz respeito ao número da mensagem. O servidor POP3 marca a mensagem como apagada. Qualquer referência futura a essa mensagem por parte de algum comando, é originada um resposta negativa por parte do servidor. O servidor POP3 só apaga efectivamente a mensagem quando a sessão entrar no estado UPDATE. NOOP Comando sem argumentos. O servidor POP3 não faz nada, simplesmente responde positivamente. RSET Comando sem argumentos. Se alguma mensagem foi marcada para ser apagada, o servidor POP3 desmarca e responde positivamente. QUIT Comando sem argumentos, que quando invocado pelo cliente, força a sessão a entrar no estado UPDATE. O servidor POP3 remove todas as mensagens previamente marcadas para serem eliminadas. Existem ainda dois comandos, que são duas extensões aos comandos básicos. Um comando UIDL, que apresenta um argumento optativo, dizendo respeito à mensagem da qual se quer visualizar o respectivo identificador. No caso de não ser 5 CDRC1 – Protocolos de Aplicação / POP3 passado nenhum argumento, é apresentado para cada mensagem uma linha com o número e o respectivo identificador da mensagem. O comando TOP, permite visualizar o cabeçalho da mensagem e um número de linhas do corpo da mensagem que é passado como argumento. Este comando possuí assim dois argumentos, o número da mensagem e o número de linhas do corpo da mensagem a visualizar. De notar que se o número de linhas pedidas pelo cliente para visualizar for superior ao número de linhas do corpo da mensagem, o servidor POP3 envia a totalidade da mensagem. Código 3 Tendo como base as Operações Básicas do POP3, foi implementado o código que se encontra em anexo e que agora nos propomos a fazer uma breve explicação. Para ser estabelecida a ligação TCP, foram usadas uma série de primitivas para ser possível fazer uma interface por sockets. Um socket é usado para permitir que um processo comunique com outro, assim como um telefone é usado para permitir que uma pessoa comunique com outra. Um outro conjunto de primitivas é usado para permitir o envio e a recepção de dados na rede, send(...) e recv(...). Como foi referido anteriormente, após ser efectuada a ligação do cliente ao servidor, estes trocam comandos e respostas. Os comandos foram criados com recurso a duas funções, strcpy e strcat. A primeira copia para o buffer de envio (buffer[NCHAR]), a palavra chave referente ao comando e a segunda concatena os possíveis argumentos que deverão ser usados para o servidor proceder correctamente aos comandos enviados. CDRC1 – Protocolos de Aplicação / POP3 6 O envio do comando, e possíveis argumentos, é realizado chamando a função envia() que por sua vez invoca a primitiva send(...). O que esta função envia de facto, é o buffer onde foi criado o comando e ao qual foram concatenados possíveis argumentos. Após o envio de um comando, é feita uma espera. Foram implementadas duas funções. A função esperas() e a função esperam(). Qualquer uma destas funções faz uma chamada à função recebe(), que por sua vez invoca a primitiva recv(...), que permite a recepção das respostas por parte do servidor. Estas respostas são armazenadas no buffer que vai conter os dados recebidos, rec[NCHAR]. A função esperas() é invocada quando a resposta do servidor é apenas de uma linha, enquanto que a função esperam() é invocada quando a resposta a um comando ocupa mais do que uma linha de informação (no caso da resposta ao comando RETR por exemplo). Estes são portanto os procedimentos que permitem o envio de comandos e a recepção de respostas. Ao nível da interface com o utilizador o que foi feito foi o seguinte: foi implementada uma função menu() que oferece ao utilizador uma gama de comandos. Ao ser actuada a tecla respeitante ao comando, é feita a chamada a uma função que irá criar o comando, enviá-lo, e esperar por uma resposta do servidor. A saída desta função é apenas possível quando é invocado o comando QUIT, ou seja quando a sessão entra no modo UPDATE. O código apresenta-se comentado, o que ajuda na explicação de algumas instruções que se tornariam fastidiosas de serem aqui comentadas.