1.1. Как работает Ethernet

Сеть топологии "шина"С точки зрения топологии Ethernet - это шина.

Термин шина (bus) означает, что имеется некий провод или группа проводов, объединенная в единый кабель, к которому подключаются все компьютеры сети. Именно этот провод и является шиной.

Чем же хороша такая топология? Во-первых, каждый компьютер может обмениваться данными с любым другим непосредственно (вспомним топологию "кольцо" - тут данные должны пройти промежуточные компьютеры). Во-вторых, количество проводов не слишком-то велико (сравните с полносвязной сетью).

Конечно же, у шины есть и недостатки, основным из которых является невозможность обмениваться данными одновременно между несколькими парами машин. Представим себе, что идет обмен между машинами 1 и 2. Если в это же время машины 3 и 4 тоже попытаются обменяться данными, то ничего не получится, ведь все они подключены к единому проводу. Хуже того, уже ведущийся обмен также нарушится. Вторым недостатком является полный выход сети из строя при неисправной шине.

Существуют методы устранения обоих недостатков, об этом речь пойдет дальше.

За годы своего существования Ethernet постепенно менялся. Имеется довольно много вариантов, отличающихся скоростью передачи данных и конструктивными особенностями. Все они совместимы между собой, чаще всего для объединения требуется дешевый переходной блок; иногда можно обойтись и без него.

В случае объединения в одну сеть оборудования, работающего с разными скоростями, более скоростное оборудование подстраивается под меньшую скорость. Точнее, в обмене данными между двумя конкретными машинами сети используется та скорость, которую понимает оборудование обеих машин. Для другой пары машин скорость может быть другой.

Как же работает Ethernet?

Каждая карта Ethernet, вставляемая в компьютер, имеет уникальный номер, задаваемый изготовителем. Слово "уникальный" означает, что номера никогда не совпадают. Номер имеет длину 6 байт. Общепринято записывать номер в виде шести пар шестнадцатеричных цифр, разделенных тире или точками. Например, карта в машине автора имеет номер 00-0a-e6-64-d7-67. Номер карты часто называют мак-адресом.

(Тем, кто не знает, что такое "шестнадцатеричная цифра": давайте пока не будем отвлекаться, а просто примиримся с тем, что при записи чисел в такой форме используются не только цифры 0,1,...9, но и буквы латинского алфавита от "a" до "f".)

При обмене данными информация режется на части. Длина каждого куска может быть довольно большой, но на практике редко превышает полторы тысячи байт.

В каждом куске полезная информация, ради которой он, собственно говоря, и посылается по сети, дополняется служебной. Мы не будем лезть в детали, отметим только существенный для нас момент: в служебной информации присутствуют номера карт отправителя и получателя. (Для наглядности можно представить себе, что наши данные вложены в конверт, на котором написаны адрес получателя и отправителя. К этой аналогии мы будем возвращаться в дальнейшем.) Блок данных вместе со служебной информацией называется Ethernet-пакет.

В обычных условиях все компьютеры, точнее, их сетевые карты, "слушают" шину. В какой-то момент времени один из компьютеров решает, что нужно послать пакет другому компьютеру, и делает это. Все остальные карты, слушая шину, имеют возможность получить этот пакет. Но в начале пакета идет номер карты-получателя. Каждая карта сравнивает его со своим собственным. Если номера не совпали, карта игнорирует пакет, а вот если совпали, то осуществляется прием пакета. Номера же карт, как мы помним, уникальные, следовательно, пакет будет принят только одной картой. Она-то и есть получатель пакета!

Если при слушании шины карта-отправитель обнаруживает, что передача уже ведется какой-то другой картой, она должна просто подождать конца передачи, и только потом начать передавать свой пакет. Это свойство заложено в конструкцию карты. А может ли возникнуть ситуация, когда 2 карты послушали-послушали шину, и одновременно начали передачу? К сожалению, может, и бывает не так уж и редко. Называется эта ситуация "коллизией". Пакеты двух карт накладываются друг на друга, принять не удается ни один. Что ж, это предусмотрено разработчиками. Обнаружив коллизию, карта должна немного подождать, и затем повторить передачу. Если сеть невелика, повторная передача спасает положение. При очень большой сети (сотни машин) или при интенсивном обмене данными коллизии возникают столь часто, что скорость сети сильно падает. Приходится делить сеть на части.

Вот в основном и все про работу Ethernet, остался лишь маленький, но интересный нюанс: а как, собственно говоря, машина узнает мак-адрес соседних машин?

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

Конечно, разработчики Ethernet ситуацию предусмотрели. Любая машина в любой момент может послать пакет, в котором адрес получателя выглядит как ff-ff-ff-ff-ff-ff-ff. Этот номер (а карты с таким номером не существует) означает, что пакет адресован всем картам в сети. Приняв пакет, компьютер имеет возможность ответить - ведь адрес отправителя он знает из самого принятого пакета. Смысл ответа должен быть примерно таким: "Здесь есть компьютер с мак-адресом таким-то". Если так ответит каждый, то пославший запрос может заполнить свою таблицу мак-адресов реальными данными.

Кстати, пакет, адресованный всем, называется "циркулярным", или "broadcast".

Как часто нужно посылать циркулярные пакеты? Единственного ответа нет, и используются разные подходы - от однократной посылки после включения до периодического опроса всей сети, в поисках вновь появившихся машин. Если опрос делать редко, вновь появившиеся машины долго не будут видны, если слишком часто - сеть будет сильно загружена вспомогательными процессами. (Автору известны случаи, когда 1 компьютер с неверными настройками таким способом сделал невозможной работу довольно большой сети...)