This is an old revision of the document!
De citit înainte de laborator:
Lectura video
Lectura optionala
În urma parcurgerii acestui laborator, studentul va fi capabil să:
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.
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ă:
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:
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.
Î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ă:
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.
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 (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
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
Va oferim aici un cod sursă schelet pentru realizarea unei aplicații in C care utilizează API-ul DNS.
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).
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:
Găsiți mai jos un tabel cu o serie de gazde și RR-urile asociate: