1

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

Однако, когда два компьютера связываются, они используют IP-адрес для отправки пакетов.

Если я создаю программу на C (сервер и клиент) и запускаю сервер на одном ПК, а клиент - на другом хосте в той же сети и начинаю общаться (предположим, я знаю IP-адрес обоих), как именно NIC первого компьютера будет знать NIC компьютера с IP-адресом назначения?

Кадр должен иметь MAC-адрес назначения, иначе все MAC-адреса назначения будут широковещательными MAC-адресами.

Без компьютера, который знает MAC-адрес назначения, коммутатор бесполезен (насколько я понимаю), и я не понимаю, как хосты узнают MAC-адреса друг друга, если они действительно обмениваются данными с использованием IP-адресов.

1 ответ1

2

Если я создаю программу на C (сервер и клиент) и запускаю сервер на одном ПК, а клиент - на другом хосте в той же сети и начинаю общаться (предположим, я знаю IP-адрес обоих), как именно NIC первого компьютера будет знать NIC компьютера с IP-адресом назначения?

Предположим, IPv4. Для IPv6 принципы аналогичны, но детали разные (обнаружение соседей вместо ARP).

Сначала ваш компьютер ищет IP-адрес назначения в своей таблице IP-маршрутизации. Это сообщит ему "интерфейс" и «IP-адрес следующего перехода». Если пункт назначения находится в локальной подсети, то IP-адрес следующего перехода будет таким же, как IP-адрес назначения (если пункт назначения не находится в локальной подсети, то IP-адрес следующего перехода будет адресом шлюза).

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

Чтобы узнать MAC-адрес, ваш компьютер отправляет запрос ARP. Запрос ARP отправляется на широковещательный MAC-адрес. Если все работает, компьютер следующего перехода (пункт назначения в вашем случае) ответит на запрос ARP, ваш компьютер создаст запись в своей таблице arp, и пакеты в очереди будут отправлены.

Если нет ответа на запрос ARP, то ваша система, скорее всего, будет повторять конечное число раз, прежде чем отказаться от отправки пакетов. В зависимости от ОС он может или не может генерировать недоступные пакеты хоста ICMP, когда он сдается (linux делает, BSD, очевидно, нет, не уверен насчет окон).

Я знаю больше о том, как работает маршрутизация. В принципе (? если у компьютера нет IP-адреса в кэше ARP и ни один хост в сети не отвечает на пакет запроса arp), то хост, который хочет отправить данные на какой-либо IP-адрес, перенаправит пакет на шлюз по умолчанию (который должен быть маршрутизатор), и этот маршрутизатор затем проверит таблицу маршрутизации, чтобы увидеть, к какому порту он подключен, СЕТЬ, в которую входит IP-адрес назначения. Если сеть не находится в этой таблице, маршрутизатор переходит на свой собственный маршрут по умолчанию и так далее, пока какой-либо маршрутизатор не узнает сеть. Это правильно?

Это неправильно, шлюз по умолчанию используется, когда нет другой записи в таблице IP-маршрутизации, которая соответствует IP-адресу назначения. Не используется в случае сбоя ARP. Использование шлюза по умолчанию в случае сбоя ARP может привести к созданию петель маршрутизации.

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