В процессе очередной сессии общения с @hellt_ru по поводу одного из его проектов встал вопрос правомерности существования шлюза по умолчанию в другой подсети. Резкое и категоричное “НЕТ, ГРЕШНО” плавненько сменилось на “oh, snap”.
Изучение RFC (в частности 1122) выявило следующие забавные факты:
- Хост обязан передавать пакеты напрямую если адрес назначения находится в той же подсети.
- Хост обязан передавать пакеты шлюзу по умолчанию, если адрес назначения находится в иной подсети.
- Но нигде не сказано, что шлюз по умолчанию должен находится в той же подсети. Достаточно, чтобы эта сеть была connected :)
Так и получается:
R1#ping 10.1.1.2 Type escape sequence to abort. Sending 5, 100-byte ICMP Echos to 10.1.1.2, timeout is 2 seconds: ..!!! Success rate is 60 percent (3/5), round-trip min/avg/max = 40/45/56 ms
R1 рассылает на широковещательный адрес запрос о том, есть ли в connected сети 192.168.0.140. R2 отвечает ему – “да, это я, вот мой mac”. Больше этих ребят ничего не интересует:
All hail ARP!
Добавлено:
В комментариях к статье возник небольшой спор по поводу работы всей этой радости на shared сегменте. Возьмем следующую схему:
Допустим мы хотим с R1 достичь lo0 на R5.
R1:
R1#sh ip route | b Gate Gateway of last resort is 0.0.0.0 to network 0.0.0.0 C 192.168.1.0/24 is directly connected, FastEthernet0/0 S* 0.0.0.0/0 is directly connected, FastEthernet0/0
Ситуация в точности такая же. R1 с Fa0/0 отправит броадкаст всем соседям на L2 сегменте с вопросом у кого есть IP 10.1.1.1, на что получит ответ от R3 – “я знаю, выберете меня, вот мой mac”. В этом случае default gateway в явном виде вообще не задан.