Если я создаю программу на 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 может привести к созданию петель маршрутизации.