Продолжение про сети
Как решается проблема с тем, что IPv4 адресов не хватает на все компьютеры в мире
В качестве подхода к решению данной проблемы удобно разделить устройства на 2 класса:
- Сервера, которые предоставляют услуги конечным пользователям.
- Клиенты, которые подключаются к серверам.
Для 1 класса необходимо иметь чёткое местоположение в глобальной сети, чтобы к ним можно было подключаться. А вот для 2 класса положение в глобальной сети может изменяться.
Проектировщики протокола IPv4 разделили всё адресное пространство на специальные группы
- Самая большая - публичные IPv4-адреса, котрые могут использоваться внути сети интернет.
- IP-адреса текущего компьютера. Они находятся в сети 127.0.0.0/8. Все адреса де-факто относятся только лишь к данному компьютеру. 127.0.0.1 - самый часто используемый адрес текущего компьютера.
- Мультикаст-сети. 224.0.0.0/24, 224.0.1.0 - 238.255.255.255, 239.0.0.0/8.
- Приватные сети
- 10.0.0.0/8
- 172.16.0.0/12
- 192.168.0.0/16
Данные IP-адреса НЕ МОГУТ быть использованы в глобальной сети интернет, однако организации могут их использовать у себя для организации взаимодействия внутри своих локальных сетей. При этом ЛЮБАЯ организация может использовать данные адреса у себя в сети.
Для организации доступа из приватного пространства в публичную сеть интеренет применяется технология NAT: Network Address Translation. Суть технологии достаточно проста.
На маршртуризаторе компании (дома), который соединён с глобальной сетью мы включаем данную технологию. Каждый пакет, который приходит из локальной сети в сеть интернет модифицируется: в качестве адресата у пакета мы выставляем IP-адрес маршрутизатора (из глобальной сети) и передаём в сеть интернет. При получении обратного пакета производится обратная подстановка.
В результате для взаимодействия очень большого количества клиентов с сетью интернет нам необходимо на порядок, а то и на 2 порядка меньше публичных IP-адресов, чем это было бы необходимо без данного подхода.
IPv6
Сам по себе протокол IPv6 внутренне даже немного проще чем IPv4. Однако мы всё-равно не смотрели на сложные стороны IPv4, поэтому нам не понять. Однако производители сетевого оборудования вполне рады.
С нашей точки зрения ключевое отличие - длина адреса. Для описания IPv6-адреса используется уже не 32 бита, а 128 бит. Другим замечательным дополнением стало то, что IPv6 адреса группируются географически.
Граница между адресом сети и адресом устройства зафиксирована на границе в 64 бита. Т.е. нет возможности сделать произвольную маску сети.
Пример записи адреса:
- fe80::d33b:2d49:f03b:ca76/64
- ::1/128
Адрес также разделяется на группы бит. Однако для записи 1 группы используются 16-битные числа. Длина числа - 4 символа. Для разделения групп используется знак двоеточия. Если в адресе идут подрят нули, тогда можно использовать двойное двоеточие и не писать эти самые нули. Понятно, что так можно поступить только 1 раз внутри адреса.
- ::1/128 - 000000….0001 - первый адрес всего пространства. Это адрес локального компьютера.
- fe80::d33b:2d49:f03b:ca76/64 - это локальный адрес компьютера в данной локальной сети. Он присваивается автоматически. Его можно отделить от других адресов по префиксу
fe80
.
Как связаны между собой IP-адреса и физические адреса
Когда мы хотим послать сообщение другому компьютеру в локальной сети по IP-адресу, то перед нами встаёт вполне очевидная проблема: как узнать его физический адрес? Для решения данной задачи используется протокол ARP (и его собрат RARP).
Данный протокол определяет следующие вещи:
- Способ обнаружения MAC-адреса по IP-адресу. Способ достаточно простой: мы посылаем запрос широковещательный (т.е. для всех) с вопросом: кто обслуживает данный IP-адрес. Только компьютер с данным IP-адресом должен ответить задающему данный вопрос: я обслуживаю. Из этого сообщения можно получить MAC-адрес и дальше использовать его для общения.
- Способ кеширования связи между MAC и IP-адресами в виде ARP-таблицы. Она нужна, чтобы компьютер не тратил время на обнаружение сетевого адреса при каждой необходимости послать данные.
Транспортный уровень
Задача данного уровня - передача данных между конкретными приложениями на компьютере. Для того, чтобы отделить приложения, запущенные на 1 компьютере вводится понятие порта. Т.е. мы помимо адреса дома также указываем ещё и номер квартиры.
Одновременно на каждом порту может находится только лишь 1 приложение. Либо вообще никакого приложения.
В рамках стека протоколов TCP/IP на транспортном уровне находятся 2 протокола:
- TCP, Transmission Control Protocol
- UDP, User Datagram Protocol
Ключевое отличие между ними состоит в том, что TCP обеспечивает дополнительные гарантии при передаче данных:
- Порядок передаваемых данных будет сохранён.
- При потере пакета между узлами он будет автоматически перепослан. Т.е. пакеты не должны теряться.
Рассмотрим заголовок UDP пакета:
- Порт источника
- Порт назначения
- Длина данных в пакете
- Контрольная сумма
Вместе с заголовком пакета IP мы можем точно понять какое приложение с какого компьютера послало запрос. Контрольная сумма позволяет проверить, что данные при передаче не были повреждены. Если ОС понимает, что данные были повреждены, то пакет не передаётся приложению.
В отличие от UDP заголовок TCP влкючает также и следующие поля:
- Порядковый номер пакета. Нужен для того, чтобы собрать сообщение в правильном порядке, если изначальное сообщение целиком не помещается в пакет.
- Номер подтверждения. Это номер пакета, который был успешно получен получателем.
- Флаги.
- Размер окна. Размер байт, которые может принять получатель. Данный размер вычисляется динамически.
- Указатель важности. Некотороя возможность пометить данный пакет как приоритетный. Понятно, что данный флаг используют владельцы канало связи, а не конечные пользователи.
- Опции
Ввиду достаточной сложности требований (см. выше) протокол TCP вышел достаточно тяжёлым, т.е. для выполнения соединения и передачи реальных данных сторонам необходимо выполнить ряд обменов сообщениями, которые НЕ передают данные.
Что выбрать при реализации собственного протокола прикладного уровня? It depends. Если перед вами встаёт реальная задача, то необходимо сначала прочитать хорошую книгу по деталям работы каждого из этих проколов.
Уровень приложения
На данном уровне мы определяем содержимое пакетов и порядок их передачи между приложениями. То есть фокус смещается с деталей работы сетевых устройств на логику общения двух приложений с целью достижения конкретных целей.
Протоколы прикладного уровня:
- HTTP
- FTP
- DNS
- IMAP
- …
В реальности сейчас мы почти не занимаемся разработкой протоколов данного уровня, а используем протокол HTTP как транспорт по передаче документов между узлами.
Работа системы доменных имён, DNS
Как мы знаем, для каждого узла в сети интернет есть свой уникальный IP-адрес. Это актуально, в частности, для серверов. Однако среднестатическому пользователю достаточно трудно запомнить числовые последовательности, чтобы обращаться к ресурсам в сети. Для облегчения их жизни была придумана система доменных имён, DNS.
Мы хотим предоставить некоторый строковое имя, понятное каждому пользователю. Для этих целей введём иерархическую стркутру. В корне этой структуры будут сервера, обслуживающие свою зону ответственности. Изначально деление было по языковму признаку: англичане сюда, французы сюда и т.д. Это вполне имело смысл, т.к. потребители контента хотят его видеть на своём языке. Каждой зоне присвоим свой уникальный код: uk, us, ru, br, ch, ...
. Назовём данное имя доменом.
Дадим права этим организациям внутри себя выделять доменные имена и связывать эти имена с IP-адресами. Т.е. любой желающий может придти в организацию, заплатить денежку, чтобы организация добавила к себе в список соотношение между доменом и IP-адресом. Так получаются адреса компаний в интернете: amazon.com
, yandex.ru
и т.д.
На каждый компьютер пользователя поставим клиента, который может обращаться к серверам организаций и спрашивать: какой IP-адрес есть у конкретного домена? Сервера организаций будут отдавать эту информацию.
При этом каждый владелец домена может сам для себя организовать сервера, которые будут обслуживать уже доменные имена в рамках выделенного ему доменного имени. Например организация google.com
может выделить maps.google.com
, translate.google.com
и так далее. Потенциально это выделение поддоменов может продолжаться до бесконечности.
С точки зрения клиентов важно иметь доступ к DNS-серверу, который может выполнять разрешение доменного адреса в числовой. Понятно, что все клиенты не могут обращаться к корневым серверам (ru
, com
). Поэтому вводится понятие “кеширующего сервера”. В его задачу входит сохранение ответов от корневых серверов, чтобы клиенты могли быстрее получать данную информацию. Данные сервера предлагаются каждым поставщиком доступа к сети Интернет.
Использование кеширующих серверов позволяет с одной стороны уменьшить количество запросов к корневым серверам, но также и ускорить время ответа для клиентских запросов. Данные сервера, правада, обладают проблемой: даныне в кеше могут быть неправильными, т.е. устаревшими. Для поставщика услуг это означает, что при изменении записи на корневых серверах, их изменение для клиентов будет обязательно происходить с задержкой (от нескольких минут до десятков часов).
Какие ещё интересные трюки позволяет сделать DNS:
1 доменному имени может соответствовать несоклько реальных компьютеров. В результате:
- Если 1 упал, то клиенты автоматически смогут выбрать другой.
- Нагрузка между серверами автоматически распределяется (но кеши немного портят жизнь).
- Можно для разных географических зон выдавать разные IP-адреса в ответе.
Настройка IP-адресов у компьютеров
Понятно, что нам необходимо добиться ситуации, когда у каждого компьютера в сети есть свой уникальный IP-адрес. Для решения этой задачи можно сделать либо:
- Ручное управление (человек с блокнотом).
- Автоматическое управление. Соответствующий протокол называется DHCP.