Systém elektronické pošty je založen na modelu klient-server, zahrnující několik klíčových komponent:
MTA funguje jako prostředník mezi odesílatelem a příjemcem e-mailu. Jeho hlavní funkce zahrnují:
SMTP využívá protokol TCP na portech 25, 465 a 587, což zajišťuje spolehlivý přenos dat díky mechanismům jako je potvrzování doručení a řízení toku.
Pro přenos složitějšího obsahu, jako jsou obrázky nebo přílohy, SMTP využívá kódování MIME (Multipurpose Internet Mail Extensions), které umožňuje přenos různých typů dat ve standardních e-mailových zprávách.
RFC2822 definuje standardní formát pro e-mailové zprávy, který zahrnuje strukturu záhlaví a těla zprávy.
Tělo e-mailu obsahuje samotnou zprávu, která může být ve formátu prostého textu nebo HTML. Pomocí MIME mohou být do těla vloženy i přílohy, jako jsou obrázky nebo dokumenty.
POP3 (Post Office Protocol version 3) je protokol používaný k vyzvedávání e-mailů ze serveru do lokálního počítače.
POP3 nepodporuje práci s e-maily přímo na serveru, pro tento účel je určen protokol IMAP.
Aplikační vrstva v OSI modelu zajišťuje komunikaci mezi softwarovými aplikacemi prostřednictvím sítě. Tato vrstva umožňuje uživatelským aplikacím, jako jsou webové prohlížeče nebo e-mailové klienty, komunikovat mezi sebou a s dalšími službami na internetu.
Socket je koncový bod komunikace mezi dvěma aplikacemi přes síť. Kombinuje IP adresu a port, což umožňuje jednoznačnou identifikaci spojení mezi dvěma zařízeními. Sockets jsou základními stavebními bloky pro implementaci síťové komunikace v aplikacích.
// Vytvoření socketu
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
// Připojení k serveru
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
inet_pton(AF_INET, "server_ip", &server_addr.sin_addr);
connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));
// Odesílání dat
send(sockfd, "Hello, Server!", strlen("Hello, Server!"), 0);
// Přijímání dat
char buffer[1024];
recv(sockfd, buffer, sizeof(buffer), 0);
// Uzavření spojení
close(sockfd);
// Vytvoření socketu
int server_fd = socket(AF_INET, SOCK_STREAM, 0);
// Přiřazení socketu k adrese a portu
struct sockaddr_in address;
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(PORT);
bind(server_fd, (struct sockaddr *)&address, sizeof(address));
// Naslouchání na portu
listen(server_fd, 3);
// Přijetí spojení
int new_socket = accept(server_fd, NULL, NULL);
// Odesílání dat
send(new_socket, "Hello, Client!", strlen("Hello, Client!"), 0);
// Přijímání dat
char buffer[1024];
recv(new_socket, buffer, sizeof(buffer), 0);
// Uzavření spojení
close(new_socket);
close(server_fd);
TCP (Transmission Control Protocol) je široce používaný transportní protokol, který poskytuje spolehlivý, spojovaný přenos dat. Je základem pro mnohé aplikace, například:
Každá aplikace využívá specifický port k identifikaci služby na serveru. Například:
TCP využívá tzv. three-way handshake (trojcestný handshake) pro navázání spojení:
Po navázání spojení dochází k odesílání a přijímání datových segmentů, které jsou potvrzovány příjemcem, čímž se zajišťuje spolehlivý přenos.
Ukončení spojení probíhá pomocí four-way handshake:
TCP používá mechanismus sliding window pro řízení toku dat. Tento mechanismus umožňuje posouvání okna pro odesílání dat na základě potvrzení přijímající strany, čímž se optimalizuje přenos bez přetížení.
Programování TCP socketů zahrnuje vytváření, připojování, odesílání a přijímání dat prostřednictvím socketů. Klientská aplikace vytváří socket, připojuje se k serveru a komunikuje pomocí odesílání a přijímání dat. Serverová aplikace naslouchá na specifickém portu, přijímá připojení a komunikuje s klienty.
TCP | UDP |
---|---|
Spojovaný a spolehlivý | Nespojovaný a nespolehlivý |
Zaručuje doručení dat v pořadí | Nezajišťuje doručení nebo pořadí |
Vhodný pro aplikace vyžadující spolehlivost (např. e-maily, webové prohlížeče) | Vhodný pro aplikace preferující rychlost nad spolehlivost (např. streaming videa, online hry) |
UDP (User Datagram Protocol) je transportní protokol používaný pro aplikace, kde je prioritou rychlost přenosu před spolehlivostí. Příklady zahrnují:
Stejně jako TCP, i UDP využívá porty k identifikaci služeb na serverech. Například:
Programování UDP socketů je jednodušší než TCP, protože nevyžaduje ustanovení spojení. Typické funkce zahrnují:
socket()
: Vytvoření UDP socketu.
sendto()
: Odesílání dat na specifikovanou IP adresu a port.
recvfrom()
: Přijímání dat a získávání informací o odesílateli.
close()
: Uzavření socketu.