Пакеты и их структура
Пакеты и их структура
Мы разобрались, что IP-адрес — это «адрес на конверте». Теперь посмотрим на само «письмо». Данные в интернете передаются не сплошным потоком, а маленькими порциями — пакетами (packets). Почему так — и что внутри пакета — разберём в этом уроке.
Зачем резать данные на куски
Представь, что ты хочешь отправить другу книгу по почте. Можно упаковать её целиком в огромную коробку и отправить одной посылкой. А можно разорвать на страницы и каждую отправить в отдельном конверте. Первый способ кажется проще, но в интернете используют второй. Почему?
-
Разделение канала. Если один компьютер шлёт гигабайтный файл сплошным потоком, все остальные вынуждены ждать. Маленькие пакеты от разных отправителей перемешиваются и передаются «по очереди» — никто не блокирует канал надолго.
-
Устойчивость к ошибкам. Если при передаче сплошного потока повредится один бит — придётся пересылать весь файл заново. С пакетами — пересылается только повреждённый кусочек.
-
Гибкость маршрутизации. Пакеты одного и того же файла могут идти разными путями, обходя перегруженные или сломанные участки сети.
Коммутация пакетов vs коммутация каналов
В телефонии прошлого века использовалась коммутация каналов: два абонента получали выделенную линию на всё время разговора. Линия занята, даже если оба молчат.
Интернет использует коммутацию пакетов (packet switching): канал не выделяется монопольно. Пакеты от тысяч разговоров, видео и сайтов перемешиваются в одном кабеле. Это как автомобильная дорога вместо железнодорожного пути — машины едут вперемешку, а не одна за другой с эксклюзивным доступом.
Что внутри пакета
Пакет состоит из двух частей: заголовок (header) и данные (payload).
Заголовок содержит служебную информацию для доставки — как адрес на конверте. Полезная нагрузка — собственно данные: кусочек веб-страницы, фрагмент видео, часть письма.
┌─────────────────────────┐
│ ЗАГОЛОВОК (header) │
│ • IP отправителя │
│ • IP получателя │
│ • TTL (время жизни) │
│ • Протокол (TCP/UDP) │
│ • Контрольная сумма │
│ • Длина пакета │
├─────────────────────────┤
│ ДАННЫЕ (payload) │
│ • Кусочек файла/страницы│
│ • Обычно до 1500 байт │
└─────────────────────────┘
Разберём ключевые поля заголовка:
- IP отправителя и получателя — откуда и куда идёт пакет. По этим полям роутеры принимают решение о маршрутизации.
- TTL (Time To Live) — счётчик, ограничивающий количество прыжков (hop'ов) между роутерами. При создании пакета TTL = 64 (или 128, 255). Каждый роутер уменьшает TTL на 1. Когда TTL станет 0 — пакет уничтожается. Это предотвращает бесконечное блуждание пакетов в случае петли маршрутизации.
- Протокол — указывает, какой протокол верхнего уровня находится в payload.
6= TCP,17= UDP. Чтобы принимающая сторона знала, какому обработчику отдать данные. - Контрольная сумма (checksum) — число, которое позволяет проверить, не повредился ли заголовок при передаче. Если сумма не совпадает — пакет отбрасывается.
Размер заголовка IPv4 — от 20 до 60 байт. В IPv6 заголовок фиксированный — 40 байт, зато проще и обрабатывается быстрее.
MTU: максимальный размер пакета
У каждого участка сети есть ограничение на максимальный размер пакета — MTU (Maximum Transmission Unit). Для Ethernet это обычно 1500 байт. Если пакет больше MTU, его фрагментируют — разбивают на несколько меньших пакетов, которые собираются обратно на приёмной стороне.
Аналогия: через узкую дверь не пройдёшь с широким шкафом — приходится разбирать его на части и собирать заново внутри. Фрагментация работает так же, но каждый фрагмент — это самостоятельный IP-пакет со своим заголовком.
Инкапсуляция: матрёшка из протоколов
Пакет — это как матрёшка. На уровне приложения у тебя HTTP-запрос. Он заворачивается в TCP-сегмент, тот — в IP-пакет, а IP-пакет — в Ethernet-кадр:
Ethernet-кадр
└─ IP-пакет
└─ TCP-сегмент
└─ HTTP-запрос
Каждый уровень добавляет свой заголовок. На приёмной стороне заголовки снимаются в обратном порядке. Мы будем разбирать эти уровни подробно в модуле про стек TCP/IP.
Почему пакеты могут приходить не по порядку
Пакеты одного файла могут идти разными путями. Первый пакет пошёл через Франкфурт, второй — через Амстердам, третий догнал второй из-за задержки на промежуточном роутере. В результате пакеты приходят к получателю в порядке 1, 3, 2.
Сам протокол IP не гарантирует порядок доставки — он просто доставляет отдельные пакеты. За наведение порядка отвечает протокол уровнем выше — TCP (разберём в следующем модуле). Именно TCP нумерует пакеты и пересобирает их в правильном порядке.
Проверь себя
- Что произойдёт, если TTL пакета станет равным нулю?
- Зачем нужна фрагментация?
- Может ли один пакет содержать данные и для веб-страницы, и для почтового клиента одновременно?
- Роутер отбросит пакет и может отправить отправителю ICMP-сообщение «Time Exceeded». Это защита от бесконечных петель маршрутизации.
- Фрагментация нужна, когда пакет превышает MTU участка сети. Большой пакет разбивается на части, которые собираются обратно на приёмной стороне.
- Нет. Каждый пакет принадлежит одному протоколу верхнего уровня (поле «Протокол» в заголовке одно). Данные для разных приложений идут в разных пакетах.
Что унести с урока
- Данные передаются пакетами, а не сплошным потоком. Это даёт гибкость и устойчивость.
- Коммутация пакетов эффективнее коммутации каналов — канал не простаивает.
- Заголовок IP-пакета содержит адреса, TTL, тип протокола и контрольную сумму.
- MTU ограничивает размер пакета. Слишком большие пакеты фрагментируются.
- IP не гарантирует порядок доставки — за это отвечает TCP.
Пакеты знают адрес получателя. Но как роутер решает, в какой порт отправить каждый конкретный пакет? В следующем уроке разберём маршрутизацию — алгоритмы и протоколы, благодаря которым пакеты находят путь в интернете.