Локальные компьютерные сети
Доброго времени, уважаемые читатели блога www.k-max.name. В сегодняшней статье опишу немного теории о компьютерных сетях и о том, как настроить сеть в Linux, как продиагностировать сеть в Linux и поддерживать в рабочем состоянии сетевую подсистему в Linux. Когда статья начинала формироваться, планировалось уложиться в одну, но к завершению, размеры статьи стали неподъемные, было решено разделить статью на две: теория сетей и работа сетевой подсистемы в линукс. Ну что ж, начнем с теории…
Стек протоколов TCP/IP
Собственно, что есть сеть? Сеть – это более 2х компьютеров, объединенных между собой какими-то проводами каналами связи, в более сложном примере – каким-то сетевым оборудованием и обменивающиеся между собой информацией по определенным правилам. Эти правила “диктуются” стеком протоколов TCP/IP.
Transmission Control Protocol/Internet Protocol (Стек протоколов TCP/IP) – если сказать простым языком, это набор взаимодействующих протоколов разных уровней (можно дополнить, что каждый уровень взаимодействует с соседним, то есть состыковывается, поэтому и стек, имхо, так проще понять), согласно которым происходит обмен данными в сети. Каждый протокол – это набор правил, согласно которым происходит обмен данными. Итого, стек протоколов TCP/IP – это набор наборов правил Тут может возникнуть резонный вопрос: а зачем же иметь много протоколов? Неужели нельзя обмениваться всем по одному протоколу?
Все дело в том, что каждый протокол описывает строго отведенные ему правила. Кроме того, протоколы разделены по уровням функциональности, что позволяет работе сетевого оборудования и программного обеспечения становится гораздо проще, прозрачнее и выполнять “свой” круг задач. Для разделения данного набора протоколов по уровням была разработана модель сетевого взаимодействия OSI (англ. Open Systems Interconnection Basic Reference Model, 1978 г., она же – базовая эталонная модель взаимодействия открытых систем). Модель OSI состоит из семи различных уровней. Уровень отвечает за отдельный участок в работе коммуникационных систем, не зависит от рядом стоящих уровней – он только предоставляет определённые услуги. Каждый уровень выполняет свою задачу в соответствии с набором правил, называемым протоколом. Проиллюстрировать работу модели OSI можно следующим рисунком: Как передаются данные?
Из рисунка видно, что существует 7 уровней сетевого взаимодействия, которые делятся на: прикладной, представлений, сеансовый, транспортный, сетевой, канальный, физический. Каждый из уровней содержит свой набор протоколов. Список протоколов по уровням взаимодействия хорошо представлен в Википедии:
Сам стек протоколов TCP/IP развивался параллельно с принятием модели OSI и “не пересекался” с ней, в результате получилось небольшое разногласие в несоответствии стека протоколов и уровней модели OSI. Обычно, в стеке TCP/IP верхние 3 уровня (прикладной, представления и сеансовый) модели OSI объединяют в один — прикладной. Поскольку в таком стеке не предусматривается унифицированный протокол передачи данных, функции по определению типа данных передаются приложению. Упрощенно интерпретацию стека TCP/IP относительно модели OSI можно представить так:
Данную модель сетевого взаимодействия еще называют модель DOD (от бурж. Department of Defense — Министерство обороны США). Итак, общее представление о сетевом взаимодействии рассмотрели. Для более глубокого понимания сути вопроса, могу посоветовать скачать и почитать книгу (Вито Амато “Основы организации сетей Cisco Т1 и Т2”), ниже.
Адресация
В сети, построенной на стеке протоколов TCP/IP каждому хосту (компьютеру или устройству подключенному к сети) присвоен IP-адрес. IP-адрес представляет собой 32-битовое двоичное число. Удобной формой записи IP-адреса (IPv4) является запись в виде четырёх десятичных чисел (от 0 до 255), разделённых точками, например, 192.168.0.1. В общем случае, IP-адрес делиться на две части: адрес сети (подсети) и адрес хоста:
Как видно из иллюстрации, есть такое понятие как сеть и подсеть. Думаю, что из значений слов понятно, что IP адреса делятся на сети, а сети в свою очередь делятся на подсЕти с помощью маски подсетИ (корректнее будет сказать: адрес хоста может быть разбит на подсЕти). Изначально, все IP адреса были поделены на определенные группы (классы адресов/сети). И существовала классовая адресация, согласно которой сети делились на строго определенные изолированные сети:
Нетрудно посчитать, что всего в пространстве адресов IP – 128 сетей по 16 777 216 адресов класса A, 16384 сети по 65536 адресов класса B и 2 097 152 сети по 256 адресов класса C, а также 268 435 456 адресов многоадресной рассылки и 134 317 728 зарезервированных адресов. С ростом сети Интернет эта система оказалась неэффективной и была вытеснена CIDR (бесклассовой адресацией), при которой количество адресов в сети определяется маской подсети.
Существует так же классификация IP адресов, как “частные” и “публичные”. Под частные (они же локальные сети) сети зарезервированы следующие диапазоны адресов:
- 10.0.0.0 — 10.255.255.255 (10.0.0.0/8 или 10/8),
- 172.16.0.0 — 172.31.255.255 (172.16.0.0/12 или 172.16/12),
- 192.168.0.0 — 192.168.255.255 (192.168.0.0/16 или 192.168/16).
- 127.0.0.0 — 127.255.255.255 зарезервировано для петлевых интерфейсов (не используется для обмена между узлами сети), т.н. localhost
Кроме адреса хоста в сети TCP/IP есть такое понятие как порт. Порт является числовой характеристикой какого-то системного ресурса. Порт выделяется приложению, выполняемому на некотором сетевом хосте, для связи с приложениями, выполняемыми на других сетевых хостах (в том числе c другими приложениями на этом же хосте). С программной точки зрения, порт есть область памяти, которая контролируется каким-либо сервисом.
Для каждого из протоколов TCP и UDP стандарт определяет возможность одновременного выделения на хосте до 65536 уникальных портов, идентифицирующихся номерами от 0 до 65535. Соответствие номера порта и службы, использующей этот номер можно посмотреть в файле /etc/services или на сайте http://www.iana.org/assignments/port-numbers. Весь диапазон портов делиться на 3 группы:
- 0 до 1023, называемые привилегированными или зарезервированными (используются для системных и некоторых популярных программ)
- 1024 — 49151 называются зарегистрированными портами.
- 49151 — 65535 называются динамическими портами.
IP протокол, как видно из иллюстраций находится ниже TCP и UDP в иерархии протоколов и отвечает за передачу и маршрутизацию информации в сети. Для этого, протокол IP заключает каждый блок информации (пакет TCP или UDP) в другой пакет – IP пакет или дейтаграмма IP, который хранит заголовок о источнике, получателе и маршруте.
Если провести аналогию с реальным миром, сеть TCP/IP – это город. Названия улиц и проулков – это сети и подсети. Номера строений – это адреса хостов. В строениях, номера кабинетов/квартир – это порты. Точнее, порты – это почтовые ящики, в которые ожидают прихода корреспонденции получатели (службы). Соответственно, номера портов кабинетов 1,2 и т.п. обычно отдаются директорам и руководителям, как привилегированным, а рядовым сотрудникам достаются номера кабинетов с большими цифрами. При отправке и доставке корреспонденции, информация упаковывается в конверты (ip-пакеты), на которых указывается адрес отправителя (ip и порт) и адрес получателя (ip и порт). Простым языком как-то так…
Следует отметить, что протокол IP не имеет представления о портах, за интерпретацию портов отвечает TCP и UDP, по аналогии TCP и UDP не обрабатывают IP-адреса.
Для того чтобы не запоминать нечитаемые наборы цифр в виде IP-адресов, а указывать имя машины в виде человекопонятного имени “придумана” такая служба как DNS (Domain Name Service), которая заботится о преобразовании имен хостов в IP адрес и представляет собой огромную распределенную базу данных. Об этой службе я обязательно напишу в будущих постах, а пока нам достаточно знать, что для корректного преобразования имен в адреса на машине должен быть запущен демон named или система должна быть настроена на использование службы DNS провайдера.
Маршрутизация
Давайте рассмотрим (на иллюстрации) пример инфраструктуры с несколькими подсетями. Может возникнуть вопрос, а как же один компьютер соединиться с другим? Откуда он знает, куда посылать пакеты?
Для разрешения этого вопроса, сети между собой соединены шлюзами (маршрутизаторами). Шлюз – это тот же хост, но имеющий соединение с двумя и более сетями, который может передавать информацию между сетями и направлять пакеты в другую сеть. На рисунке роль шлюза выполняет pineapple и papaya, имеющих по 2 интерфейса, подключенные к разным сетям.
Чтобы определить маршрут передачи пакетов, IP использует сетевую часть адреса (маску подсети). Для определения маршрута, на каждой машине в сети имеется таблица маршрутизации (routing table), которая хранит список сетей и шлюзов для этих сетей. IP “просматривает” сетевую часть адреса назначения в проходящем пакете и если для этой сети есть запись в таблице маршрутизации, то пакет отправляется на соответствующий шлюз.
В Linux ядро операционной системы хранит таблицу маршрутизации в файле /proc/net/route. Просмотреть текущую таблицу маршрутизации можно командой netstat -rn (r – routing table, n – не преобразовывать IP в имена) или route. Первая колонка вывода команды netstat -rn (Destination – назначение) содержит адреса сетей (хостов) назначения. При этом, при указании сети, адрес обычно заканчивается на ноль. Вторая колонка (Gateway) – адрес шлюза для указанного в первой колонке хоста/сети. Третья колонка (Genmask) – маска подсети, для которой работает данный маршрут. Колонка Flags дает информацию об адресе назначения (U – маршрут работает (Up), N – маршрут для сети (network), H – маршрут для хоста и т.п.). Колонка MSS показывает число байтов, которое может быть отправлено за 1 раз, Window – количество фреймов, которое может быть отправлено до получения подтверждения, irtt – статистика использования маршрута, Iface – указывает сетевой интерфейс, используемый для маршрута (eth0, eth1 и т.п.)
Как видно в примере ниже, первая запись (строка) указана для сети 128.17.75, все пакеты для данной сети будут отправлены на шлюз 128.17.75.20, который является IP адресом самого хоста. Вторая запись – это маршрут по умолчанию, который применяется ко всем пакетам, посылаемым в сети, не указанные в данной таблице маршрутизации. Здесь маршрут лежит через хост papaya (IP 128.17.75.98), который можно считать дверью во внешний мир. Данный маршрут должен быть прописан на всех машинах сети 128.17.75, которые должны иметь доступ к другим сетям. Третья запись создана для петлевого интерфейса. Данный адрес используется, если машине необходимо подключиться к самой себе по протоколу TCP/IP. Последняя запись в таблице маршрутизации сделана для IP 128.17.75.20 и направляется на интерфейс lo, т.о. при подключении машины к самой себе на адрес 128.17.75.20, все пакеты будут посылаться на интерфейс 127.0.0.1.
Если хост eggplant пожелает послать пакет хосту zucchini, (соответственно, в пакете будет указан отправитель – 128.17.75.20 и получатель – 128.17.75.37), протокол IP определит на основании таблицы маршрутизации, что оба хоста принадлежат одной сети и пошлет пакет прямо в сеть, где zucchini его получит. Если более подробно сказать.. сетевая карта широковещательно кричит ARP-запросом “Кто такой IP 128.17.75.37, это кричит 128.17.75.20?” все машины, получившие данное послание – игнорируют его, а хост с адресом 128.17.75.37 отвечает “Это я и мой MAC – адрес такой-то…”, далее происходит соединение и обмен данными на основе arp таблиц, в которых занесено соответствие IP-MAC адресов. “Кричит”, то есть этот пакет посылается всем хостам, это происходит потому что, MAC-адрес получателя указан широковещательный адрес ( FF:FF:FF:FF:FF:FF ). Такие пакеты получают все хосты сети.
Пример таблицы маршрутизации для хоста eggplant:
[root@eggplant ~]# netstat -rn Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface 128.17.75.0 128.17.75.20 255.255.255.0 UN 1500 0 0 eth0 default 128.17.75.98 0.0.0.0 UGN 1500 0 0 eth0 127.0.0.1 127.0.0.1 255.0.0.0 UH 3584 0 0 lo 128.17.75.20 127.0.0.1 255.255.255.0 UH 3584 0 0 lo
Давайте рассмотрим ситуацию, когда хост eggplant хочет послать пакет хосту, например, pear или еще дальше?.. В таком случае, получатель пакета будет – 128.17.112.21, протокол IP попытается найти в таблице маршрутизации маршрут для сети 128.17.112, но данного маршрута в таблице нет, по этому будет выбран маршрут по умолчанию, шлюзом которого является papaya (128.17.75.98). Получив пакет, papaya отыщет адрес назначения в своей таблице маршрутизации:
[root@papaya ~]# netstat -rn Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface 128.17.75.0 128.17.75.98 255.255.255.0 UN 1500 0 0 eth0 128.17.112.0 128.17.112.3 255.255.255.0 UN 1500 0 0 eth1 default 128.17.112.40 0.0.0.0 UGN 1500 0 0 eth1 127.0.0.1 127.0.0.1 255.0.0.0 UH 3584 0 0 lo 128.17.75.98 127.0.0.1 255.255.255.0 UH 3584 0 0 lo 128.17.112.3 127.0.0.1 255.255.255.0 UH 3584 0 0 lo
Из примера видно, что papaya подключена к двум сетям 128.17.75, через устройство eth0 и 128.17.112 через устройство eth1. Маршрут по умолчанию, через хост pineapple, который в свою очередь, является шлюзом во внешнюю сеть.
Соответственно, получив пакет для pear, маршрутизатор papaya увидит, что адрес назначения принадлежит сети 128.17.112 и направит пакет в соответствии со второй записью в таблице маршрутизации.
Таким образом, пакеты передаются от маршрутизатора к маршрутизатору, пока не достигнут адреса назначения.
Стоит отметить, что в данных примерах маршруты
128.17.75.98 127.0.0.1 255.255.255.0 UH 3584 0 0 lo 128.17.112.3 127.0.0.1 255.255.255.0 UH 3584 0 0 lo
Не стандартные. И в современном linux вы такого не увидите.
Резюме
В данной статье я постарался как можно коротко и понятно описать основные понятия взаимодействия сетевой инфраструктуры на примере нескольких взаимосвязанных сетей, в следующей части я опишу работу сети в операционной системе Linux. Буду рад Вашим комментариям и дополнениям.
Что еще почитать по теме?
Если есть желание, более подробно почитать о маршрутизации и основах сети, советую почитать отличную книгу: Вито Амато “Основы организации сетей Cisco” Том1 и Том2 2004г.
Продолжение статьи: Настройка сети в Linux, диагностика и мониторинг
Новое продолжение: iproute2, настройка сети командой ip
С Уважением, Mc.Sim!
Другие материалы в категории Linux
- Репликация Mysql (master-slave, master-master)
- Ошибка 0x80004005 0x80070035 на Windows 10 при доступе к сетевой папке
- Текстовый редактор VIM, основы работы
- Спринт Lingoda (ex Марафон Lingoda) + промокод.
- ddrescue или спасаем данные с HDD
- Бесплатный SLES для Vmware – ВСЁ…
- Резервное копирование файлов сайта по ssh
- SQUID настройка ACL и http_access
- squid, использование опции debug_options или диагностика компонентов squid
- Седьмой релиз Debian
интересная информация, спасибо
Пожалуйста! приходите ещё!
Спасибо за инфу!))классный сайт, помог очень в написании практики о Linux. Теперь буду бывать у вас чаще))
Пожалуйста!
Приходите. Будут новые публикации!
Много информации,но понятно даже мне,незнакомому с темой-большое спасибо!!
А откуда появилось:”а также 268 435 456 адресов многоадресной рассылки и 134 317 728 зарезервированных адресов”?Как это получается?Спасибо.
Это сети класса D и E:
D 224.0.0.0 239.255.255.255
E 240.0.0.0 247.255.255.255
Класс D имеет место в специфическом использовании (например мультикаст – IP-TV)
Дословно – “Адреса класса D используются для многоадресатных пакетов, с помощью которых во многих разных протоколах данные передаются многочисленным группам хостов.”
Класс E – зарезервирован и тупо не будет использоваться, потому что все переходят на IPv6.
Спасибо вам))) Можете мне скинуть на почту подробную Информацию про класс D используемый в IP -TV
Пожалуйста!
Информацию отправил.
Прошу прощения, а что означают 0.0.0.0 в столбике Gateway?
Это значит, что этот маршрут не имеет шлюза. А так же это значит, что сетевой пакет будет отправлен напрямую в сеть (предварительно определив MAC адрес по протоколу ARP) и исходящим интерфейсом будет тот, который указан в столбце Iface.
Приветствую уважаемый Mc.Sim
Есть пару замечаний к данной статье…
№1.Там где ты пишешь про частные/публичные IP—-там видимо опечатка в префиксе у IP-не 8,12,16 а 8,16,24—или это не опечатка?)
№2.Почему -то ничего не сказано про механизм ‘надсетей’
№3.Рисунок,где ты описываешь адресацию с битами и байтами,на мой взгляд не совсем правильный.Сопоставляя IP и маску подсети показываешь какие октеты уходят на адрес сети,а какие на адрес хоста,но на данном рисунке показана сеть класса ‘С’ и дефолтная 24-битная маска,показывающая как делить нам IP-и как маршрутизатор будет читать его.Судя по рисунку там нет подсети таковой-для класса ‘C’/24 бита в маске это одна большая сеть,а чтоб показать саму подсеть надо применить механизм разделение сетей на подсети(расширить битовое пространство сети путем уменьшения битового пространства узла)и вот эти биты,которые мы прибавим они-то и уйдут у нас в подсеть.На мой взгляд надо было демонстрировать с маской расширинной,хотя бы на 1 бит!!!Ведь судя по рисунку можно сопоставить адрес 192.168.5.1 и 192.168.10.1 с маской /24,то это вообще будут разные сети(а не подсети),а с маской /16–1 надсеть и можно будет затолкать в один свич без маршрутизатора. ПОПРАВЬ меня если не прав…
№4.Почему-то нет инфы про то,сколько нужно определять битов для подсети чтобы сделать сеть с определенным количеством подсетей,или подсеть с определенным количеством узлов—ведь это азы(например MSCE проектирует сети а MSCA устраняет неполадки в сети,но сейчас админ должен уметь все и поэтому MSCA/MSCE сдаются вместе -поэтому админ обязан уметь проектировать сети-знания которых базируются на этих самых битах-куда и сколько надо отдать чтобы получить то-то)
ВОзможно и я в чем-то не прав,но помойму все-таки так,хотя давно это было-когда я учил про подсети и надсети…
1. Согласно http://www.rfc-editor.org/rfc/rfc1918.txt – там все верно. Именно 8 (то есть IP в диапазоне 10.0.0.0.0-10.255.255.255), 12 (то есть IP в диапазоне 172.16.0.0 — 172.31.255.255) и 16 (то есть IP в диапазоне 192.168.0.0 — 192.168.255.255). 8,16 и 24 – это просто наиболее часто используемые админами маски для локальных подсетей.
2. Надсеть – это всего лишь частный случай организации подсетей. Цель статьи – дать общее понимание. После прочтения статьи, думаю, что будет несложно разобрать что такое надсеть.
3. ты в целом, все правильно понял. Просто отобразить маску, например /25 на рисунке будет не очень наглядно. В данном случае, цель рисунка – отобразить, что есть некая классовая адресация, которая отделяет сеть 192.168.0.0/16 (то есть IP в диапазоне 192.168.0.0 — 192.168.255.255) от других сетей (на рисунке выделена синим), и что эту сеть можно разделить на подсЕти с помощью маски, которая обозначена зеленым цветом и имеет значение /24. Как-то так…
4. Вот тут согласен. Постараюсь со временем дополнить эту информацию…
Спасибо за замечания.
Спасибо за понимание
Прости за тупость
Именно 8 (то есть IP в диапазоне 10.0.0.0.0-10.255.255.255), 12 (то есть IP в диапазоне 172.16.0.0 — 172.31.255.255) и 16 (то есть IP в диапазоне 192.168.0.0 — 192.168.255.255). 8,16 и 24 — это просто наиболее часто используемые админами маски для локальных подсетей—>8,12 и 16 эти маски используются по дефолту что-ли???Я так понял что они просто идут как для наглядности,показать диапазоны этих адресов.
Например,192.168.0.0 надо поделить на ‘n’подсетей—ты пишешь что это можно сделать маской /24,но это маска же по умолчанию(стек TCP/IP выдаст на этот адрес /24 бита),увеличив его мы поделим нашу сеть.Непонятно зачем использовать дефолтную на /16,почему же они тогда в компе не исправили,выдавал бы на данный адрес /16 бит,ну так какую же маску использовать для сетей ABC,чтобы сделать подсети???Внеси ясность плиз,а то у меня уже мозг весь скукоженый,не отдупляю ничего
Эти маски используются согласно rfc1918. Венда по умолчанию и админы часто используют маски именно 8,16 и 24.
вернее будет сказать так: маской /16 мы поделим сеть на одну сеть, маской /17 мы можем поделить сеть на 2 подсети, маской …. , маской /24 мы можем поделить сеть на 255 подсетей и т.д. до /30.
Почему для сети 192.168.0.0 мелкософт использует маску /24 я не знаю… Видимо тому есть причины…
на текущий момент, классовая адресация не актуальна и практически не используется. маску нужно использовать ту, которой будет достаточно для организации такой подсети, в которую смогут поместиться твое количество хостов.
Вообщем можно смело использовать 8,12,16 для дефолтной маски—в принципе я понял,СПАСИБО за дохотчивое обьяснение!
Блин спасибо за статью, Я РЕАЛЬНО ВРУБИЛСЯ
Нету слов,сайту,статье! Просто идеально!
По моему таблица маршрутизации хоста papaya должна быть не:
[root@eggplan ~]# netstat -rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
128.17.75.0 128.17.75.98 255.255.255.0 UN 1500 0 0 eth0
128.17.112.0 128.17.112.3 255.255.255.0 UN 1500 0 0 eth1
default 128.17.112.40 0.0.0.0 UGN 1500 0 0 eth1
127.0.0.1 127.0.0.1 255.0.0.0 UH 3584 0 0 lo
128.17.75.98 127.0.0.1 255.255.255.0 UH 3584 0 0 lo
а вот такая
[root@papaya ~]# netstat -rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
128.17.75.0 128.17.75.98 255.255.255.0 UN 1500 0 0 eth0
128.17.112.0 128.17.112.3 255.255.255.0 UN 1500 0 0 eth1
default 128.17.112.40 0.0.0.0 UGN 1500 0 0 eth1
127.0.0.1 127.0.0.1 255.0.0.0 UH 3584 0 0 lo
128.17.75.98 127.0.0.1 255.255.255.0 UH 3584 0 0 lo
128.17.112.3 127.0.0.1 255.255.255.0 UH 3584 0 0 lo
приветствую, sysdba.
вставь таблицы на pastebin.com и дай ссылку. Ато все смешалось )
а все, разгреб )
Утверждение верно – статья допилена. Спасибо за замечание.
Спасибо! Интересно
Спасибо за статью. Начало доходить что-то. Буду читать еще раз.
“от eggplant” или “для pear”, должно быть
Конечно же _для_. )
Спасибо за замечание, Павел.
Хорошая статья. Можно еще дополнить ссылками на RFC и детальным разбором подсчета сети, как здесь, к примеру – http://sysadm.pp.ua/internet/network-planning.html
Спасибо.
При наличии времени обязательно добавлю RFC. Статью о суммаризации сетей так же планирую написать, но когда – не известно )
Кратко и понятно. Помогло вспомнить основы. Спасибо.
Спасибо большое за статью.