Дикий Григорий

Full-stack веб-разработчик

Сетевые протоколы

HTTP запрос

Мы гуляем по просторам интернета и даже не знаем как это все работает. Вся эта магия на самом деле не магия, а технологии которые обновляются и совершенствуются. Прежде чем бит информации попадет к вам на монитор, он должен пройти километры, а то и тысячи километров минуя разные узлы своего пути. Разберем как же происходит HTTP запрос.

  1. Извлечение имени хоста. Когда ты кликаешь по ссылке, мой дорогой друг, ты запускаешь механизм, который нельзя остановить и первым делом браузер должен распознать имя хоста.
  2. Использование DNS. После того как хост определен, его надо преобразовать в ip адрес, но не для того, чтобы вычислить тебя по ip, а для того, чтобы найти сервер на котором хостится твой сайт.
  3. Установка соединения. Когда браузер знает местоположение сервера, то он устанавливает TCP соединение, а если у тебя еще https, то накладывает сверху TLS, который отвечает за безопасность твоих драгоценных данных, дабы не смог злоумышленник спереть твой акаунт.
  4. Формирование HTTP запроса. Когда сервер дал браузеру доступ на "общение", браузер формирует HTTP запрос, после чего сервер его анализирует и отдают в ответ другой документ.
  5. Закрытие соединения. Этого требует протокол для HTTP/1.0.
  6. Загрузка связанных ресурсов. Эти ресурсы помогают работать сайту и красиво отображаться у тебя на мониторе: css, js, image и другие файлы.

Сетевые протоколы образуют стек протоколов, то есть одни протоколы используют функции других протоколов. Схема передачи данных в общем виде:

HTTP -> TLS -> TCP -> IP -> Internet -> IP -> TCP -> TLS -> HTTP

Где за HTTP -> TLS - отвечает клиент или веб сервер, а за TCP -> IP отвечает ОС. Передаваемые данные формируют HTTP запрос, но его передача происходит не напрямую, а происходит вызов функции TLS, где данный протокол шифрует данные, после чего передает управление TCP, а тот после накладывания своих данных передает их IP и т.д. Когда данные попадают на сервер они перемещаются по стеку протоколов вверх.

DNS

Dns - база данных, которая хранит информацию о доменах, а именно отоборажение доменных имен на IP адреса машин, обслуживающих эти домены.

Как видно из рисунка, домены делятся на уровни и представляют собой древовидную структуру, где в качестве корневого домена используется точка. Стоит понимать, что база DNS распределена по всему миру, каждой зоне отводится некоторое количество доменов, причем разного уровня. В одной зоне может хранится множество доменов, а в свою очередь один домен может иметь множество зон. Адрес DNS сервера может быть прописан самостоятельно или его можно получить автоматически при подключении к вашему провайдеру, который почти всегда имеет свой сервер DNS имен. К примеру нам нужно обработать запрос: test.site.ru Обработка DNS запроса происходит по следующей схеме:

DNS клиент (Браузер) ->  DNS сервер (Провайдер) -> Корневой DNS сервер (.ru)
					       	                    -> DNS зоны .ru
					                            -> DNS зоны .site.ru

То есть DNS сервер провайдера 3 раза обращается к разным серверам за информацией. Но такой подход плохой, так как на корневые сервера очень большая нагрузка, для этого используют кэширование. Сам DNS сервер возвращает не только IP адрес, но и дополнительную информацию.

TCP

TCP протокол гарантирует доставку данных, в то время как IP нет, но что более важно TCP передает данные определенным программам, в то время, как IP просто осуществляет передачу данных между компьютерами. Фактически TCP предоставляет интерфейс похожий на файловый ввод/вывод интернет соединений.

Функции TCP:

  • Надежная доставка - осуществляется при помощи проверки Checksum.
  • Двухсторонняя передача - от клиента к серверу, от сервера к клиенту.
  • Контроль потока - защита от переполнения буфера.

TCP "порты" - адрес сетевого соединения в пределах одного хоста. Этим самым можно поддерживать множество открытых соединений. Номер порта - число не больше 65535 (2 байта), порты ниже 1024 требуют привилегий суперпользователя (системы UNIX) и некоторые их них исторически зарезервированы под определенные нужды.

  • 20, 21 - FTP
  • 22 - SSH
  • 25 - SMTP
  • 80 - HTTP
  • 443 - HTTPS

При TCP соединении происходит обмен 3 пакетами - тройное рукопожатие. Сначала клиент отправляет сегмент TCP с флагом SYN, сервер отвечает c флагами SYN+ACK, после клиент отправляет TCP сегмент ACK. Рассмотрим простейший код на Python:

import socket
req = "Hello"
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("127.0.0.1", 1234))
s.send(req)
rsp = s.recv(1024)
s.close()

Сначала мы импортируем библиотеку для работы с TCP. В 3 строчке создается объект сокета, причем параметр AF_INET говорит о том, что мы работаем с сетевыми сокетами, так как в UNIX есть еще и локальные сокеты, SOCK_STREAM говорит о том, что сокет будет использоваться для работы с TCP. После чего мы соединяемся с машиной, причем первый параметр адрес машины, а второй номер порта. Именно на этом шаге происходит "тройное рукопожатие". После этого мы можем отправлять данные и получаем ответ, где указываем размер данных которые мы хотим получать порциями.

TLS

TLS - криптографический протокол обеспечивающий безопасную передачу данных, т.е происходит шифрование данных. TLS протокол устанавливается поверх протокола TCP. Этот протокол обеспечивает:

  • Аунтефикация сервера (клиента)
  • Передача и сжатие передаваемой информации
  • Защита от подмены и проверки целостности сообщений

Проблема такого соединения является время, дело в том, что оно занимает иногда в три раза больше времени как при соединении через просто TCP соединение.