HTTP & REST, TCP IP - Max-Starling/Notes GitHub Wiki
...TCP/IP
Что происходит, когда ты вводишь что-то в Google search и кликаешь Enter?
Сперва браузер проверяет, является ли введённая строка фактическим URL или
поисковым термином. Если нет, то используется поисковая система по умолчанию.
Пусть введён фактический URL.
Когда кликается Enter, браузер сперва пытается построить полный URL.
Например: если мы ввели только домен (smth.com), то браузер поставит в начало
HTTP://, потому что протокол HTTP ставится по умолчанию.
Этап поиска DNS
Браузер начинает DNS поиск, чтобы получить IP адрес сервера.
Доменная обёртка - удобное сокращение для людей.
Но интернет построен так, что компьютеры могут найти точное расположение
сервера по его IP адресу (множеству цифр и точек).
Для начала проверяется локальный кэш DNS на случай, если разрешался недавно.
Если ничего не найдено, то браузер использует DNS распознаватель (resolver),
используя gethostbyname POSIX систему для получения информации о хосте.
gethostbyname
Система gethostbyname cперва проверяет локальные файлы (/etc/hosts), чтобы
узнать, хванится ли информация локально.
Если никакая информация о домене не хранится, то система делает запрос к DNS
серверу.
Адрес DNS-сервера сохраняется в системных настройках.
Браузер выполняет запрос DNS по протоколу UDP.
TCP и UDP - фундаментальные протоколы компьютерных сетей. Они находятся на одном
концептуальном уровне, но TCP ориентирования на установление соединения, а UDP -
протокол без установления соединения. UDP более легковесный, он используется для
отправки сообщений с небольшими затратами.
DNS сервер может хранить IP домена в кэше. Если нет, то он спрашивает корневой
DNS сервер (система из множества серверов по всему миру, которая управляет всем
интернетом).
DNS сервер не знает адреса каждого доменного имени на планете, но зато он знает
DNS-распознователей верхнего уровня.
Пример расширения домена верхнего уровня: .com
Как только корневой DNS-сервер получает запрос, он перенаправляет запрос на
TLD (top level domain) DNS-сервер.
Теперь DNS-распознаватель кэширует IP TLD-сервера, чтобы не пришлось обращаться
к корневому DNS серверу снова с этим запросом.
TLD-сервер знает IP-адреса официальных серверов имен для домена, который мы
ищем. Потому что, когда вы покупаете домен, регистратор домена отправляет
соответствующее описание серверам имен. При обновлении серверов (например,
смена провайдера) имен эта информация автоматически обновляется регистратором
домена.
Рукопожатия в TCP запросах
При помощи найденного IP адреса сервера, браузер может инициировать TCP
соединение.
TCP соединение подразумевает предварительную проверку перед тем, как начать
отправлять данные.
Когда соединение установлено, можно отправлять запрос
Запрос и ответ
Запрос (request) - обычный текстовый документ, имеющий точную схему, определённую
протоколом связи.
Запрос состоит из 3 частей:
- строка запроса (request line)
- заголовок запроса (request header)
- тело запроса (request body)
Строка запроса состоит из HTTP метода, расположения ресурса и версии протокола:
GET / HTTP/1.1
Заголовок запроса - множество пар ключ-значение.
Основные поля:
Host: smth.com // хост
Connection: close // всегда close
Тело запроса является необязательным. В методе GET не используется, но часто
используется в методе POST.
Ответ так же, как и запрос, состоит из строки ответа, заголовка и тела.
Строка ответа состоит из статус кода и сообщения:
200 OK
404 Not Found
500 Internal Server Error
Что такое HTTP ?
HTTP (HyperText Transfer Protocol — «протокол передачи гипертекста») —
протокол прикладного уровня передачи данных.
В его основу входит технология Клиент-Сервер.
Клиенты и серверы обмениваются сообщениями по шаблону "запрос-ответ" (“request–response”):
Клиент отправляет запрос, сервер возвращает ответ.
Отслеживать эти сообщения непросто, поэтому клиент и сервер придерживаются общего языка и
набора правил, чтобы понимать друг друга. Этот язык или «протокол» называется HTTP.
Протокол HTTP определяет синтаксис (формат данных и кодирование), семантику
(значение, связанное с синтаксисом) и время (скорость и последовательность).
Каждый HTTP-запрос и ответ считается отдельной HTTP-транзакцией.
Во-первых, HTTP основан на текстовых данных: сообщения, которыми обмениваются клиент и сервер,
представляют собой биты текста. Каждое сообщение состоит из двух частей: header и body.
Во-вторых,** HTTP - это протокол прикладного уровня**, то есть это просто уровень абстракции, который стандартизирует взаимодействие хостов.
Сам HTTP не передаёт данные.
Он зависит от базового протокола TCP / IP, чтобы получить запрос и ответ от
одного компьютера к другому.
Основным объектом манипуляции в HTTP является ресурс, на который указывает URI (Uniform Resource Identifier) в запросе клиента. Обычно такими ресурсами являются хранящиеся на сервере файлы, но ими могут быть логические объекты или что-то абстрактное. Особенностью протокола HTTP является возможность указать в запросе и ответе способ представления одного и того же ресурса по различным параметрам: формату, кодировке, языку и т. д. (в частности, для этого используется HTTP-заголовок). Именно благодаря возможности указания способа кодирования сообщения, клиент и сервер могут обмениваться двоичными данными, хотя данный протокол является текстовым.
HTTP — протокол прикладного уровня; аналогичными ему являются FTP и SMTP. Обмен сообщениями идёт по обыкновенной схеме «запрос-ответ». Для идентификации ресурсов HTTP использует глобальные URI. В отличие от многих других протоколов, HTTP не сохраняет своего состояния. Это означает отсутствие сохранения промежуточного состояния между парами «запрос-ответ». Компоненты, использующие HTTP, могут самостоятельно осуществлять сохранение информации о состоянии, связанной с последними запросами и ответами (например, «куки» на стороне клиента, «сессии» на стороне сервера). Браузер, посылающий запросы, может отслеживать задержки ответов. Сервер может хранить IP-адреса и заголовки запросов последних клиентов. Однако сам протокол не осведомлён о предыдущих запросах и ответах, в нём не предусмотрена внутренняя поддержка состояния, к нему не предъявляются такие требования.
Простой HTTP-запрос или ответ не зашифрован и уязвим для различных типов атак
безопасности. HTTPS, с другой стороны, является более безопасной версией протокола, которая
использует шифрование для обеспечения безопасности. Он обозначает HTTP через TLS / SSL.
SSL - это протокол безопасности, который позволяет клиенту и серверу безопасно
обмениваться данными по сети, предотвращая подслушивание и фальсификацию, в то
время как сообщение передается по сети.
HTTP Header
Заголовки HTTP обычно содержат метаданные (данные о данных).
Метаданные включают:
- request type (GET, POST, PUT, DELETE)
- path
- status code
- content-type
- user-agent
- cookie
HTTP Body
Тело сообщения. В зависимости от типа запроса его может и не быть.
HTTP Methods
HTTP-глаголы (verbs) или методы сообщают серверу, что делать с данными,
указанными в URL.
URL всегда идентифицируют определенный ресурс.
Когда клиент использует URL в сочетании с методом HTTP, он сообщает серверу,
какое действие должно произойти с каким ресурсом.
Когда клиент делает запрос, он указывает тип запроса, используя один из этих глаголов.
Наиболее важными из них являются GET, POST, PUT и DELETE.
GET
Метод GET используется для чтения информации для данного URL с сервера.
GET-запросы доступны только для чтения, что означает, что данные никогда не должны
изменяться на сервере - сервер должен просто получать данные без изменений.
Таким образом, запросы GET считаются безопасными операциями, потому что вызов его один
раз или вызов 20 раз будет иметь тот же эффект.
Кроме того, запросы GET являются идемпотентными.
Это означает, что отправка нескольких запросов GET на один и тот же URL-адрес должна
вызывать тот же эффект, что и один запрос GET, поскольку запрос GET просто запрашивает
данные у сервера и фактически не изменяет какие-либо данные на сервере.
GET-запросы отвечают кодом состояния 200 (ОК), если ресурс был успешно найден,
и 404 (NOT FOUND), если ресурс не был найден.
POST
POST используется для создания нового ресурса.
Вы используете POST, когда хотите создать подчиненный ресурс (например, нового
пользователя) для родительского ресурса.
Ваше сообщение для этого родительского ресурса идентифицируется URL-адресом,
а сервер обрабатывает новый ресурс и связывает его с родительским ресурсом.
POST не является ни безопасным, ни идемпотентным. Это связано с тем, что выполнение
двух или более одинаковых запросов POST может привести к созданию двух новых идентичных
ресурсов.
POST-запросы отвечают кодом состояния 201 (CREATED) вместе с заголовком местоположения
со ссылкой на вновь созданный ресурс.
PUT
PUT используется для обновления ресурса, идентифицируемого URL-адресом, с
использованием информации в теле запроса. PUT также может быть использован
для создания нового ресурса.
Запросы PUT не считаются безопасными операциями, поскольку они изменяют состояние на сервере.
Однако PUT идемпотентен, потому что несколько идентичных запросов PUT на обновление ресурса
должны иметь тот же эффект, что и первый.
PUT запросы отвечают статусом 200 если запрос успешно обновлён и 404 если ресурс не найден.
DELETE
DELETE используется для удаления ресурса, указанного в URL.
Запросы DELETE являются идемпотентными, потому что если вы удаляете ресурс,
он удаляется, и даже если вы делаете несколько идентичных запросов DELETE,
результат остается тем же: удаленный ресурс.
Скорее всего, вы просто получите сообщение об ошибке 404, если отправите запрос
DELETE более одного раза для одного и того же ресурса, потому что сервер не сможет
найти его после его удаления.
На запросы DELETE в ответ удаляется код состояния 200 (ОК), если он был успешно
удален, или 404 (НЕ НАЙДЕН), если удаляемый ресурс не может быть найден.
https://medium.freecodecamp.org/how-the-web-works-part-iii-http-rest-e61bc50fa0a
Что такое REST?
REST (Representational State Transfer) - архитектурный стиль для разработки
приложений.
Его автор, Рой Филдинг, выступал за использование стандартных HTTP методов так,
чтобы придать запросам определённый смысл. А также за то, что между кодами ответов
и самими ответами должен быть определённый смысл.
Основная идея заключается в том, что вы используете протокол «без сохранения
состояния», «клиент-сервер», «кэшируемый» для выполнения вызовов между компьютерами
- и чаще всего этот протокол является HTTP.
Это просто причудливый способ сказать, что REST дает вам набор ограничений для
разработки приложения. Эти ограничения помогают сделать систему более производительной,
масштабируемой, прозрачной и надежной.
Список ограничений:
- Uniform interface (единый интерфейс).
- Stateless (отсутствие состояния). То есть все данные о состоянии, необходимые
для обработки клиентского запроса, должны содержаться в самом запросе, и сервер должен
отправлять все необходимые данные состояния обратно клиенту через сам ответ.
Наличие такой системы без сохранения состояния делает приложения намного более
масштабируемыми, потому что ни одному серверу не нужно беспокоиться о том, чтобы
поддерживать одно и то же состояние сеанса в течение нескольких запросов.
Все необходимое для получения данных о состоянии доступно в самом запросе и ответе.
https://medium.freecodecamp.org/the-definitive-node-js-handbook-6912378afc6e