This is an old revision of the document!


Laboratorul 11 - DNS & E-mail

Lectură laborator

Obiective

În urma parcurgerii acestui laborator, studentul va fi capabil să:

  • diferențieze și utilizeze două protocoale pentru citirea poștei electronice;
  • folosească protocolul pentru trimiterea de mesaje și atașamente prin poșta electronică;
  • scrie un client simplu de e-mail;
  • opereze cu ierarhia spațiilor de nume și să identifice tipurile de domenii și subdomenii;
  • folosească algoritmul de interogare utilizat de DNS;
  • identifice tipurile de resurse pentru diverse domenii și clasele acestora;
  • folosească un set minimal de funcții pentru aflarea informațiilor unui sistem gazdă.

Introducere

Programele se refera rareori la sisteme gazdă, cutii poștale și alte resurse prin adresele lor binare. În loc de numere binare, se utilizează șiruri ASCII, cum ar fi user@cs.pub.ro. Cu toate acestea, rețeaua înțelege numai adrese binare, deci este necesar un mecanism care să convertească șirurile ASCII în adrese de rețea. Protocolul care se ocupă de acest lucru se numește DNS (Domain Name System - sistemul numelor de domenii). Esența DNS-ului constă dintr-o schemă ierarhică de nume de domenii și dintr-un sistem de baze de date distribuite pentru implementarea acestei scheme de nume. Protocolul este definit in RFC-urile 1034 și 1035.

Primul mesaj e-mail a fost transmis in 1971 de un inginer pe nume Ray Tomlinson. Până la acea dată, puteau fi trimise mesaje doar în cadrul aceluiași calculator. Marea îmbunătățire introdusă de Tomlinson a fost posibilitatea de a trimite mesaje între calculatoare diferite din Internet, folosind semnul ’@’ pentru a desemna mașina spre care se trimite mesajul.

Azi se trimit miliarde de mesaje e-mail pe zi, si totuși multe din caracteristicile de atunci ale mesajelor au rămas.

Structura mesajelor e-mail

Un mesaj e-mail a fost întotdeauna transmis în format plain-text (text clar). Chiar si prin adăugarea atașamentelor, mesajele de e-mail sunt trimise tot ca mesaje plain-text, prin folosirea unor mecanisme de codificare (uuencode/uudecode, MIME/BASE64).

Un mesaj este format dintr-o secțiune de antete (headers), urmată de o secțiune cu conținutul mesajului. Structura antetelor este descrisă în RFC 822, RFC 1521 și RFC 1806, ele având în general următoarea structură:

  • unul sau mai multe antete Received, care indică ce cale a fost urmată de mesaj de la sursa până la destinație
  • Mime-Version: versiunea MIME (Multipurpose Internet Mail Extensions) folosită, 1.0 in general
  • Content-Type: text/plain pentru mesaje text, multipart/mixed pentru mesaje cu atașamente
  • Subject: subiectul mesajului
  • Date: data și ora când a fost trimis mesajul
  • Message ID: un ID pentru mesaj, folosit pentru identificarea în mod unic a unui mesaj
  • From: numele și adresa de mail a expeditorului
  • To: numele și adresa de mail a destinatarului
  • Cc: carbon copy (alți destinatari)
  • alte antete introduse de clientul de e-mail folosit pentru a trimite mesajul.

Conținutul mesajului este textul propriu-zis, pentru mesajele în text clar fără atașamente. Se poate observa mai jos un exemplu de mesaj:

MIME-Version: 1.0
From: profesor@upb.ro
To: student@upb.ro
Subject: Tema
Content-Type: text/plain

Draga student,

Fa-ti tema!

Cu bine,
Profesorul.

Mesajele cu atașamente pot folosi una din următoarele tehnici pentru codificarea acestora:

  • uuencode - la începuturile e-mail-ului, fișierele care se doreau trimise trebuiau convertite în format text și invers prin folosirea utilitarelor numite uuencode/uudecode; și în ziua de azi, unii clienți de mail adaugă atașamentele la sfârșitul mesajelor, codificându-le cu algoritmul folosit de uuencode
  • MIME/Base64 - această tehnologie este cea recomandată pentru trimiterea de mesaje cu atașamente.

Un mesaj cu atașamente codificate MIME arată în felul următor:

MIME-Version: 1.0
From: Student Studentescu <student@upb.ro>
To: Profesor PC <profesor@upb.ro>
Subject: Re: Tema
Content-Type: multipart/mixed; boundary=abc

--abc
Content-Type: text/plain

Atasez tema.

Cu bine,
Studentul

--abc
Content-Type: text/plain
Content-Disposition: attachment; filename="tema.c"

#include <stdio.h>
int main()
{
    printf("Aceasta este tema mea\n");
    return 0;
}
--abc

Se observă faptul că părțile care compun mesajul sunt separate între ele printr-un șir de caractere separator (boundary string), specificat ca un parametru pentru antetul Content-Type. Fiecare parte poate avea la rândul ei propriile antete, care conțin în general tipul și numele fișierului din secțiunea respectivă. În cazul în care se trimit atașamente binare, acestea sunt codificate folosind schema numită Base64, descrisă în RFC 1521.

Protocoalele SMTP, POP3 și IMAP

În terminologia folosită de sistemele de e-mail, există trei actori. Aceștia pot fi situați pe trei mașini diferite sau pot co-exista pe aceeași gazdă:

  1. Mail User Agent (MUA) - aplicația folosită de utilizator pentru a citi și trimite mesaje e-mail (clientul de e-mail); el nu primește direct mesaje, acesta fiind rolul Mailbox Server-ului
  2. Mailbox Server - serverul care primește și stochează mesajele (server de e-mail)
  3. Mail Transfer Agent (MTA) - aplicația care primește și retrimite mesajele spre un alt MTA sau spre un Mailbox Server (“router” de e-mail).

SMTP

SMTP (Simple Mail Transfer Protocol) este un protocol care se folosește pentru trimiterea mesajelor electronice (de la un client către un server). Acesta se foloseste de portul 25 peste TCP și este descris în RFC 821 și RFC 5321.

Mesajele necesare în SMTP pentru trimiterea unui e-mail sunt următoarele:

1: HELO client.upb.ro
2: MAIL FROM: <profesor@upb.ro>
3: RCPT TO: <student@upb.ro>
4: DATA
5: MIME-Version: 1.0
From: profesor@upb.ro
To: student@upb.ro
Subject: Tema
Content-Type: text/plain

Draga student,
  
Fa-ti tema!
   
Cu bine,
Profesorul.
.
6: QUIT

Se trimite deci întâi o comandă “HELO” cu numele de domeniu sau adresa IP a clientului pentru a iniția sesiunea, apoi o comandă “MAIL FROM” cu adresa sursei, “RCPT TO” pentru destinație, “DATA” pentru date (e-mail-ul în sine) și “QUIT” pentru a se închide sesiunea. Secțiunea de date trebuie neapărat terminată cu secvența de caractere <CR><LF>.<CR><LF> (adică o linie nouă urmată de un punct și apoi de încă o linie nouă).

Găsiți mai jos modul implmentare in C a unui mesaj SMTP.

Click to display ⇲

Click to hide ⇱

void create_mail(char *buffer, char* filename) {

  int size = 500;
  int ret, fd;
  char filebuf[500];
  
  size = write_string(buffer + MAXLEN - size, size, "MIME-Version: 1.0\r\n");
  size = write_string(buffer + MAXLEN - size, size, "From: sender@mail.com\r\n");
  size = write_string(buffer + MAXLEN - size, size, "To: receiver@mail.com\r\n");
  size = write_string(buffer + MAXLEN - size, size, "Subject: Mail\r\n");
  size = write_string(buffer + MAXLEN - size, size, "Content-Type: multipart/mixed; boundary=xxx\r\n");
  size = write_string(buffer + MAXLEN - size, size, "\r\n--xxx\r\n");
  size = write_string(buffer + MAXLEN - size, size, "Content-Type: text/plain\r\n\r\n");
  size = write_string(buffer + MAXLEN - size, size, "This is the body of the e-mail.\r\nBest regards\r\n\r\n");
  size = write_string(buffer + MAXLEN - size, size, "--xxx\r\n");
  size = write_string(buffer + MAXLEN - size, size, "Content-Type: text/plain\r\n");
  size = write_string(buffer + MAXLEN - size, size, "Content-Disposition: attachment; filename=\"");
  size = write_string(buffer + MAXLEN - size, size, filename);
  size = write_string(buffer + MAXLEN - size, size, "\"\r\n\r\n");
  //deschide fisier filename
  //citeste mesajul din fisier
  //inchide fisier
  size = write_string(buffer + MAXLEN - size, size, "\r\n--xxx\r\n.");

}

POP3

POP3 (Post Office Protocol 3) este un protocol utilizat pentru citirea mesajelor electronice (de la un server către un client). Clientul va interoga periodic serverul, va descărca mesajele și le va șterge automat de pe server. Comunicația se realizează folosind portul 110 peste TCP, în felul următor:

1: USERNAME username
2: PASS password
3: LIST
4: RETR 1
5: QUIT

IMAP

IMAP (Internet Message Access Protocol) este un protocol care se folosește pentru citirea mesajelor electronice (de la un server catre un client). Clientul interoghează periodic serverul și poate cere mesaje complete sau doar porțiuni (header, body), și nu va șterge automat mesajele de pe server. Comunicația se realizează prin TCP, folosind portul 143.

1: LOGIN username password
2: LIST "" "*"
3: EXAMINE Inbox
4: FETCH 1 BODY[]
5: LOGOUT

Suportul de laborator

I. Email

Va oferim aici un cod sursă schelet pentru realizarea unui client de email SMTP scris in C. Veți folosi un server SMTP acre rulează local. Acesta poate fi creat folosind un utilitar existent în Python, numit smtpd. Rularea acestui utiliar pe portul 25 se face astfel:

sudo python -m smtpd -n -c DebuggingServer 127.0.0.1:25

Atenție! Pentru a putea rula serverul smtpd pe un port mai mic de 1024, trebuie să aveți drepturi de sudo.

II. DNS

Va oferim aici un cod sursă schelet pentru realizarea unei aplicații in C care utilizează API-ul DNS.

Exerciții

I. E-mail

Pornind de la codul disponibil aici, implementați următoatrea cerință:

1. Implementați un client SMTP peste TCP prin care să trimiteți către serverul smtpd un e-mail care conține niște text și un fișier dat ca parametru sub forma unui atașament de tip text/plain (API-ul necesar pentru conexiunea TCP cu server-ul este detaliat în laboratorul 7).

Bonus
  1. Folosind instrucțiunile de aici, trimiteți un e-mail către asistent prin intermediul serverului SMTP de la Google.

II. DNS

Pornind de la codul disponibil aici, implementați următoatrea cerință:

1. Scrieți un program care să afișeze numele și adresele IP pentru un host. Programul poate primi ca parametru fie numele (caz în care se va afișa adresa), fie adresa IP (caz în care se va afișa numele). Testați-va programul folosind informațiile din tabelul de mai jos. Exemplu de apel:

./dns -n google.com
./dns -a 8.8.8.8

2. Folosind utilitarul dig, realizați următoarele sarcini:

  1. realizați cereri de adresă (A) pentru fiecare gazdă din tabelul de mai jos
  2. pentru serverul de mail din tabelul de mai jos, realizați o cerere de tip MX

Găsiți mai jos un tabel cu o serie de gazde și RR-urile asociate:

Click to display ⇲

Click to hide ⇱

Tip Gazdă Răspuns TTL Prioritate
Pentru single-v4 există o singură adresă IPv4
A single-v4.protocoale.xyz 127.0.0.1 300
Pentru single-v4 există o singură adresă IPv6
AAAA single-v6.protocoale.xyz ::1 300
Pentru single se definesc 2 adrese (una IPv4 si una IPv6)
A single.protocoale.xyz 127.0.0.1 300
AAAA single.protocoale.xyz ::1 300
Spațiul dorinel.protocoale.xyz este delegat către un alt server de nume ce rulează la adresa potato.dfilip.xyz
NS dorinel.protocoale.xyz potato.dfilip.xyz 300
Pentru multi-v4 există 4 adrese IPv4
A multi-v4.protocoale.xyz 127.1.1.1 300
A multi-v4.protocoale.xyz 127.2.2.2 300
A multi-v4.protocoale.xyz 127.3.3.3 300
A multi-v4.protocoale.xyz 127.4.4.4 300
Pentru multi-v6 există 4 adrese IPv6
AAAA multi-v6.protocoale.xyz ::1 300
AAAA multi-v6.protocoale.xyz ::2 300
AAAA multi-v6.protocoale.xyz ::3 300
AAAA multi-v6.protocoale.xyz ::4 300
Pentru multi se definesc 8 adrese (4 de IPv4 și 4 de IPv6)
A multi.protocoale.xyz 127.1.1.1 300
A multi.protocoale.xyz 127.2.2.2 300
A multi.protocoale.xyz 127.3.3.3 300
A multi.protocoale.xyz 127.4.4.4 300
AAAA multi.protocoale.xyz ::1 300
AAAA multi.protocoale.xyz ::2 300
AAAA multi.protocoale.xyz ::3 300
AAAA multi.protocoale.xyz ::4 300
Adresele pc→pcom→protocoale definesc un șir de nume canonice care are la capăt o adresă IPv4
CNAME pc.protocoale.xyz pcom.protocoale.xyz 300
CNAME pcom.protocoale.xyz protocoale.protocoale.xyz 300
A protocoale.protocoale.xyz 127.42.42.42 300
Emailul este deservit de 3 servere SMTP cu priorități diferite
MX protocoale.xyz alt1.gmail-smtp-in.l.google.com 300 10
MX protocoale.xyz alt2.gmail-smtp-in.l.google.com 300 20
MX protocoale.xyz alt3.gmail-smtp-in.l.google.com 300 30
Tip Gazdă Răspuns TTL Prioritate
pc/laboratoare/11.1652485140.txt.gz · Last modified: 2022/05/14 02:39 by bogdan_costel.mocanu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0