OSI (Open Systems Interconnection) — это эталонная модель (1977, ISO), которая объясняет, как устроено взаимодействие компьютеров в сети. Она теоретическая — используется для обучения и анализа, но в чистом виде в реальности не применяется. При этом знать её всё равно важно: на её основе строятся практические модели, а ещё про неё часто спрашивают на собеседованиях.
Уровни OSI (сверху вниз)
- Прикладной (Application) — приложения (HTTP, FTP, SMTP).
- Представительный (Presentation) — преобразование форматов данных: шифрование, сжатие, кодировки.
- Сеансовый (Session) — управление сессиями: установление, поддержка, завершение.
- Транспортный (Transport) — доставка данных от приложения к приложению по протоколам: TCP, UDP.
- Сетевой (Network) — маршрутизация: IP, ICMP.
- Канальный (Data Link) — доставка между соседними узлами: Ethernet, Wi-Fi.
- Физический (Physical) — кабели, радио, электрические сигналы.
TCP/IP — надежный сетевой протокол
Уровни TCP/IP:
- Физический (Physical). Передача битов в виде электрических сигналов, радиоволн или света. Среды: витая пара, оптоволокно, радиоэфир.
- Прикладной (Application). Всё, что связано с пользовательскими приложениями. Протоколы: HTTP, HTTPS, FTP, DNS, SMTP, POP3, SSH.
- Транспортный (Transport). Доставка данных от процесса к процессу. Протоколы: TCP, UDP, QUIC.
- Сетевой (Internet / Network). Отвечает за маршрутизацию пакетов между устройствами в разных сетях. Протоколы: IP (IPv4/IPv6), ICMP, ARP.
- Канальный (Data Link). Доставка кадров между соседними устройствами в пределах одной сети. Протоколы: Ethernet, Wi-Fi (802.11), PPP, ATM.
В модели TCP/IP на практике канальный и физический уровни часто объединяют в один. Но для учебных целей их разделяют.

Протокол TCP — надежный но медленный. Для установления соединения сервер и клиент должны обменяться «рукопожатиями».

На этой схеме происходит следующее:
- Клиент отправляет серверу сегмент с установленным флагом SYN (synchronize) и случайно сгенерированным начальным порядковым номером данных (Initial Sequence Numbe, ISN). Этот шаг — инициация соединения и желание синхронизировать последовательности нумерации данных между узлами.
- Сервер, получив SYN-сегмент, отвечает сегментом с установленными флагами SYN и ACK (acknowledgment). В этом отклике содержится собственный ISN сервера и номер подтверждения (Acknowledgment Number), равный ISN клиента, увеличенному на единицу.
- Клиент посылает сегмент с флагом ACK, где Acknowledgment Number равен ISN сервера, увеличенному на единицу. После этой процедуры двунаправленное соединение считается установленным и может начаться обмен данными.
В результате TCP гарантирует, что данные будут отправлены правильному адресату, но на установку соединения тратится время.
Также для повышения надёжности у TCP есть механизм backpressure. Его суть в следующем: если получатель данных не успевает их принять, он может «попросить» у отправителя передавать их медленнее. Сам отправитель тоже следит за сетью — проверяет, сколько данных не было принято, и может снизить скорость отправки.
Кроме того, TCP следит, чтобы данные приходили по порядку и без потерь. Если какой-то кусок информации по дороге потерялся или повредился, TCP сам запросит его повторно.
Благодаря этим проверкам TCP очень надёжен, но из-за постоянных подтверждений и повторных запросов он работает медленнее, чем UDP. Например, видеозвонок по TCP мог бы часто зависать, дожидаясь «потерянных» пакетов.
Используйте TCP, когда:
- Критична надёжность и недопустима потеря даже одного байта. Это важно, например, при передаче файлов — ведь из-за потерянного байта файл может сломаться и просто не открыться. Или при работе с транзакциями, где потеря данных = потере реальных денег. В Rust при работе с TCP вы получаете гарантию, что все записанные данные либо доставлены, либо вы получите ошибку.
- Требуется упорядоченность данных. TCP автоматически собирает пакеты в правильном порядке. Это упрощает разработку протоколов прикладного уровня — вы работаете с последовательным потоком без необходимости нумеровать сообщения самостоятельно.
- Размер передаваемых данных большой. TCP эффективно работает с большими объёмами благодаря механизмам контроля потока и окон. Для передачи мегабайтов или гигабайтов данных TCP — самый логичный выбор.
- Нужна защита от перегрузки сети. TCP автоматически снижает скорость при обнаружении перегрузки, что важно для стабильности интернета в целом. Это особенно критично для приложений с непредсказуемым трафиком.
UDP — скоростной сетевой протокол
UDP (User Datagram Protocol) — это быстрый сетевой протокол транспортного уровня. Он отправляет данные (датаграммы) напрямую, не требуя установки соединения и не проверяя, дошли ли они. За счет отсутствия таких проверок UDP обеспечивает минимальные задержки, но не гарантирует порядок или доставку пакетов.
Главное отличие UDP , его скорость и легкость. Он не обеспечивает надежной доставки, не требует рукопожатий и не соблюдает порядок пакетов. Все это ему не нужно, ведь цели у протокола совершенно иные.
Представьте, что вы звоните другому абоненту и в моменте слышите, что часть слов потеряна. Так работает UDP. Вместо того чтобы накапливать буфер информации, он отдает ее сразу как только получает. Потерявшиеся пакеты не будут отправлены заново соединение устанавливается мгновенно.
Более того, UDP поддерживает рассылку большому количеству клиентов. КОгда десятки тысяч игроков получают уведомление в игре практически одновременно — практически наверняка используется протокол UDP.
Используйте UDP, когда:
- Скорость и задержки критичнее надёжности. В реальном времени лучше пропустить устаревшие данные, чем ждать их повторной передачи. Примеры: видеоконференции, онлайн-игры, VoIP. В игре задержка в 500 мс из-за повторной передачи хуже, чем потеря одного кадра.
- Требуется широковещательная или многоадресная рассылка (multicast). TCP работает только точка-точка, а UDP поддерживает отправку одного пакета множеству получателей. Это используется в протоколах обнаружения сервисов, потоковом видео для множества клиентов.
- Приложение само реализует надёжность. Если вам нужен специфический механизм повторной передачи или частичная надёжность, UDP предоставляет чистый лист. Например, QUIC (основа HTTP/3) построен поверх UDP и реализует собственную логику надёжности.
- Нужна минимальная задержка установления соединения. UDP не требует рукопожатия, первый пакет с данными отправляется немедленно. Для коротких запросов (DNS, простые RPC) это существенно быстрее.
Как реализованы в зыке Rust
В Rust транспортные протоколы реализованы в стандартной библиотеке std::net. Обратите внимание, как API отражает разницу между протоколами:
- TCP —
TcpListener(сервер, принимает входящие соединения) иTcpStream(клиент или уже установленное соединение).TcpStreamреализует трейтыReadиWrite, то есть с ним можно работать как с обычным байтовым потоком — читать и писать данные так же, как в файл. - UDP —
UdpSocket. В отличие от TCP, здесь нет потока: каждый вызовsend_toиrecv_from— это отдельная датаграмма, независимая от предыдущей.
