OSI L6: Рівень представлення (Presentation Layer)¶
Що таке рівень представлення?¶
Рівень представлення відповідає за форматування та трансформацію даних між мережевим форматом та форматом, зрозумілим додатку. Він виконує три основні функції: кодування, стиснення та шифрування.
┌─────────────────────────────────────────────────────────────────┐
│ L6 = "Перекладач" між додатком та мережею │
│ │
│ Application Data ──▶ [Encoding] ──▶ [Compression] ──▶ │
│ [Encryption] ──▶ Network │
│ │
│ Приклад: │
│ JSON object → UTF-8 → gzip → TLS encrypt → передача │
└─────────────────────────────────────────────────────────────────┘
Примітка: У TCP/IP моделі L6 об'єднаний з L5 і L7 в Application Layer. Більшість L6 функцій виконуються бібліотеками та протоколами L7.
Функції рівня представлення¶
1. Кодування (Encoding/Translation)¶
Перетворення даних між різними представленнями.
┌─────────────────────────────────────────────────────────────────┐
│ Текст "Hello" в різних кодуваннях │
│ │
│ ASCII: 48 65 6C 6C 6F │
│ UTF-8: 48 65 6C 6C 6F (для латиниці ідентичний) │
│ UTF-16 LE: 48 00 65 00 6C 00 6C 00 6F 00 │
│ UTF-16 BE: 00 48 00 65 00 6C 00 6C 00 6F │
│ │
│ "Привіт" в UTF-8: │
│ D0 9F D1 80 D0 B8 D0 B2 D1 96 D1 82 │
└─────────────────────────────────────────────────────────────────┘
2. Стиснення (Compression)¶
Зменшення розміру даних для ефективної передачі.
┌─────────────────────────────────────────────────────────────────┐
│ Оригінал: "AAAAABBBCCCCCCDDDD" (18 байт) │
│ │
│ RLE: "5A3B6C4D" (8 байт) │
│ (Run-Length Encoding) │
│ │
│ gzip: [compressed binary] (~10-15 байт для цього) │
│ │
│ Compression ratio: 18/8 = 2.25x │
└─────────────────────────────────────────────────────────────────┘
3. Шифрування (Encryption)¶
Захист конфіденційності даних.
┌─────────────────────────────────────────────────────────────────┐
│ Plaintext: "Secret message" │
│ │ │
│ ▼ [Encrypt with key] │
│ Ciphertext: "x7Gh2kL9pQ..." (нечитабельний) │
│ │ │
│ ▼ [Decrypt with key] │
│ Plaintext: "Secret message" │
└─────────────────────────────────────────────────────────────────┘
Кодування символів¶
ASCII (7-bit)¶
┌─────────────────────────────────────────────────────────────────┐
│ ASCII — American Standard Code for Information Interchange │
│ 128 символів (0-127) │
│ │
│ 0-31: Control characters (невидимі) │
│ 32-126: Printable characters │
│ 127: DEL │
│ │
│ Приклади: │
│ 'A' = 65 = 0x41 │
│ 'a' = 97 = 0x61 │
│ '0' = 48 = 0x30 │
│ ' ' = 32 = 0x20 │
│ '\n' = 10 = 0x0A (new line) │
└─────────────────────────────────────────────────────────────────┘
Unicode та UTF-8¶
┌─────────────────────────────────────────────────────────────────┐
│ Unicode — універсальний стандарт (1,114,112 code points) │
│ │
│ UTF-8 encoding (змінна довжина): │
│ │
│ 1 byte: 0xxxxxxx (ASCII, 0-127) │
│ 2 bytes: 110xxxxx 10xxxxxx (128-2047) │
│ 3 bytes: 1110xxxx 10xxxxxx 10xxxxxx (2048-65535) │
│ 4 bytes: 11110xxx 10xx... 10xx... 10xx... (65536+) │
│ │
│ Приклади: │
│ 'A' = U+0041 = 0x41 (1 byte) │
│ 'є' = U+0454 = 0xD1 0x94 (2 bytes) │
│ '中' = U+4E2D = 0xE4 0xB8 0xAD (3 bytes) │
│ '😀' = U+1F600 = 0xF0 0x9F 0x98 0x80 (4 bytes) │
└─────────────────────────────────────────────────────────────────┘
Base64¶
Кодування бінарних даних у текстовий формат (A-Z, a-z, 0-9, +, /).
┌─────────────────────────────────────────────────────────────────┐
│ Base64 — для передачі binary через text-only канали │
│ │
│ Вхід: "Hi" │
│ Binary: 01001000 01101001 │
│ Groups: 010010 000110 1001XX (padding with =) │
│ Base64: S G l = │
│ Result: "SGk=" │
│ │
│ Overhead: ~33% (3 bytes → 4 characters) │
│ │
│ Використання: │
│ • Email attachments (MIME) │
│ • Inline images in HTML (data:image/png;base64,...) │
│ • JWT tokens │
│ • API передача binary │
└─────────────────────────────────────────────────────────────────┘
# Linux приклади
echo -n "Hello" | base64
# SGVsbG8=
echo "SGVsbG8=" | base64 -d
# Hello
Стиснення даних¶
Lossless (без втрат)¶
┌─────────────────────────────────────────────────────────────────┐
│ Алгоритм │ Використання │
├────────────────────┼────────────────────────────────────────────┤
│ gzip/deflate │ HTTP compression, файли │
│ Brotli │ HTTP (краще за gzip для web) │
│ LZ4 │ Швидке стиснення (бази даних) │
│ Zstd │ Facebook, сучасна альтернатива │
│ LZMA/xz │ Максимальне стиснення (архіви) │
└────────────────────┴────────────────────────────────────────────┘
HTTP Compression¶
┌─────────────────────────────────────────────────────────────────┐
│ Client Request: │
│ GET /page HTTP/1.1 │
│ Accept-Encoding: gzip, deflate, br │
│ │
│ Server Response: │
│ HTTP/1.1 200 OK │
│ Content-Encoding: gzip │
│ Content-Length: 1234 (стиснутий розмір) │
│ │
│ [gzip compressed body] │
│ │
│ Економія: 60-90% для текстового контенту (HTML, CSS, JS) │
└─────────────────────────────────────────────────────────────────┘
Lossy (з втратами)¶
┌─────────────────────────────────────────────────────────────────┐
│ Формат │ Використання │ Втрати │
├───────────┼─────────────────────┼──────────────────────────────┤
│ JPEG │ Фотографії │ Візуально непомітні │
│ MP3 │ Музика │ Нечутні частоти │
│ H.264 │ Відео │ Візуально непомітні │
│ Opus │ VoIP, streaming │ Оптимізовано для мови │
└───────────┴─────────────────────┴──────────────────────────────┘
Шифрування¶
Симетричне шифрування¶
┌─────────────────────────────────────────────────────────────────┐
│ Один ключ для шифрування та дешифрування │
│ │
│ Alice Bob │
│ │ │ │
│ │ Key: "secret123" │ │
│ │ ════════════════════════════════════════▶ │ │
│ │ (треба безпечно передати ключ!) │ │
│ │ │ │
│ │ Encrypt("Hello", key) = "x7Gh..." │ │
│ │ ════════════════════════════════════════▶ │ │
│ │ │ │
│ │ Decrypt("x7Gh...", key) = "Hello" │
│ │
│ Алгоритми: AES-256, ChaCha20 │
└─────────────────────────────────────────────────────────────────┘
Асиметричне шифрування¶
┌─────────────────────────────────────────────────────────────────┐
│ Пара ключів: публічний (шифрування) + приватний (дешифрування)│
│ │
│ Alice Bob │
│ │ │ │
│ │ Bob's Public Key │ │
│ │ ◀════════════════════════════════════════════ │ │
│ │ (можна передати відкрито!) │ │
│ │ │ │
│ │ Encrypt("Hello", Bob's Public Key) │ │
│ │ ════════════════════════════════════════▶ │ │
│ │ │ │
│ │ Decrypt(..., Bob's Private Key) = "Hello" │
│ │ (тільки Bob може розшифрувати!) │
│ │
│ Алгоритми: RSA, ECDSA, Ed25519 │
└─────────────────────────────────────────────────────────────────┘
SSL/TLS на L6¶
┌─────────────────────────────────────────────────────────────────┐
│ TLS Handshake (спрощено) │
│ │
│ Client Server │
│ │ │ │
│ │ 1. ClientHello (TLS versions, ciphers) │ │
│ │ ─────────────────────────────────────────▶ │ │
│ │ │ │
│ │ 2. ServerHello + Certificate │ │
│ │ ◀───────────────────────────────────────── │ │
│ │ │ │
│ │ 3. Key Exchange (asymmetric) │ │
│ │ ═════════════════════════════════════════▶ │ │
│ │ │ │
│ │ 4. Session Keys derived (symmetric) │ │
│ │ │ │
│ │ ═══════════ Encrypted Communication ═══════ │ │
│ │ (AES-256-GCM з session key) │ │
│ │
└─────────────────────────────────────────────────────────────────┘
Формати даних¶
Текстові формати¶
JSON (JavaScript Object Notation)¶
{
"name": "Іван",
"age": 25,
"active": true,
"skills": ["Python", "Linux", "Networking"],
"address": {
"city": "Київ",
"country": "UA"
}
}
XML (eXtensible Markup Language)¶
<?xml version="1.0" encoding="UTF-8"?>
<user>
<name>Іван</name>
<age>25</age>
<active>true</active>
<skills>
<skill>Python</skill>
<skill>Linux</skill>
</skills>
</user>
YAML (YAML Ain't Markup Language)¶
name: Іван
age: 25
active: true
skills:
- Python
- Linux
- Networking
address:
city: Київ
country: UA
Бінарні формати¶
┌─────────────────────────────────────────────────────────────────┐
│ Формат │ Використання │ Характеристика │
├───────────────┼────────────────────────┼───────────────────────┤
│ Protocol Buf │ gRPC, Google services │ Компактний, швидкий │
│ MessagePack │ API, caching │ "Binary JSON" │
│ BSON │ MongoDB │ JSON + binary types │
│ Avro │ Hadoop, Kafka │ Schema evolution │
│ Thrift │ Facebook services │ Cross-language RPC │
└───────────────┴────────────────────────┴───────────────────────┘
Медіа формати¶
Зображення¶
┌─────────────────────────────────────────────────────────────────┐
│ Формат │ Стиснення │ Прозорість │ Використання │
├─────────┼───────────┼────────────┼─────────────────────────────┤
│ JPEG │ Lossy │ Ні │ Фотографії │
│ PNG │ Lossless │ Так │ Графіка, скріншоти │
│ GIF │ Lossless │ Так (1-bit)│ Анімації (застарілий) │
│ WebP │ Both │ Так │ Web (сучасний) │
│ AVIF │ Lossy │ Так │ Web (найновіший) │
│ SVG │ Vector │ Так │ Іконки, логотипи │
└─────────┴───────────┴────────────┴─────────────────────────────┘
Відео¶
┌─────────────────────────────────────────────────────────────────┐
│ Codec │ Container │ Використання │
├───────────┼───────────┼─────────────────────────────────────────┤
│ H.264 │ MP4, MKV │ Універсальний, найпоширеніший │
│ H.265 │ MP4, MKV │ Краще стиснення, 4K │
│ VP9 │ WebM │ YouTube, Web │
│ AV1 │ WebM, MP4 │ Майбутній стандарт, найкраще стиснення │
└───────────┴───────────┴─────────────────────────────────────────┘
Серіалізація¶
Що таке серіалізація?¶
┌─────────────────────────────────────────────────────────────────┐
│ Серіалізація — перетворення об'єктів у формат для передачі │
│ │
│ Object in Memory Serialized Format │
│ ┌───────────────────┐ ┌────────────────────┐ │
│ │ User { │ │ {"name": "Ivan", │ │
│ │ name: "Ivan" │ ──────▶ │ "age": 25} │ │
│ │ age: 25 │ Serialize │ │ │
│ │ } │ │ (JSON string) │ │
│ └───────────────────┘ └────────────────────┘ │
│ │
│ Передача через мережу... │
│ │
│ Serialized Format Object in Memory │
│ ┌────────────────────┐ ┌───────────────────┐ │
│ │ {"name": "Ivan", │ │ User { │ │
│ │ "age": 25} │ ──────▶ │ name: "Ivan" │ │
│ │ │ Deserialize │ age: 25 │ │
│ │ (JSON string) │ │ } │ │
│ └────────────────────┘ └───────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
Приклади в Python¶
import json
# Серіалізація
data = {"name": "Іван", "skills": ["Python", "Linux"]}
json_string = json.dumps(data, ensure_ascii=False)
# '{"name": "Іван", "skills": ["Python", "Linux"]}'
# Десеріалізація
parsed = json.loads(json_string)
# {'name': 'Іван', 'skills': ['Python', 'Linux']}
Практичні приклади¶
HTTP Content Negotiation¶
┌─────────────────────────────────────────────────────────────────┐
│ Request: │
│ GET /api/users HTTP/1.1 │
│ Accept: application/json │
│ Accept-Encoding: gzip, br │
│ Accept-Language: uk, en │
│ │
│ Response: │
│ HTTP/1.1 200 OK │
│ Content-Type: application/json; charset=utf-8 │
│ Content-Encoding: br │
│ Content-Language: uk │
│ │
│ [Brotli compressed JSON in UTF-8, Ukrainian language] │
└─────────────────────────────────────────────────────────────────┘
HTTPS = HTTP + TLS¶
# Перевірити TLS з'єднання
openssl s_client -connect example.com:443
# Вивід включає:
# - Certificate chain
# - Cipher suite (e.g., TLS_AES_256_GCM_SHA384)
# - TLS version (TLSv1.3)
File type detection (Magic bytes)¶
┌─────────────────────────────────────────────────────────────────┐
│ Magic Bytes — перші байти файлу визначають формат │
│ │
│ PNG: 89 50 4E 47 0D 0A 1A 0A (.PNG....) │
│ JPEG: FF D8 FF (ÿØÿ) │
│ PDF: 25 50 44 46 (%PDF) │
│ ZIP: 50 4B 03 04 (PK..) │
│ GIF: 47 49 46 38 (GIF8) │
│ ELF: 7F 45 4C 46 (.ELF) │
└─────────────────────────────────────────────────────────────────┘
# Linux: визначити тип файлу
file image.jpg
# image.jpg: JPEG image data, JFIF standard 1.01
# Hex dump перших байтів
xxd -l 16 image.jpg
# 00000000: ffd8 ffe0 0010 4a46 4946 0001 0101 0048 ......JFIF.....H
Діагностика L6¶
Перевірка кодування¶
# Визначити кодування файлу
file -i document.txt
# document.txt: text/plain; charset=utf-8
# Конвертувати кодування
iconv -f CP1251 -t UTF-8 input.txt > output.txt
# Hex dump для аналізу
hexdump -C file.txt | head
Перевірка стиснення¶
# HTTP response headers
curl -I -H "Accept-Encoding: gzip" https://example.com
# Content-Encoding: gzip
# Розмір без стиснення vs зі стисненням
curl -s https://example.com | wc -c
curl -s --compressed https://example.com | wc -c
Перевірка TLS¶
# Інформація про сертифікат
openssl s_client -connect example.com:443 -brief
# Cipher suites
nmap --script ssl-enum-ciphers -p 443 example.com
# Перевірка TLS конфігурації
# https://www.ssllabs.com/ssltest/
Типові проблеми та рішення¶
| Проблема | Симптоми | Рішення |
|---|---|---|
| Encoding mismatch | Кракозябри "пÑивÑÑ" | Встановити правильний charset |
| Missing compression | Великий transfer size | Увімкнути gzip/brotli |
| TLS handshake failed | Connection error | Перевірити сертифікат/ciphers |
| Invalid JSON | Parse error | Валідувати JSON, escape symbols |
| Binary in text channel | Corrupted data | Використати Base64 |
Підсумок¶
Рівень представлення відповідає за:
- Кодування — ASCII, UTF-8, Base64
- Стиснення — gzip, Brotli, JPEG
- Шифрування — TLS/SSL, AES
- Формати даних — JSON, XML, Protocol Buffers
- Серіалізація — об'єкт ↔ байти
Див. також¶
- Модель OSI — огляд всіх рівнів
- Сеансовий рівень — попередній рівень
- Прикладний рівень — наступний рівень
- TLS/SSL — детально про шифрування
- Криптографія — основи криптографії
Шлях: networking/basics/osi-6-presentation.md