Интернет держится на двух незаметных, но критически важных системах: DNS переводит имена в адреса, а HTTP задаёт язык общения между клиентом и сервером. Понимание этих механизмов помогает писать более быстрые и надёжные приложения.
DNS (Domain Name System) — это распределённая база данных имён. Когда ты вводишь vk.com, происходит рекурсивный поиск: браузер → локальный кэш → резолвер провайдера → корневые DNS-серверы → серверы доменной зоны (.com) → авторитетный сервер vk.com.
Основные типы DNS-записей:
vk.com → 87.240.129.133)Каждая запись имеет TTL (Time To Live) — время жизни в кэше в секундах. Типичный TTL — от 300 до 3600 секунд. Когда ты меняешь DNS-записи, изменения распространяются по интернету именно столько времени.
HTTP/1.1 (1997) — один запрос за раз на одном соединении. Браузеры обходили это ограничение, открывая 6 параллельных соединений на домен.
HTTP/2 (2015) — мультиплексирование: много запросов через одно соединение одновременно. Бинарный протокол вместо текстового. Server Push — сервер сам отправляет ресурсы до запроса.
HTTP/3 (2022) — работает поверх QUIC вместо TCP. QUIC использует UDP и встраивает шифрование прямо в транспортный слой. Лучше работает при потере пакетов и смене сети (например, когда переходишь с Wi-Fi на мобильный).
Большинство крупных сайтов уже используют HTTP/2 или HTTP/3. Это заметно ускоряет загрузку при большом количестве ресурсов.
Запрос состоит из: строки запроса (метод, путь, версия), заголовков, пустой строки и опционального тела.
Заголовки содержат мета-информацию: Content-Type: application/json говорит серверу, что тело запроса — это JSON. Authorization: Bearer token — токен авторизации. Accept: application/json — какой формат ответа ты принимаешь.
Важно: fetch() не бросает исключение при 4xx/5xx-ошибках — нужно проверять response.ok или response.status вручную.
Resource Timing API позволяет определить, по какому протоколу загрузился ресурс: свойство nextHopProtocol вернёт "h2" для HTTP/2 или "h3" для HTTP/3. Это можно использовать для мониторинга и отладки.
POST-запрос с JSON, обработка статусов, определение версии HTTP
// POST-запрос: отправляем данные на сервер
async function createPost(title, body) {
const response = await fetch('https://jsonplaceholder.typicode.com/posts', {
method: 'POST',
headers: {
'Content-Type': 'application/json', // говорим серверу, что шлём JSON
'Accept': 'application/json', // хотим получить JSON в ответ
},
body: JSON.stringify({ title, body, userId: 1 }),
})
// fetch НЕ бросает ошибку при 4xx/5xx — проверяем вручную
if (!response.ok) {
throw new Error(`Ошибка сервера: ${response.status} ${response.statusText}`)
}
return response.json()
}
const post = await createPost('Тест', 'Тело поста')
console.log('Создан пост с ID:', post.id) // 101
// Определяем версию HTTP через Resource Timing API
// Ждём немного, чтобы запись появилась в буфере
setTimeout(() => {
const entries = performance.getEntriesByType('resource')
entries.forEach(entry => {
if (entry.name.includes('jsonplaceholder')) {
console.log('Протокол:', entry.nextHopProtocol) // h2 или http/1.1
console.log('Размер ответа:', entry.transferSize, 'байт')
}
})
}, 100)Интернет держится на двух незаметных, но критически важных системах: DNS переводит имена в адреса, а HTTP задаёт язык общения между клиентом и сервером. Понимание этих механизмов помогает писать более быстрые и надёжные приложения.
DNS (Domain Name System) — это распределённая база данных имён. Когда ты вводишь vk.com, происходит рекурсивный поиск: браузер → локальный кэш → резолвер провайдера → корневые DNS-серверы → серверы доменной зоны (.com) → авторитетный сервер vk.com.
Основные типы DNS-записей:
vk.com → 87.240.129.133)Каждая запись имеет TTL (Time To Live) — время жизни в кэше в секундах. Типичный TTL — от 300 до 3600 секунд. Когда ты меняешь DNS-записи, изменения распространяются по интернету именно столько времени.
HTTP/1.1 (1997) — один запрос за раз на одном соединении. Браузеры обходили это ограничение, открывая 6 параллельных соединений на домен.
HTTP/2 (2015) — мультиплексирование: много запросов через одно соединение одновременно. Бинарный протокол вместо текстового. Server Push — сервер сам отправляет ресурсы до запроса.
HTTP/3 (2022) — работает поверх QUIC вместо TCP. QUIC использует UDP и встраивает шифрование прямо в транспортный слой. Лучше работает при потере пакетов и смене сети (например, когда переходишь с Wi-Fi на мобильный).
Большинство крупных сайтов уже используют HTTP/2 или HTTP/3. Это заметно ускоряет загрузку при большом количестве ресурсов.
Запрос состоит из: строки запроса (метод, путь, версия), заголовков, пустой строки и опционального тела.
Заголовки содержат мета-информацию: Content-Type: application/json говорит серверу, что тело запроса — это JSON. Authorization: Bearer token — токен авторизации. Accept: application/json — какой формат ответа ты принимаешь.
Важно: fetch() не бросает исключение при 4xx/5xx-ошибках — нужно проверять response.ok или response.status вручную.
Resource Timing API позволяет определить, по какому протоколу загрузился ресурс: свойство nextHopProtocol вернёт "h2" для HTTP/2 или "h3" для HTTP/3. Это можно использовать для мониторинга и отладки.
POST-запрос с JSON, обработка статусов, определение версии HTTP
// POST-запрос: отправляем данные на сервер
async function createPost(title, body) {
const response = await fetch('https://jsonplaceholder.typicode.com/posts', {
method: 'POST',
headers: {
'Content-Type': 'application/json', // говорим серверу, что шлём JSON
'Accept': 'application/json', // хотим получить JSON в ответ
},
body: JSON.stringify({ title, body, userId: 1 }),
})
// fetch НЕ бросает ошибку при 4xx/5xx — проверяем вручную
if (!response.ok) {
throw new Error(`Ошибка сервера: ${response.status} ${response.statusText}`)
}
return response.json()
}
const post = await createPost('Тест', 'Тело поста')
console.log('Создан пост с ID:', post.id) // 101
// Определяем версию HTTP через Resource Timing API
// Ждём немного, чтобы запись появилась в буфере
setTimeout(() => {
const entries = performance.getEntriesByType('resource')
entries.forEach(entry => {
if (entry.name.includes('jsonplaceholder')) {
console.log('Протокол:', entry.nextHopProtocol) // h2 или http/1.1
console.log('Размер ответа:', entry.transferSize, 'байт')
}
})
}, 100)Напиши функцию sendRequest(method, url, data), которая делает запрос с указанным методом. Если method === "POST", отправь data как JSON в теле запроса с правильным Content-Type. Верни объект { status, ok, data } — где data это распарсенный JSON ответа.
Content-Type для JSON — это "application/json". Для тела запроса используй JSON.stringify(data). response.ok — это булево значение true при статусах 200-299.