Локальные сети, часть 1

Этим постом я начну цикл заметок о том, как устроен интернет. Недавно вот нужно было объяснить основные азы человеку пусть неглупому, но в устройстве компьютеров не сильно сведущему, а в этом самом интернете о нем самом ничего подходящего не нашлось. Обнаруживались или чрезмерной пухлости профильные учебники, или совсем уж краткие и шибко примитивизирующие статьи. Что дать почитать интересующемуся не программисту, чтобы он мог понять, что творится с его компьютером и почему? Я не нашел ничего подходящего, даже на английском. Так что я обошелся импровизированными лекциями на тему; по их мотивам в меру своих способностей постараюсь восполнить пробел в материале подобного рода.

Как появились локальные сети

Когда-то давным-давно, лет эдак тридцать пять с хвостиком назад, не то что сетей, персональных компьютеров у населения особо заметно не было. Даже в Америке. Но время шло, компьютеры появлялись и в офисах, и в домах. И вместе с ними все больше проблемой становилась проблема передачи информации с одного компьютера на другой. Если для домашних пользователей эта задача вполне себе решалась дискетками (для подрастающего поколения — это такой доисторический магнитный носитель информации), то для офисов такой подход, мягко говоря, неудобен. Вы можете себе представить корпоративную почту, распространяемую на дискетках? И что может быть незаменимее корпоративной файлопомойки? Так что бизнес сказал надо, инженеры ответили есть.

На рынок было выведено несколько различных технических решений, в принципе делающих одно и то же: они соединяют компьютеры между собой одним проводом, по которому программы на разных компьютерах могут обмениваться информацией без необходимости участия в этом процессе человека. Такие объединенные компьютеры, вместе с необходимым для объединения оборудованием, и называются локальной сетью (local area network, LAN). Локальная — потому что компьютеры в сети предполагалось располагать недалеко друг от друга (сотни метров).

Красные соединения — лишние

Почему именно одним проводом? Потому что смысла нет иметь больше. Помимо того, что кабель не бесплатен, введение дополнительных кабелей только усложнит физическую реализацию сети. Компьютеры должны как-то договариваться между собой, кто в некоторый момент времени может посылать сигналы через кабель. Договариваться не нужно будет только в том случае, если каждый компьютер в сети будет соединен с каждым другим компьютером отдельным кабелем. Для сети из 10 компьютеров понадобится 9+8+7+…+1 = 45 кабелей. А в случае 100 компьютеров нужно будет (100 + 1)*100/2 = 5050 кабелей. Мягко говоря, непрактичное решение. Так что по крайней мере какие-то кабели в сети будут использоваться одновременно несколькими компьютерами, и если для варианта с одним кабелем на всех можно придумать простые, надежные и недорогие способы реализовать механизм договора, то для варианта с несколькими физически отдельными кабелями эта задача уже совсем другого порядка сложности. Овчинка выделки не стоит.

Пакеты

До появления компьютерных сетей людям уже приходилось решать проблему автоматического соединения устройств. Я имею в виду телефоны. Все провода (в общем смысле этого слова, нынче переносчик сигналов может быть самой разной природы) в телефонной сети поделены на части, буду называть их сегментами. При соединении двух телефонов происходит физическое переключение сегментов сети (во время дозвона именно это происходит), и образуется выделенная для двух телефонных аппаратов пара проводов, по которым они обмениваются сообщениями. Когда-то переключением проводов занимались телефонистки (и телефонисты? такие были?), потом прогресс породил автоматические АТС. Что те, что другие занимались соединением проводов с друг другом. Этот процесс называется коммутацией, поэтому устройства для переключения проводов называются коммутаторами, а сами сети, в своем принципе основывающиеся на физическом переключении проводов, называются коммутируемыми.

Схема коммутатора. Грубо говоря, «вставив штырек» в пересечение можно соединить 2 провода. Этим и занимались телефонистки — перетыкали штырьки.

Главное достоинство коммутируемых сетей — гарантированная полоса пропускания, ведь канал связи выделяется физически и никто другой его занимать не будет. Но за эту особенность приходится платить большим временем установления соединения, т.к. любой физический процесс переключения проводов очень медленный по сравнению со скоростями в электронике. И соединение может не получится потому, что все провода уже использованы, т.е. возможна критическая перегрузка коммутируемой сети с отказом в обслуживании (с этим явлением, наверное, многие сталкивались во время празднования новых годов, когда мобильники дозванивались не очень уверенно). Также, в силу эксклюзивного характера соединения, сложно организовать общение один-ко-многим. Для телефонных разговоров это не проблема, т.к. человек одновременно может говорить только с кем-то одним, а вот как быть упомянутой выше файлопомойке (файл-серверу — компьютеру, который предоставляет доступ к хранимым на нем данным всем компьютерам в сети)? Отдавать файлы только одному компьютеру, который первый «дозвонился»? Иметь соединения с каждым компьютером в сети? Итого, коммутируемые сети чисто идеологически плохо подходят для локальных сетей.

Поэтому был разработан новый подход, основанный на том, что данные передаются через общую для всех участников среду небольшими кусочками, которые называют пакетами. Передающее устройство занимает среду только на время, необходимое для передачи пакета, после чего она свободна для других компьютеров. Сети, построенные по этому принципу, так и называются — пакетными сетями. Пакетные сети по своим характеристикам противоположны коммутируемым. При передаче данных изменения физической конфигурации проводников не происходит, т.к. компьютеры всегда соединены друг с другом, соответственно никакого времени на установление соединения не тратится. С другой стороны, полоса пропускания (т.е. скорость, с которой данные попадают с одного компьютера на другой) не гарантируется, и зависит от загруженности сети. Чем больше компьютеров хотят передавать данные, тем меньше получится скорость передачи данных.

Ethernet

Из всех технологий обвязывания компьютеров проводами выжил и стал стандартом один, под названием Ethernet.

взято с http://www.globalsecurity.org/military/library/policy/army/fm/24-7/ch2.htm

Древний коаксиальный Ethernet

Изначально сеть представляла собой один длинный кабель (коаксиал, похожий на кабели, что используют для кабельного телевидения), со сделанными в нужных местах отводами для сетевых карт. Сетевые карты — это компьютерная периферия, задачей которой является общение с сетью. Программы на компьютере (в нынешние времена — операционная система) могут послать на карту отправляемые данные, а также забрать с нее данные полученные. Сетевые карты или встроены в материнскую плату (обычное дело в наши дни), или выполнены в виде платы расширения (так оно в основном было раньше).

Когда компьютер хочет что-то послать в сеть, он формирует пакет (пакеты, если данных много; максимальный размер пакета в Ethernet около 1500 байт), и передает его сетевой карте, которая «слушает» кабель. Если в какой-то момент по кабелю ничего не передается, это значит, что кабель свободен, и тогда сетевая карта посылает пакет, т.е. генерирует на кабель сигналы нужного вида, как пример: «есть напряжение» это 1, «нет напряжения» это 0 (на самом деле кодирование там сложнее и интереснее, но суть та же). Сигналы, кстати, генерируются с одинаковой скоростью, вернее частотой смены сигналов; для ранних реализаций Ethernet это 10 мегабит (миллионов бит) в секунду. После отправки одного пакета и перед отправкой следующего сетевая карта делает небольшую паузу, чтобы дать возможность вклиниться другим компьютерам, если им нужно; такая пауза не позволяет одному компьютеру захватить сеть в монопольное владение. Может случиться, что два компьютера практически одновременно обнаружили свободный кабель и стали передавать свои пакеты и эти пакеты «столкнулись» в кабеле (эта ситуация так и называется — коллизия, от английского collision). В этом случае карты прекращают передачу и пытаются передать пакеты снова через какое-то небольшое, но случайное (и для каждой карты разное) время. Случайность интервала ожидания исключает возможность того, что карты слова столкнутся, выждав одинаковую паузу.

Получает данные сетевая карта пассивно, просто слушая все то, что ходит по кабелю. Как карта узнает, что пакет в кабеле предназначается именно ей? По адресу. Каждая карта имеет уникальный шестибайтовый адрес, называемый MAC-адресом. Уникальность адреса обеспечивается на организационном уровне; у каждого производителя сетевых карт есть свой номер, который присутствует в MAC-адресе, вместе с номером карты, который производитель ей назначает. Так что ручной настройки адреса сетевой карты не требуется (хотя это можно сделать при желании, что бывает иногда полезно). Сетевая карта, отправляющая пакет, указывает в нем в определенном месте адрес получателя (равно как и свой адрес как адрес отправителя). Так что любая карта, «услышав» пакет, может определить, предназначается он ей или нет. Также Ethernet поддерживает широковещательные адреса, т.е. адреса, на которые откликнутся все компьютеры в сети. Для многих применений широковещательный адрес необходим; в частности, для всех задач, которые сводятся к вопросу «есть тут кто?».

Если вкратце, то это весь Ethernet. Конечно, там есть масса деталей, от физической реализации до способа кодирования передаваемой информации, но все эти детали, хоть и любопытны, не влияют на суть происходящего; так что я не буду на них останавливаться.

В следующей заметке я рассмотрю историю развития Ethernet. Много чего произошло за 30 с гаком лет, и без такого исторического экскурса я не смогу объяснить, что такое хаб, свич и тем более роутер.

Stay tuned 😉

Цикл: Как устроен Интернет

Добавить комментарий