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

Підсумок

Рівень представлення відповідає за:

  1. Кодування — ASCII, UTF-8, Base64
  2. Стиснення — gzip, Brotli, JPEG
  3. Шифрування — TLS/SSL, AES
  4. Формати даних — JSON, XML, Protocol Buffers
  5. Серіалізація — об'єкт ↔ байти

Див. також

Шлях: networking/basics/osi-6-presentation.md

UMTC Wiki © 2026 | Ukrainian Military Tactical Communications