TCP/IP — стек протоколів, що є фундаментом інтернету та більшості комп’ютерних мереж. Він об—єднує протокол TCP, відповідальний за надійну доставку даних, і IP, що забезпечує маршрутизацію пакетів між вузлами. За даними IETF RFC 1180 (2024), стек TCP/IP обробляє понад 80% світового мережевого трафіку, включаючи мобільні та веб-додатки. Стек протоколів визначає, як дані упаковуються, адресуються та передаються між пристроями в мережі.
Головне
TCP/IP (Transmission Control Protocol / Internet Protocol) — це стек протоколів, розроблений у 1970-х роках для ARPANET і став стандартом де-факто для глобальної мережі інтернет. Він визначає, як дані розбиваються на пакети, адресуються, передаються та збираються на стороні отримувача.
Архітектура TCP/IP побудована за багаторівневим принципом, де кожен рівень абстрагує певні функції. Прикладний рівень працює з даними додатка, транспортний — забезпечує надійність, мережевий — маршрутизацію, канальний — передачу по фізичному середовищу. Модульність дозволяє замінювати протоколи всередині рівня без зміни сусідніх.
У мобільній розробці TCP/IP використовується кожним додатком, що виконує мережеві запити. Бібліотеки URLSession, OkHttp, AFNetworking та Alamofire працюють поверх цього стека, приховуючи від розробника деталі упаковки та маршрутизації пакетів. Однак розуміння TCP/IP необхідне при оптимізації продуктивності: налаштування TCP-параметрів через URLSessionConfiguration дозволяє керувати тайм-аутами, підтримувати HTTP Persistent Connections та налаштовувати проксі для корпоративних середовищ.
Розуміння TCP/IP необхідне для діагностики мережевих проблем: якщо додаток не може підключитися до сервера, проблема може бути на будь-якому рівні стека — від фізичного каналу до прикладного протоколу. Інструменти на кшталт tcpdump, Wireshark і Charles Proxy дозволяють аналізувати трафік на кожному рівні та знаходити вузькі місця. Для мобільних розробників Xcode надає Network Debug Dashboard, а Android Studio — Network Inspector для аналізу TCP-з—єднань у реальному часі.
Модель TCP/IP включає чотири рівні, кожен з яких виконує суворо визначені функції під час передачі даних. Розуміння цієї ієрархії необхідне для діагностики мережевих проблем та оптимізації додатків.
На прикладному рівні працюють протоколи, з якими безпосередньо взаємодіють додатки: HTTP, HTTPS, FTP, SMTP, DNS, WebSocket. Цей рівень формує дані у форматі, зрозумілому додатку, і передає їх транспортному рівню. Розробники мобільних додатків працюють саме на цьому рівні через мережеві бібліотеки.
Транспортний рівень забезпечує передачу даних між додатками на різних пристроях. Основні протоколи: TCP (надійна передача з підтвердженням) і UDP (швидка передача без гарантій). TCP додає до даних порт відправника та отримувача, керує черговістю пакетів і контролює перевантаження мережі.
Мережевий рівень реалізується протоколом IP, який визначає адресацію (IPv4, IPv6) і маршрутизацію пакетів. Кожен пакет містить IP-адресу відправника та отримувача, а маршрутизатори на шляху прямування приймають рішення про наступний вузол на основі таблиць маршрутизації. IPv4 використовує 32-бітні адреси (близько 4,3 млрд), а IPv6 — 128-бітні, що вирішує проблему вичерпання адрес.
Канальний рівень працює з фізичним середовищем передачі: Ethernet, Wi-Fi, Bluetooth. Цей рівень перетворює пакети в сигнали і назад, керує доступом до середовища передачі через MAC-адреси та виявляє помилки фізичного рівня за допомогою контрольних сум кадру (FCS).
На канальному рівні працюють такі протоколи, як ARP (Address Resolution Protocol), який перетворює IP-адреси в MAC-адреси пристроїв у локальній мережі, і PPP (Point-to-Point Protocol), що використовується у VPN-з—єднаннях і мобільних мережах передачі даних.
| Рівень | Протоколи | Функція |
|---|---|---|
| Прикладний | HTTP, HTTPS, DNS, FTP, WebSocket | Формування даних додатка |
| Транспортний | TCP, UDP | Передача між додатками, контроль помилок |
| Мережевий | IP, ICMP, ARP | Маршрутизація та адресація пакетів |
| Канальний | Ethernet, Wi-Fi, PPP | Передача по фізичному середовищу |
TCP (Transmission Control Protocol) — один із головних протоколів транспортного рівня. Він забезпечує надійну, впорядковану та перевірену на помилки доставку потоку байтів між додатками. Перед передачею даних TCP встановлює з—єднання через триетапне рукостискання.
Триетапне рукостискання (three-way handshake) починається з відправлення клієнтом пакета SYN. Сервер відповідає пакетом SYN-ACK, підтверджуючи отримання. Клієнт завершує рукостискання пакетом ACK, після чого починається передача даних. Цей процес гарантує, що обидві сторони готові до обміну та синхронізовані за порядковими номерами.
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('example.com', 80))
sock.send(b'GET / HTTP/1.1\r\nHost: example.com\r\n\r\n')
response = sock.recv(4096)
print(response.decode())
sock.close()
У прикладі створюється TCP-сокет із типом SOCK_STREAM, який автоматично виконує триетапне рукостискання під час виклику connect. Метод send передає HTTP-запит, recv отримує відповідь. Після завершення close надсилає FIN-пакет для коректного закриття з—єднання.
Розглянемо приклад TCP-сервера на Python, який приймає кількох клієнтів через потоки. Кожне підключення обробляється в окремому потоці, що дозволяє обслуговувати безліч клієнтів одночасно без блокування основного циклу.
import socket
import threading
def handle_client(conn, addr):
print(f'Підключено клієнта: {addr}')
with conn:
while True:
data = conn.recv(1024)
if not data:
break
conn.sendall(data.upper())
print(f'Клієнта {addr} відключено')
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('0.0.0.0', 9090))
server.listen(5)
print('TCP-сервер запущено на порту 9090')
while True:
conn, addr = server.accept()
thread = threading.Thread(target=handle_client, args=(conn, addr))
thread.start()
TCP-сервер обробляє кожне підключення в окремому потоці, викликаючи accept у нескінченному циклі. Функція handle_client отримує дані, перетворює їх у верхній регістр і відправляє назад через sendall. Після завершення циклу recv (коли клієнт закрив з—єднання) потік завершується, і сокет автоматично закривається. У мобільних додатках така низькорівнева робота з сокетами не використовується безпосередньо — мобільні HTTP-бібліотеки керують з—єднаннями через пули потоків і автоматично перевикористовують TCP-з—єднання.
Вибір між TCP і UDP — одне з ключових рішень при проектуванні мережевої взаємодії. TCP гарантує доставку, порядок і цілісність даних ціною додаткових затримок. UDP жертвує надійністю заради мінімальної затримки та меншого навантаження на канал.
| Характеристика | TCP | UDP |
|---|---|---|
| З—єднання | Встановлює (рукостискання) | Не встановлює |
| Надійність | Гарантує доставку | Не гарантує |
| Порядок пакетів | Упорядковує | Не упорядковує |
| Швидкість | Нижча | Вища |
| Застосування | Веб, email, файли | Стримінг, ігри, DNS |
Для мобільних додатків вибір протоколу залежить від сценарію: REST-API та завантаження даних вимагають TCP, а відеодзвінки та онлайн-ігри виграють від швидкості UDP. Деякі додатки комбінують обидва протоколи — TCP для керування та UDP для медіапотоку. Сучасний протокол QUIC, що працює поверх UDP і використовується в HTTP/3, поєднує переваги обох підходів і вже підтримується на iOS та Android через URLSession автоматично.
Розглянемо приклад TCP-клієнта на Python з обробкою помилок і тайм-аутом. Такий підхід використовується в мобільних додатках для надійного з—єднання з сервером.
import socket
import sys
def tcp_client(host, port):
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(10)
sock.connect((host, port))
print(f'Підключено до {host}:{port}')
return sock
except socket.error as err:
print(f'Помилка підключення: {err}')
sys.exit(1)
sock = tcp_client('api.example.com', 443)
sock.close()
Функція tcp_client приймає хост і порт, створює сокет із тайм-аутом 10 секунд і намагається підключитися. При помилці з—єднання — наприклад, недоступності сервера або блокуванні firewall — викидається виняток з описом проблеми. У мобільних додатках тайм-аут з—єднання критичний: занадто короткий призводить до хибних помилок на повільних мережах, занадто довгий — до зависання інтерфейсу. Рекомендоване значення для мобільних мереж — 10–15 секунд для timeoutIntervalForRequest і 30–60 секунд для timeoutIntervalForResource у конфігурації URLSession.
Часто задавані питання
IP відповідає за маршрутизацію — доставку пакета від відправника до отримувача через проміжні вузли. TCP забезпечує надійне збирання даних: контролює порядок, перевіряє цілісність і запитує повторну передачу втрачених пакетів. Разом вони утворюють стек TCP/IP.
TCP/IP не використовує фіксований порт — порт призначається додатком. Стандартні порти: 80 (HTTP), 443 (HTTPS), 22 (SSH), 25 (SMTP). Порт 443 — основний для захищеного веб-трафіку в мобільних додатках.
TCP-з—єднання — логічний канал між двома додатками, встановлений через триетапне рукостискання (SYN, SYN-ACK, ACK). З—єднання ідентифікується парою (IP-адреса, порт) відправника та отримувача. Рукостискання гарантує, що обидві сторони готові до обміну даними.
Так, TCP/IP працює в локальних мережах (LAN) без виходу в інтернет. Пристрої підключаються через Wi-Fi Direct, Bluetooth PAN або Ethernet і обмінюються даними за локальними IP-адресами. Локальний TCP/IP використовується в IoT-пристроях та peer-to-peer додатках.
TCP повільніший через додаткові механізми: триетапне рукостискання перед передачею, підтвердження кожного пакета, повторне відправлення втрачених сегментів, контроль перевантаження. UDP надсилає дейтаграми без цих перевірок, що знижує затримку ціною можливих втрат.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також