Разница между IP и MAC-адресами

Неподготовленный человек часто путает ip и mac адреса и не может чётко объяснить, где используются первые, а где вторые. На самом деле, они используются одновременно, но имеют разное назначение и смысл. Чтобы разобраться с этим, требуется вначале представлять себе структуру эталонной модели OSI. IP-адресация – это адресация третьего уровня, и сам по себе адрес является иерархическим, то есть часть адреса обозначает сеть адресата, а часть – идентификатор хоста внутри сети.

Например, если есть адрес 192.168.1.2 с маской 255.255.255.0, то надо понимать, что 192.168.1.0 – это сеть, а 2 – это хост внутри этой сети. На самом деле, с точки зрения маршрутизаторов не имеет значения эта последняя двойка. Самое главное – доставить пакет в нужную сеть, а последний маршрутизатор на этом пути уже будет смотреть, как найти хост с номером два.

MAC-адрес (адрес второго уровня), напротив, линейный, то есть отдельные компоненты адреса не имеют отдельного смысла (на самом деле, есть часть MAC-адреса, по которой можно определить производителя устройства, но в данном контексте это не имеет значения). Так вот, глядя на два MAC адреса можно сказать только одно: разные они или одинаковые. Нельзя понять, в одной они сети находятся или в разных.

Таким образом, если мы, например, знаем MAC-адрес удалённого сервера, то это нам никак не поможет узнать, как отправить на него пакет, в силу отсутствия в адресе информации о сети адресата. MAC-адреса используются для идентификации разных устройств в пределах одной локальной сети. Приведём пример типичного использования MAC-адресов: есть сеть, в ней несколько компьютеров подключены к общему хабу. Один компьютер отправляет сообщение другому компьютеру, указывая в заголовке второго уровня MAC-адрес получателя. Все участники в сети получают фрейм. Тот хост, чей адрес указан принимает содержимое, а остальные видят, что это не им, и уничтожают фрейм. В случае использования коммутатора вместо хаба, процедура примерно такая же за исключением того, что коммутатор проводит некоторую фильтрацию по MAC-адресам, которая в данном контексте нам не важна.

Итого, ip-адрес имеет стратегическое значение, указывая, куда глобально надо передать пакет, mac же имеет тактическое значение, в нём содержится информация, какому ближайшему устройству (из нашей же сети) нужно передать информацию.

Чтобы было понятнее, давайте рассмотрим пример: клиент находится в одной сети, а сервер – в другой. Между ними два маршрутизатора.

Пример использования IP и MAC адресов

Для простоты будем считать, что во всех сетях маски подсети 255.255.255.0. Клиент отправляет запрос на сервер, в качестве шлюза по умолчанию, на нём прописан ip адрес ближайшего маршрутизатора – 192.168.1.1.

  1. Клиент собирается отправить пакет на адрес 192.168.3.50, он сравнивает адрес сервера со своим и видит, что они находятся в разных сетях (сервер в 192.168.3.0, а клиент – в 192.168.1.0). Раз сети разные, значит нет смысла искать MAC сервера (ведь он нужен только для передачи в пределах одной сети) вместо этого нужно отправить пакет на MAC-адрес шлюза (R1), чтобы он уже дальше разбирался как доставить этот пакет.
  2. Клиент создаёт пакет, указывая в нём в качестве IP отправителя свой адрес – 191.168.1.10, а в качестве IP получателя адрес сервера – 192.168.3.50.
  3. Пакет заворачивается во фрейм, в котором MAC-адрес отправителя AAA, а в качестве MAC-адреса получателя стоит адрес шлюза – BBB.
  4. R1 получает фрейм, глядя на MAC BBB понимает, что фрейм ему, достаёт из него пакет и смотрит свою таблицу маршрутизации. В ней видно, что сеть 192.168.3.0 находится где-то справа и чтобы достичь её надо переслать фрейм маршрутизатору R2.
  5. R1 снова запаковывает тот же пакет но уже в новый фрейм, на этот раз MAC отправителя – CCC, MAC получателя – DDD, так как фрейм пойдёт уже по другой локальной сети где есть свой отправитель – R1 и свой получатель – R2. При этом, содержимое заголовка IP пакета не меняется – в нём по-прежнему адрес отправителя 192.168.1.10, а адрес получателя – 192.168.3.50
  6. R2 получает фрейм, видит что там стоит его MAC, соответственно фрейм надо распаковать и обработать. Когда фрейм декапсулирован, из него достаётся IP пакет. Глядя на адрес получателя, R2 видит, что пакет идёт в сеть 192.168.3.0, которая непосредственно подключена к R2. Таким образом, дальше не надо передавать содержимое никакому другому маршрутизатору, а надо передать непосредственному получателю.
  7. R2 переупаковывает всё тот же пакет в новый фрейм, ставя в качестве MAC-адреса отправителя свой адрес EEE, а в качестве адреса получателя – адрес сервера FFF. Внутри фрейма находится всё тот же пакет с теми же IP адресами, что и были на протяжении всего путешествия. Фрейм отправляется в последнюю локальную сеть 192.168.3.0
  8. Сервер получает фрейм, видит, что в нём его MAC (FFF), распаковывает фрейм и достаёт из него пакет, в пакете его IP (192.168.3.50) – значит можно продолжить обработку. Пакет распаковывается, из него достаются полезные данные и передаются далее внутри сервера нужному приложению для обработки.

Обратный процесс отправки ответа выглядит аналогичным образом. То есть, на протяжении всего путешествия пакета по сети, IP адреса отправителя и получателя в нём не меняются, так как именно основываясь на IP адресе получателя маршрутизатор решает, куда дальше пересылать пакет. А вот MAC-адреса меняются при каждом переходе из одной сети в другую. Каждый маршрутизатор ставит в качестве адреса отправителя свой MAC-адрес (точнее адрес того своего интерфейса, который смотри в нужную сеть, того интерфейса, с которого непосредственно будет выходить фрейм), а в качестве MAC-адреса получателя ставится адрес ближайшего устройства в следующей сети, то есть, либо следующего маршрутизатора, либо, если сеть уже достигнута, то непосредственного адресата, для которого предназначается информация в пакете.

Стоит отметить, что коммутаторы и хабы не имеют ни MAC ни IP адресов и не занимаются переупаковкой. Они находятся внутри локальной сети и поэтому в приведённом примере их наличие никак не повлияло бы на процесс передачи информации. Главное в данном примере – это именно процесс прохождения маршрутизаторов. Отличное понимание приведённого примера является обязательным условием изучения дальнейшего материала и в частности понимания процесса маршрутизации.

Комментарии

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

Аватар пользователя bacek
В момент включения маршрутизатора таблица пуста, как только поднимаются его интерфейсы (переходят в состояние up), появляются непосредственно подключенные сети и настроенные через эти интерфейсы статические маршруты. Чуть позже, когда протоколы маршрутизации обменяются данными, появляются и динамические маршруты. Но глобально, всё это порядка нескольких секунд с момента запуска, так что можно считать, что если всё нормально, то маршруты появляются почти сразу после включения.

Что касается второго вопроса - маршрутизатор, как и компьютер, имеет ARP таблицу, хранящую взаимосвязь между IP и MAC адресами. При включении она пуста, когда надо к кому-то обратитсья, он отправляет широковещательный ARP запрос, узнаёт MAC, соответствующий интересующему IP-шнику, запоминает его в таблице на будущее и шлёт на него данные.

Однако, это в теории, если брать практическую реализацию, то на современных маршрутизаторах применяется технология CEF (Cisco express forwarding), которая представляет из себя нечто вроде быстрого кэша, хранящего маршруты, маки, IP и интерфейсы для быстрой маршрутизации однотипных пакетов.

Спасибо за обстоятельный и доступный ответ!

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

Хотелось бы тоже присоединиться к комментарию выше)
Статья шикарна)как раз для тех, кто только-только погружается во все это)
Теперь точно добавлю ваш сайт в закладки для дальнейшего изучения)

Аватар пользователя bacek
Спасибо. Будет желание пообщаться - заходите на форум.

Да класно написано, просто для понимания спасибо!

Аватар пользователя bacek
Спасибо, Санёк. Приятно слышать.

Здраствуйте! Я прочел данную статью в 2015, я проще и всеобьемляще не видел нигде. Автору большой респект честь слова!!!!!!!!!

Аватар пользователя bacek
Спасибо, буду стараться дальше.

Столько всяких видео посмотрел, столько статей перечитал, но ответы на свои вопросы нашёл здесь. Чисто примера последовательного ну оочень хватило!! Огромнейшее спасибо

У меня вот два вопроса.
Первый:
Допустим, у нас есть роутер, который получил фрейм, но после него в цепи имеются два параллельных свича, после которых по маршруту к серверу стоит ещё один роутер. Первый роутер указывает mac свича? Если да, то как свич поймёт куда ему дальше посылать фрейм, если, например, помимо второго роутера к нему ещё парочка присоединена. Если mac указывается именно роутера, то получается, что посылается широковещательный сигнал на оба свича, которые посылают одинаковые фреймы роутеру номер 2? Немного не понимаю как в реальности расположены сетевые устройства в сети и как они друг друга адресуют. Если бы везде были только роутеры, то вопросов бы не было.
Второй:
Если я отправил http запрос серверу с указанием его доменного имени впервые (то есть нет в кэше ещё его ip), то как роутер поймёт куда тащить фреймы? У него внутри сразу таблица dns вшита или он сам отправляет запрос dns серверу? Да и вообще как бы как на сетевом уровне ещё на компьютере сформировать заголовок, если не известен ip? Может быть, перед отправкой и формированием пакетов, ip-протокол запрашивает у dns сервера ip, после чего уже продолжает трудиться?

Аватар пользователя bacek

Отвечаю на вопросы:

  1. У коммутатора, конечно, есть MAC адрес, но он используется для пересылки трафика, адресованного самому коммутатору (например, для управления свичом). В вашем примере можно считать что у коммутатора нет MAC адреса, так как он не имеет отношения к делу.  Как два коммутатора могут подключаться паралельно? Через третий или через хаб? Из роутреа ведь один провод выходит.  Допустим, такая схема: роутер R1-хаб-два паралельных коммутатора S1 и S2-хаб-следующий роутер R2. В этом случае получается петля на 2м уровне и сеть работать не будет. Если вы имеете в виду подключение роутера к двум свичам отдельными интерфейсами роутера, то это будет L3 петля, что допустимо, но тогда там должны исоплзоваться две разные IP подсети, на каждом интерфейсе свой IP и MAC адреса и роутер будет делать балансировку. В любом случае, MAC адрес получателя в этом примере - это MAC адрес целевого маршрутизатора, адреса коммутаторов роли не играют.
  2. Роутер ничего не знает о доменных именах, он работает с полем "IP адрес получателя". Когда вы отправляете HTTP запрос, то HTTP инкапсулируется в TCP, а TCP - в IP. В IP пакете нельзя вбить доменное имя - только IP адрес получателя. Поэтому компьютер перед отправкой сам резолвит доменное имя, спрашивая у своего ДНС сервера:  "Какой IP  соответствует тому сайту, на который я собирался делать запрос". Получает IP и именно его вставляет в пакет и именно на этот IP и смотрит роутер чтобы осуществлять маршрутизацию.

Если у вас много подобных вопросов - я могу ответить на них оптом в рамках одного платного занятия по скайпу. Судя по тому, о чём вы спрашиваете - это может открыть вам глаза :)

Добрый день.
Клиент создаёт пакет, указывая в нём в качестве IP отправителя свой адрес – 191.168.1.10, а в качестве IP получателя адрес сервера – 192.168.3.50.

Тогда вопрос, а где указывается сеть в которую нужно отправить пакет ? Насколько я знаю, то в пакете маска не указывается. Как тогда маршутизатор понимает в какую сеть доставить ?

Аватар пользователя bacek
Да, всё так. В пакете нет маски. Но маска есть на отправляющем компьютере, так что он знает, что пакет не в его сеть и пересылает маршрутизатору. На маршрутизаторе в таблице все удалённые сети перечислены тоже с масками, поэтому он сопоставляет пакет с записями в своей таблице с учётом маски, относящейся к этим записям, а не маски, которой нет в пакете.

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