LXF168:Сети. Пакеты и соединения
|
|
|
Сеть: Изучаем пакеты, физические соединения и адресацию
Компьютерные сети: Основы.
Сделайте первые шаги к пониманию сетей и объедините свои Linux-компьютеры – основные концепции сети вам растолкует Джонатан Робертс.
На страницах Linux Format мы извели массу времени на объяснения, как делать те или иные вещи – от создания анимаций и редактирования изображений до работы с командной строкой и шифрования данных. Причем большую часть этого времени мы не пользовались нашими компьютерами поодиночке, а соединили их друг с другом, разделив хранящиеся на них файлы и информацию еще и между нашими домами, а также через Интернет.
Чтобы помочь вам применить навыки работы в Linux в этой опутанной сетью среде, следующие два месяца мы потратим на знакомство с основами работы сети. Упор будет сделан на практическую работу: наряду с пояснением теории и терминологии мы научим вас пользоваться утилитами Linux для исследования и построения сетей.
На данном уроке мы подружим вас с тремя китами, на которых зиждется вся жизнь сетей – с пакетами, физическими соединениями и адресацией. А на следующем – создадим несколько виртуальных машин и построим из них несколько простых сетей.
Сети с пакетной коммутацией
Для начала поговорим о том, что же такое сеть: говоря попросту, это два или более компьютеров, связанных друг с другом через физическую среду, которой может быть медный проводник (Ethernet), оптоволоконный кабель или радиоволны (Wi-Fi). Отправляя сигналы через эту среду, компьютеры могут обмениваться информацией друг с другом.
Вроде ничего сложного: соединить два компьютера проводом, а они будут отправлять по нему электрические сигналы и делиться друг с другом информацией. Но вот беда: даже в такой простой модели (это мы еще не касаемся того, как электрические сигналы кодируются и декодируются!) быстро возникают проблемы.
Информация, которой должны обмениваться компьютеры, обычно довольно объемная и сложная, состоящая из многих миллионов бит. Ее можно отправлять по проводу последовательно – что занимает несколько минут, часов или даже дней. Когда компьютеров в сети всего два, печаль невелика: один может просто подождать, пока не получит сигнал об окончании, и затем отправит свою информацию в ответ.
Настоящие проблемы начинаются в больших сетях, с десятками или сотнями компьютеров, подключенных к общей среде. Пока один компьютер отправляет информацию, ни один из остальных не сможет воспользоваться передающей средой. Хуже того: если сигнал прервется, придется начать отправку заново – а если файл был большим, оно уж совсем обидно!
В компьютерных сетях эти две проблемы решаются с помощью пакетов. Большие объемы информации разбиваются на фрагменты меньшего размера (легче управляемые), которые называются пакетами. Наряду с передаваемой информацией пакеты содержат метаданные, которые, среди прочего, оговаривают местоположение пакета в потоке информации.
При потере пакета принимающий компьютер увидит, что части потока не хватает, и ему останется запросить повторную отправку только отсутствующего пакета, а не всего потока. Более того, так как пакеты разбивают данные на независимые фрагменты, все компьютеры, которые пользуются средой, могут передавать пакеты (а не целые файлы) по очереди, то есть смогут работать со средой более эффективно. Эти пакеты – не просто абстрактная идея: вы можете посмотреть, как отдельные пакеты передаются по сети. Для этого установите программу tcpdump с помощью менеджера пакетов своего дистрибутива Linux. После установки откройте терминал и найдите, какое устройство сейчас предоставляет сетевое соединение. Если активное соединение у вас всего одно, это можно сделать командой
ip a | grep “state UP”
Команда ip выводит информацию о сетевых подключениях – попозже мы познакомимся с ней ближе – а команда grep фильтрует результат, чтобы мы видели только подключения в состоянии ’up‘, то есть активные. Нас интересует фрагмент в начале строки – скорее всего это eth0, wlan0 или em1, в зависимости от конфигурации. Его можно указать как параметр команде tcpdump и понаблюдать за сетевым общением. От имени суперпользователя-root выполните команду:
tcpdump -i wlan0
где wlan0 – устройство, которое мы обнаружили выше. Затем откройте браузер и зайдите на какой-нибудь сайт. Вернувшись в терминал, вы увидите, как экран заполняется строками текста. Каждая строка представляет пакет, отправленный между вашим компьютером и сервером для загрузки web-страницы, и в каждом пакете есть информация о нем, включая время приема или отправки, компьютеры (или хосты), с которых и на которые он был отправлен, и многое другое.
Вывод команды и содержимое пакетов (в терминале отображаются только заголовки пакетов) можно сохранить в файле, приписав к команде параметр -w и имя файла, а потом проанализировать в графической утилите наподобие Wireshark.
Таким образом очень удобно диагностировать проблемы в сети. Например, если вам не удается заставить правильно работать DHCP, запустите отслеживание пакета на сервере DHCP, и узнаете, получает ли он запросы на адреса, отвечает ли он на запросы, блокируются ли пакеты брандмауэром – это поможет найти источник проблемы.
MAC-адреса
Зная, сколько компьютеров могут находиться в одной физической сети, вы можете поинтересоваться, как они идентифицируют друг друга в сети, т. е. как отправить информацию только на компьютер Боба, а не на компьютер Алисы?
На самом деле, компьютеры, подключенные к одной и той же физической среде (например, к медному проводу), видят все пакеты, отправляемые на все остальные компьютеры. От чтения всех пакетов подряд компьютер останавливает то, что его сетевая карта (Network Interface Card, NIC – это аппаратный компонент компьютера, который преобразует информацию от компьютера в сигнал, пригодный для передачи по физической среде, и наоборот) снабжена так называемым MAC-адресом [от Media Access Control – управление доступом к среде].
Каждый пакет включает MAC-адрес получателя. Компьютер, получив пакет, проверяет, совпадает ли адрес его сетевой карты с адресом в пакете; если да, то из пакета извлекается содержащаяся в нем информация, если нет – пакет отбрасывается для экономии процессорного времени.
Адрес активной сетевой карты можно просмотреть опять же командой IP:
ip link show dev wlan0
где wlan0 – имя устройства, которое мы выяснили ранее. Если набрать просто ip link show, будет показана информация обо всех сетевых картах, подключенных к компьютеру. MAC-адрес состоит из 12 знаков и следует за link/ether в выводе команды. Он выглядит примерно так: ea:34:43:81:02:7c.
Конечно, одним проводом сложно соединить больше двух компьютеров. Чтобы подключить несколько компьютеров к одной физической сети, используется устройство под названием «хаб [hub – англ. стыковочный узел]». У хаба есть несколько разъемов Ethernet, и по поступлении пакета на один из входов тот пересылается на все остальные интерфейсы.
Но даже в сетях с пакетной коммутацией могут возникнуть проблемы, если компьютеров слишком много – разные компьютеры будут пытаться передавать информацию в одно и то же время, в результате она будет повреждена, и эффективного обмена данными не состоится.
Это происходит потому, что компьютеры отправляют пакеты не по очереди, а когда попало, и используют сложные алгоритмы для выхода из коллизий.
Чтобы обойти данную проблему, применяют другое устройство – коммутатор, он же свитч [switch]. Коммутатор похож на хаб наличием нескольких интерфейсов Ethernet, но действует значительно умнее.
Вместо того, чтобы вслепую перенаправлять все получаемые пакеты на все остальные интерфейсы, коммутатор составляет таблицу MAC-адресов интерфейсов. Когда на коммутатор приходит пакет, он смотрит на MAC-адрес пакета и определяет, на какой именно порт пакет следует отправлять.
Таким образом уменьшается объем трафика, пересылаемого между интерфейсами, и снижается их конкуренция – то есть уменьшается количество коллизий, и обмен данными становится более надежным.
Логические сети
Однако использование коммутаторов для расширения сетей и уменьшения коллизий – не конец истории, так как у MAC-адресов однородная [flat] структура. Это значит, что их трудно классифицировать или группировать.
При небольшой сети это не проблема, но с ростом сети таблицы MAC-адресов на коммутаторах, в которых производится поиск порта для отправки пакета, достигают огромного размера. Это замедляет работу коммутаторов и делает невозможным построение глобальной сети, такой как Интернет.
Чтобы решить эту проблему, можно разбить большие сети на множество мелких логически сгруппированных сетей и направлять трафик между ними с помощью технологий межсетевого взаимодействия.
Как это работает? Ну, для начала надо познакомить вас с адресами нового типа, которые называются адресами Протокола Интернета (Internet Protocol – IP). Возможно, вы уже видели IP-адреса – они обычно состоят из четырех чисел, разделенных точками, например, 192.168.1.218.
В отличие от представления хоста в сети полным адресом, этот адрес разбит на две части – адрес сети и адрес хоста – с помощью так называемого префикса. Префикс – это число от 0 до 32, определяющее, какая часть IP-адреса является адресом сети, а какая – адресом хоста. Полный адрес записывается в следующем виде: 192.168.1.2/24.
Соединяем оба вместе
Эти логические адреса связываются с физическими MAC-адресами, о которых мы говорили ранее, при этом каждый IP-адрес связан с конкретным MAC-адресом. Для просмотра этой информации на своем компьютере обратитесь к ip neighbour:
ip neigh show
Каждая строка вывода соответствует одному хосту, достижимому с вашего компьютера. Первый параметр в строке – IP-адрес хоста; следующие два определяют, через какую сетевую карту он доступен; а lladdr содержит MAC-адрес устройства. С помощью этой информации компьютер может формировать пакеты, адресованные тому или иному компьютеру.
А теперь кое-что интересное: компьютеры с одинаковыми адресами сети хранят эту информацию друг о друге и могут взаимодействовать напрямую. Но если адреса сети у них разные, они не хранят эту связь IP- и MAC-адресов и напрямую взаимодействовать не могут. Вместо этого они взаимодействуют через промежуточное устройство, известное как шлюз или маршрутизатор (он же роутер).
Роутеры отслеживают и сохраняют все связки IP- и MAC-адресов для своей сети, а также информацию о подключении к другим роутерам и сетям. Если хост в сети роутера хочет подключиться к хосту в другой сети, он отправляет сообщение на шлюз с полным IP-адресом другого хоста, и шлюз пересылает это сообщение в соответствующую сеть. Затем шлюз в этой сети отправляет пакет соответствующему хосту.
Если в этих других сетях сотни, тысячи или даже десятки тысяч компьютеров, вы поймете, как это снижает объем информации, которую должен хранить каждый роутер. Вместо MAC-адресов всех этих хостов он должен обеспечить хранение только одного адреса для каждой сети – адреса шлюза.
Исследование информации о маршрутизации
Знание пути отправки пакетов – например, с Компьютера A на Роутер A и затем с Роутера A на Роутер B и, наконец, на Компьютер B – называется информацией о маршрутизации, так как это информация о пути, который должен пройти пакет.
Собственную таблицу маршрутизации своего компьютера можно просмотреть, указав аргумент route в команде ip:
ip route show
В первой строке вывода стоит “default”, затем идет IP-адрес, через который должны отправляться пакеты, и интерфейс, с которого они должны отправляться. Маршрут по умолчанию – оговорка для вашего компьютера: если для IP-адреса, с которым вы пытаетесь связаться, не задано другого маршрута, пакеты уйдут в этот шлюз.
Сравнив точку назначения маршрута по умолчанию с выводом команды ip neighbour, вы увидите, что MAC-адрес компьютера соответствует его шлюзу по умолчанию; вот так два компьютера могут общаться напрямую.
Разрешаем адреса
Таблицу соответствия MAC-адресов и IP-адресов, полученных от команды ip neigh, ваш компьютер строит с помощью протокола разрешения адресов (Address Resolution Protocol – ARP). В ARP используется специальный пакет, точно такой же, как показывала команда tcpdump. Желая выяснить MAC-адрес компьютера с заданным IP-адресом, ваш компьютер формирует пакет запроса ARP.
Тот содержит ваш MAC-адрес как отправителя и IP-адрес хоста, MAC-адрес которого вы хотите узнать, но не указывает MAC-адрес назначения. Затем этот пакет отправляется всем хостам, подключенным к той же физической сети, что и вы – т. е. на все порты коммутатора, но не с одного роутера на другой – и содержит, например, следующий запрос: «Запрос компьютера с IP-адресом 192.168.1.2, передать ответ на 192.168.1.1 [Request who has 192.168.1.2 tell 192.168.1.1]».
Если такой IP-адрес существует в этой сети, на MAC-адрес отправителя посылается arp-пакет REPLY с таким содержимым: «Ответ 192.168.1.2 – ea:34:43:81:02:7c [Reply 192.168.1.2 is-at ea:34:43:81:02:7c]». Теперь компьютеры могут общаться друг с другом напрямую. Это можно увидеть в действии, снова запустив команду tcpdump. Но вместо открытия web-страницы, зайдите в другой терминал и скомандуйте от имени root:
arping 192.168.1.1
с IP-адресом шлюза по умолчанию. Взглянув на вывод tcpdump, вы теперь должны увидеть запрос и ответ ARP. |