
Я понимаю, как маски подсетей используются для разделения сети на подсети, но почему маску подсети должен знать каждый компьютер в сети, а не только маршрутизатор?
Я мог бы это понять, если бы все компьютеры были физически соединены друг с другом проводом, но все пакеты в любом случае должны проходить через маршрутизатор.
Допустим, у меня есть компьютер в сети 192.168.0.0/255.255.255.0
, имеющий IP-адрес 192.168.0.1
.
Если этот компьютер пытается связаться с компьютером за пределами подсети, скажем 192.168.1.1
, он передает сообщение маршрутизатору, маршрутизатор определяет, что IP-адрес находится за пределами диапазона IP-адресов подсети, и вместо того, чтобы передавать его в подсеть, он передает его в сеть, к которой он подключен (возможно, другой маршрутизатор).
решение1
Ваши изначальные предположения не совсем верны. То, что вы называете «маршрутизатором», — это два устройства в одном — двухпортовый маршрутизатор, внутренне подключенный к многопортовомуEthernet-коммутатор. (Вот примердиаграмма.)
Это означает, что компьютерыявляютсянапрямую подключены на уровне 2 и могут отправлять пакеты друг другубезпроходя через ядро маршрутизатора, они просто передаются между портами чипом коммутатора. (У маршрутизатора есть свой собственный «порт» в коммутаторе.)
Поэтому, если вы посмотрите на пакеты с помощью Wireshark, вы увидите, что они напрямую используют MAC-адреса друг друга, в то время как «внешние» пакеты всегда имеют MAC-адрес маршрутизатора в качестве пункта назначения.
(Я предполагаю, что вы говорите о типичных «беспроводных маршрутизаторах», которые есть в большинстве домов и которые обычно являются причиной такого рода вопросов. Более крупная сеть имела быотдельныймаршрутизатор с одним портом на подсеть и несколькими отдельными коммутаторами (возможно, одним главным и одним на этаж/комнату), а также несколькими десятками компьютеров, подключенных к этим коммутаторам.)
Примерно то же самое и с сетями Wi-Fi, только "коммутатор" заменяется на "беспроводной мост", он же "точка доступа". В обоих случаях подключенные компьютеры могут отправлять пакеты друг другу напрямую на уровне 2,безпроходящий через маршрутизатор.
Комментарии:
Когда я сказал маршрутизатор, я на самом деле имел в виду коммутатор. Моя ошибка. Я имею в виду, что каждый компьютер в подсети не подключен друг к другу, а к коммутатору, который затем может передавать пакеты по правильному адресу. Кадр Ethernet не содержит маску подсети, поскольку коммутатор уже имеет эти знания, и, следовательно, не нуждается в них для правильного переключения.
Это снова неверно. У коммутаторов нет этих знаний; их коммутационное ядро работает на уровне 2 и не знаетчто-либоо IP – он пересылает кадры Ethernet исключительно на основе поля «MAC-адрес назначения».
Поэтому хостам нужна маска подсети, чтобы определить, какой MAC-адрес использовать в качестве пункта назначения:
Если одноранговый узел находится в той же подсети, предполагается, что онпо ссылкепо определению – поэтому кадр Ethernet будет иметь MAC-адрес однорангового узла в качестве пункта назначения.
Для сверстниковснаружиподсеть, кадр Ethernet будет иметьшлюзыMAC в качестве пункта назначения.
(Это относится к конфигурации по умолчанию. Некоторые специальные сети-снежинки изменяют это — например, большинство операционных систем позволяют добавлять дополнительные маршруты «on-link» для дополнительных подсетей; и наоборот, некоторые коммутаторы могут быть настроены на подделку ответов ARP таким образом, что даже трафик «on-link» принудительно проходит через шлюз.)
решение2
Как компьютер узнает, чтоадрес назначениянаходится в той же подсети или в другой?
Проверкалокальный адресимаска подсети.
Давайте рассмотрим пару примеров:
Если у моего компьютера есть 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
должен быть достигнут через маршрутизатор.
решение3
Неочевидным в IP является то, что каждое IP-устройствосам по себе является маршрутизатором.
Это можно увидеть на обычном ПК с помощью команды "route print". Вы подключены к двум сетям: локальному сегменту Ethernet или Wi-Fi и локальной сети. Каждый пакет должен быть подвергнут решению о том, в какую сеть его поместить.
Это становится более очевидным, если вы помещаете свой компьютер в две сети, скажем, в "публичную" и "частную". Теперь вам определенно нужна маска подсети, чтобы решить, в какую сеть отправлять пакет.
Многие случайно обнаруживают, что ПК с одним сетевым подключением может работать с неправильно настроенной маской подсети: в итоге они просто отправляют все данные на шлюз.
решение4
TCP/IP можно было бы спроектировать так, как вы предлагаете: конечные узлы отправляли бы все данные маршрутизатору, а он пересылал бы их получателю, который мог бы находиться в той же подсети, что и отправитель.
Но это не будет оптимальным решением по двум причинам:
Он использует большую полосу пропускания: каждый пакет между устройствами в одной подсети должен передаваться дважды: один раз от отправителя к маршрутизатору и еще раз от маршрутизатора к получателю. В сетях, где маршрутизатор также является сетевым коммутатором, это на самом деле не дополнительная полоса пропускания, так как он в любом случае должен был пройти через коммутатор. Но не все сетевые технологии работают так. Первоначальная конструкция Ethernet была шинной технологией без центрального коммутатора или повторителя.
Это увеличивает нагрузку на маршрутизатор. Даже если маршрутизатор также является коммутатором, это немного больше работы, поскольку он переходит к реализации маршрутизации уровня 3, а не к более простой коммутации уровня 2.
Общая философия, воплощающая дизайн TCP/IP, заключается в том, что конечные узлы являются интеллектуальными устройствами, поэтому предполагается, что они могут выполнять часть работы. Им не нужно знать полную топологию сети, как магистральным маршрутизаторам, но они знают достаточно о локальной среде, чтобы взять на себя часть начальной задачи локальной-удалённой маршрутизации. Для реализации этой простой начальной маршрутизации не требуется много кода.
Более того, устройства, не являющиеся маршрутизаторами, не обязательно находятся только в одной подсети. Вы можете легко иметь несколько сетевых карт в ПК — многие из них имеют как Ethernet, так и WiFi. И каждая из них может быть подключена к другой подсети, а адреса и маски подсети используются для определения того, какую сетевую карту использовать. Если вы запускаете виртуальные машины, то, скорее всего, будет виртуальная подсеть, соединяющая их с хост-системой.