Перейти к основному содержимому

📄 Network Protocols (Сетевые протоколы)

1. Опишите TCP, HTTP, HTTPS, WebSocket

  1. TCP (Transmission Control Protocol): TCP — это надёжный, ориентированный на соединение протокол, используемый для надёжной передачи данных между двумя компьютерами в интернете. Он гарантирует порядок и надёжность пакетов — это означает, что данные доходят до места назначения в целости, независимо от сетевых условий.

  2. HTTP (Hypertext Transfer Protocol): HTTP — это протокол для передачи гипертекста (то есть веб-страниц). Он построен поверх TCP и обеспечивает способ коммуникации между браузерами и серверами. HTTP является stateless (без сохранения состояния), то есть сервер не хранит никакой информации о пользователе.

  3. HTTPS (Hypertext Transfer Protocol Secure): HTTPS — это безопасная версия HTTP. Он шифрует передачу данных HTTP через протокол SSL/TLS, защищая безопасность передаваемых данных и предотвращая атаки типа «человек посередине» (man-in-the-middle), тем самым обеспечивая конфиденциальность и целостность данных.

  4. WebSocket: Протокол WebSocket предоставляет способ установить постоянное соединение между клиентом и сервером, обеспечивая двунаправленную передачу данных в реальном времени после установления соединения. Это отличается от традиционных HTTP-запросов, где каждая передача требует установки нового соединения. WebSocket лучше подходит для коммуникации в реальном времени и приложений, требующих быстрого обновления данных.

2. Что такое трёхстороннее рукопожатие (Three-Way Handshake)?

Трёхстороннее рукопожатие — это процесс установления соединения между сервером и клиентом в сети TCP/IP. Процесс включает три шага для подтверждения того, что возможности отправки и получения обеих сторон работают нормально, а также для синхронизации начальных порядковых номеров (ISN) для обеспечения целостности и безопасности данных.

Типы TCP-сообщений

Прежде чем разбирать шаги, необходимо знать основную функцию каждого типа сообщения:

СообщениеОписание
SYNИспользуется для инициации и установления соединения, а также синхронизации порядковых номеров
ACKИспользуется для подтверждения получения SYN
SYN-ACKПодтверждение синхронизации — отправляет собственный SYN вместе с ACK
FINЗавершает соединение

Шаги

  1. Клиент инициирует соединение с сервером и отправляет SYN-сообщение, сообщая серверу, что он готов к коммуникации и каков его начальный порядковый номер.
  2. После получения SYN сервер готовит ответ. Он увеличивает полученный порядковый номер SYN на 1 и отправляет его обратно через ACK, а также отправляет собственное SYN-сообщение.
  3. Клиент подтверждает ответ сервера. Обе стороны установили стабильное соединение и начинают передачу данных.

Пример

Хост A отправляет TCP SYN-пакет, содержащий случайный порядковый номер, допустим 1000:

Host A ===(SYN=1000)===> Server

Серверу необходимо подтвердить порядковый номер хоста A, поэтому он увеличивает его на 1 и также отправляет собственный SYN:

Host A <===(SYN=2000 ACK=1001)=== Server

После получения SYN от сервера хост A отправляет подтверждение, увеличивая порядковый номер сервера на 1:

Host A ===(ACK=2001)===> Server

Достаточно ли двустороннего рукопожатия?

  1. Цель трёхстороннего рукопожатия — подтвердить, что и клиент, и сервер могут нормально отправлять и получать данные. При только двух рукопожатиях сервер не сможет проверить возможность приёма у клиента.
  2. Без третьего рукопожатия клиент не может получить порядковый номер сервера и, следовательно, не может отправить подтверждение. Это может поставить под угрозу безопасность данных.
  3. В условиях плохой сети данные могут приходить в разное время. Если старые и новые данные приходят не по порядку, установление соединения без подтверждения SYN третьего рукопожатия может привести к сетевым ошибкам.

Что такое ISN?

ISN расшифровывается как Initial Sequence Number (начальный порядковый номер). Он сообщает получателю, какой порядковый номер отправитель будет использовать при передаче данных. Это случайно сгенерированный порядковый номер для предотвращения угадывания его третьей стороной-злоумышленником и подделки сообщений.

В какой момент трёхстороннего рукопожатия можно начать передачу данных?

Первое и второе рукопожатия предназначены для подтверждения возможностей отправки/получения обеих сторон и не могут нести данные. Если бы данные могли передаваться при первом рукопожатии, злоумышленники могли бы заваливать сервер поддельными данными, заставляя его расходовать память на буферизацию — создавая возможность для атаки.

Только во время третьего рукопожатия, после того как обе стороны подтвердили синхронизацию и находятся в состоянии соединения, разрешена передача данных.

Ссылки

3. Опишите механизм HTTP-кэширования

Механизм HTTP-кэширования — это техника, используемая в протоколе HTTP для временного хранения (или «кэширования») веб-данных с целью снижения нагрузки на сервер, уменьшения задержки и ускорения загрузки страниц. Существует несколько основных стратегий кэширования:

  1. Свежесть (сильный кэш): Устанавливая заголовки ответа Expires или Cache-Control: max-age, данные могут считаться актуальными в течение определённого времени. Клиент может использовать кэшированные данные напрямую, не запрашивая подтверждение у сервера.

  2. Валидационный кэш: Используя заголовки ответа Last-Modified и ETag, клиент может отправить условный запрос серверу. Если данные не были изменены, сервер возвращает код состояния 304 (Not Modified), указывая, что можно использовать локальные кэшированные данные.

  3. Согласованный кэш (Negotiation Cache): Этот подход основан на заголовке ответа Vary. Сервер решает, предоставлять ли различные версии кэшированного контента на основе запроса клиента (например, Accept-Language).

  4. No-store: Если установлен Cache-Control: no-store, данные не должны кэшироваться вообще, и каждый запрос должен получать последние данные с сервера.

Выбор стратегии кэширования зависит от таких факторов, как тип данных и частота обновления. Эффективная стратегия кэширования может значительно улучшить производительность веб-приложений.

Service Worker

По личному опыту, после настройки PWA для веб-приложения, можно зарегистрировать базовые стили, логотипы или даже офлайн-страницу offline.html в service-worker.js. Таким образом, даже когда пользователь находится в офлайне, благодаря этому механизму кэширования он может быть осведомлён о текущем состоянии сайта или сети, сохраняя приемлемый пользовательский опыт.