47

Я понимаю, как маски подсетей используются для разделения сети на подсети, но почему каждый компьютер в сети должен знать маску подсети, а не только маршрутизатор?

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

Допустим, у меня есть компьютер в сети 192.168.0.0/255.255.255.0 , который имеет IP 192.168.0.1 .

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

9 ответов9

77

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

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

Поэтому, если вы посмотрите на пакеты, используя Wireshark, вы увидите, что они напрямую используют MAC-адреса друг друга, в то время как "внешние" пакеты всегда имеют MAC-адрес маршрутизатора в качестве пункта назначения.

(Я предполагаю, что вы говорите о типичных "беспроводных маршрутизаторах", встречающихся в большинстве домов, которые являются обычной причиной такого рода вопросов. Большая сеть будет иметь отдельный маршрутизатор с одним портом на подсеть и несколько отдельных коммутаторов (возможно, один главный и один на этаж / комнату) и несколько десятков компьютеров, подключенных к этим коммутаторам.)

Примерно то же самое с сетями Wi-Fi, за исключением того, что "коммутатор" заменен на "беспроводной мост" или "точка доступа". В обоих случаях подключенные компьютеры могут отправлять пакеты напрямую друг другу на уровне 2, не проходя через маршрутизатор.


Комментарии:

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

Это опять неверно. Коммутаторы не имеют этого знания; их ядро коммутации работает на уровне 2 и ничего не знаю о IP не знает - он пересылает Ethernet кадров исключительно на основе «адрес назначения MAC - поле».

Поэтому хостам нужна маска подсети, чтобы выяснить, какой MAC-адрес использовать в качестве пункта назначения:

  • Если одноранговый узел находится в одной подсети, он по определению считается подключенным к сети - поэтому кадр Ethernet будет иметь MAC-адрес однорангового узла в качестве пункта назначения.

  • Для пиров за пределами подсети кадр Ethernet будет иметь MAC-адрес шлюза в качестве пункта назначения.

(Это относится к конфигурации по умолчанию. Некоторые сети со специальными снежинками изменяют это - например, большинство операционных систем позволяют добавлять дополнительные маршруты «на связи» для дополнительных подсетей; и наоборот, некоторые коммутаторы могут быть настроены на подделку ответов ARP таким образом, что даже шлюз «на линии» проходит через шлюз.)

32

Как компьютер узнает, находится ли адрес назначения в той же подсети в другой?

Проверка локального адреса и маски подсети.

Давайте проверим пару примеров:

Если у моего компьютера IP 192.168.0.1 и маска 255.0.0.0 это означает, что любой адрес от 192.0.0.0 до 192.255.255.255 находится в той же подсети. Пакеты на все эти другие компьютеры не должны проходить через маршрутизатор, их можно отправлять напрямую. Отправьте пакет ARP, чтобы получить MAC-адрес конечного компьютера, а затем отправьте пакет.

Но если у моего компьютера IP 192.168.0.1 и маска 255.255.255.128 то компьютеры в той же подсети имеют IP-адрес только с 192.168.0.0 по 192.168.0.127 . С ними можно связаться напрямую (отправить ARP, найти MAC-адрес и т.д.). Любой другой адрес, например 192.168.0.200 должен быть достигнут через маршрутизатор.

11

Что-то неочевидное в IP - это то, что каждое IP-устройство само является маршрутизатором.

Это можно увидеть на обычном ПК с командой "печать маршрута". Вы подключены к двум сетям: локальному сегменту Ethernet или Wi-Fi и локальной сети. Каждый пакет должен быть предметом решения о том, в какую сеть его устанавливать.

Это становится более очевидным, если вы подключаете компьютер к двум сетям, скажем, "общедоступной" и "частной". Теперь вам определенно нужна маска подсети, чтобы решить, в какую сеть отправлять пакет.

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

6

Я вижу это упомянутое в некоторых других ответах здесь, но я думаю, что это может быть более ясным: на компьютерах с несколькими сетевыми интерфейсами маска подсети может использоваться для автоматического определения, на какой физический интерфейс отправлять IP-трафик на основе IP-адреса назначения.

Если вы отправляете пакет на устройство в локальной сети, подключенной к одному из интерфейсов, чтобы узнать, на какой интерфейс его отправлять (если вы явно не настроили маршрут), компьютер может проверить интерфейсы, чтобы увидеть если subnet_mask & destination_ip == subnet_mask & interface_ip (под & я имею в виду побитовое и и == я имею в виду утверждение равенства), и если есть совпадение, выберите этот интерфейс.

Таким образом, если у вас есть, например:

  • Интерфейс A с 192.168.1.42/24
  • Интерфейс B с 10.0.0.15/24
  • Интерфейс C с 192.168.2.97/24

И вы отправляете пакет в 192.168.2.123 и не имеете настроенного маршрута, можно определить, что интерфейс C должен использоваться, потому что 255.255.255.0 & 192.168.2.123 == 255.255.255.0 & 192.168.2.97.

Это было бы невозможно, если бы маска подсети не была известна, и поэтому вам нужно было бы настроить маршрут для каждого IP-адреса, на который вы отправляли данные.

5

Если мы посмотрим на таблицу маршрутизации (это мой настольный компьютер):

IP-маршрут

default via 172.20.25.1 dev eth1 
172.20.25.0/24 dev eth1 proto kernel scope link src 172.20.25.33 
192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.1

маршрут

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         172.20.25.1     0.0.0.0         UG    0      0        0 eth1
172.20.25.0     0.0.0.0         255.255.255.0   U     0      0        0 eth1
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0

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

В принципе, вы можете отправить все через хост шлюза. Это будет выглядеть

default via 172.20.25.1 dev eth1 
172.20.25.1 dev eth1 proto kernel scope link src 172.20.25.33 

или же

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         172.20.25.1     0.0.0.0         UG    0      0        0 eth1
172.20.25.1     0.0.0.0         255.255.255.255 U     0      0      

Я не пробовал это, но это может быть использовано для MAC-Forced Forwarding.

5

TCP/IP мог бы быть спроектирован так, как вы предлагаете - конечные узлы будут отправлять все на маршрутизатор и перенаправлять его к цели, которая может находиться в той же подсети, что и отправитель.

Но это не будет оптимальным дизайном по двум причинам:

  1. Он использует большую пропускную способность: каждый пакет между устройствами в одной подсети должен передаваться дважды: один раз от отправителя к маршрутизатору и снова от маршрутизатора к получателю. В сетях, где маршрутизатор является также сетевым коммутатором, на самом деле это не какая-то дополнительная полоса пропускания, поскольку он все равно должен был пройти через коммутатор. Но не все сетевые технологии работают так. Первоначальный проект Ethernet был технологией шины, без центрального коммутатора или повторителя.

  2. Это увеличивает нагрузку на маршрутизатор. Даже если маршрутизатор является также коммутатором, это немного больше работы, потому что он поднялся до реализации маршрутизации Уровня 3, а не более простой коммутации Уровня 2.

Общая философия, воплощающая дизайн TCP/IP, заключается в том, что конечные узлы являются интеллектуальными устройствами, поэтому предполагается, что они способны выполнять некоторую работу. Им не нужно знать полную топологию сети, как это делают магистральные маршрутизаторы, но они знают достаточно о локальной среде, чтобы выполнить некоторые первоначальные задачи маршрутизации local-vs-remote. Для реализации этой простой начальной маршрутизации не требуется много кода.

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

2

Итак, я понимаю, как маски подсетей используются для разделения сети на подсети, но мой вопрос заключается в том, почему каждый компьютер в сети должен знать маску подсети, а не только маршрутизатор?

устройства, которые люди называют маршрутизаторами, обычно не просто маршрутизаторы ... поэтому люди иногда используют такие термины, как NAPT Router, или Home Router, или Consumer Router, чтобы предположить, что это не просто маршрутизатор. Чтобы подчеркнуть, что они не просто маршрутизаторы, эти устройства могут выполнять NAPT(который не является маршрутизацией), и у них есть встроенный коммутатор (коммутатор выполняет мостовое соединение, которое не маршрутизирует - различия между коммутатором и мостом немного не так хорошо определены - можно сказать, что мост часто имеет 2 порта и соединяет разные сетевые среды (например, Ethernet и не-Ethernet), тогда как коммутатор будет иметь несколько портов и одну сетевую среду). Переключатель делает мост.

Если бы коммутатор был отделен от "роутера", то действительно, было бы более понятно .. Когда IP-адрес находится в той же сети, то пакет направляется по кабелю к физически следующему коммутатору и в конечном итоге предназначен для другого компьютера в сети (если только он не был управляемым коммутатором и вы подключались к коммутатору, например, через telnet или http, и у коммутатора был свой собственный ip), и, поскольку пакет не предназначен для другой сети, пакет не достигнет маршрутизатора. Когда он предназначен для компьютера в другой сети, он, конечно, все еще идет к коммутатору, но затем продолжает работу к маршрутизатору (коммутатор направил пакет на маршрутизатор и MAC-адрес назначения пакета, поступающего в коммутатор был бы MAC-адресом маршрутизатора), и маршрут направил бы его из правильного интерфейса маршрутизатора.

С этими вещами, обычно называемыми маршрутизаторами, в которых есть коммутаторы (например, не маршрутизаторы Cisco / Juniper профессионального стиля), коммутатор находится внутри ... Но это только расположение переключателя .. Тем не менее, когда IP-адрес находится в той же сети, пакет адресован коммутатору, а не маршрутизатору. И это идет только к коммутатору внутри маршрутизатора и не достигает маршрутизатора.

Я мог бы понять это, если бы каждый компьютер был физически связан друг с другом с помощью провода,

что ты имеешь ввиду здесь .. Если бы все компьютеры во всей сети были физически соединены проводом ... тогда, я думаю, вам не нужен коммутатор или маршрутизатор. То, что вы описываете, звучит немного как оригинальная сеть Ethernet ... и если они все соединены проводом, вероятно, это не будет такая большая сеть. И в любом случае это не будет провод, как вы привыкли. По пути к нему будут подключены компьютеры с "кранами". Так что я не знаю, почему вы просто добавили это предложение.

но все пакеты должны пройти через маршрутизатор в любом случае.

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

И нет, даже в вашем доме они не проходят через маршрутизатор каждый раз. Даже с вашим "домашним маршрутизатором", назовите это интернет-коробкой. Они идут к выключателю в этом.

Допустим, у меня есть компьютер в сети 192.168.0.0/255.255.255.0, который имеет IP 192.168.0.1.

Если этот компьютер пытается подключиться к компьютеру за пределами подсети, скажем, 192.168.1.1, он передает сообщение маршрутизатору,

к коммутатору, то от коммутатора он идет к маршрутизатору

Маршрутизатор идентифицирует, что IP-адрес находится за пределами IP-диапазона подсети, и вместо передачи его в подсети он передает его в сеть, к которой он подключен (возможно, к другому маршрутизатору).

хорошо, маршрутизатор определяет, для какого сетевого интерфейса он предназначен. Он отправляет с одного интерфейса на другой интерфейс. Одно из различий - помимо интерфейса, будет ли сеть подключена напрямую или нет. Он может отправить на коммутатор, а затем на компьютер. Или это может отправить на компьютер. Или, если сеть не подключена напрямую, она перейдет на другой маршрутизатор.

и ваше последнее предложение было

он передает сообщение на маршрутизатор,

и что, ты вдруг решил перестать писать?

Маршрутизатор идентифицирует, что IP-адрес находится за пределами IP-диапазона подсети, и вместо передачи его в подсети он передает его в сеть, к которой он подключен (возможно, к другому маршрутизатору).

ну, я бы так не сказал. Каждый интерфейс на маршрутизаторе имеет свой диапазон IP-адресов.

Но с вашим потребительским маршрутизатором или домашним маршрутизатором получается, что он похож на маршрутизатор с двумя интерфейсами, к которому с вашей стороны подключен коммутатор. И несколько портов являются портами коммутатора.

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

Компьютер, который отправил пакет, проверит, находится ли IP-адрес назначения пакета в его собственной сети или той же сети, и затем на основании этого выберет соответствующий MAC-адрес. Либо MAC-адрес компьютера, которому он предназначен (это если компьютер находится в той же сети). Или (если компьютер находится на другом интерфейсе маршрутизатора), то это будет MAC-адрес маршрутизатора. Я предполагаю, что это может ответить на заголовок вашего вопроса совершенно напрямую, относительно того, почему компьютер должен знать маску подсети. В системе TCP/IP как она есть ... вот как это работает, компьютер выбирает соответствующий адрес уровня 2, например, для Ethernet, MAC-адрес.

1

Но почему тогда маска подсети дается для пользователя / устройства, когда она ему ни для чего не нужна? - Орпедо 22 марта в 13:45

Компьютер / устройство действительно использует маску подсети для того , чтобы вычислить адрес IP - вещания.

Интерфейсы IP, не находящиеся в случайном режиме, настроены на ответ на широковещательный IP-адрес, а также на собственный IP-адрес.

0

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

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

Почему это относится к вам? Потому что, если мы не использовали сетевые маски, вы пытаетесь установить связь с DNS-сервером Google (8.8.8.8), и вам (и КАЖДОМУ другому хосту, который с ним разговаривает) необходимо знать его физический адрес (MAC-адрес). Это приведет к тому, что вашему компьютеру и всем остальным потребуется создать запись ARP для каждого интернет-компьютера, с которым вы разговариваете. Это приведет к потере оперативной памяти и замедлению работы всей сети, поскольку физический адрес машин передается намного дальше, чем необходимо.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .