Этот год меня раздражал.Время ожидания ARP. Почему фиксированные периодические?
Основной вопрос: Есть ли какая-то причина, по которой ARP имеет, с фиксированными таймаутами в записи ARP-кеша?
Я занимаюсь большой работой в кривых в реальном времени. В наши дни мы выполняем большую часть наших межсистемных коммуникаций на выделенных линиях UDP/IP. Это по большей части работает надежно в режиме реального времени, но за один тайм-аут ARP.
Путь типичных реализаций сделать ARP заключается в следующем:
- Когда клиент просит отправить пакет IP на IP-адрес с UNKOWN MAC-адрес, вместо отправки этого пакета IP, стек отсылает ARP-запрос. Если верхний уровень (TCP) повторно отправляется, это не проблема. Но поскольку мы используем UDP, исходное сообщение теряется. Во время запуска это нормально, но в середине операции это Bad Thing ™.
- (динамический) Записи таблицы ARP периодически удаляются из таблицы ARP, даже если мы только что получили пакет из этой системы миллисекунд назад. Это означает, что Bad Thing ™ происходит с нашей системой регулярно.
Очевидное решение (которое мы используем религиозно) состоит в том, чтобы сделать все записи ARP статическими. Тем не менее, это королевская PITA (особенно в RTOS, где поиск MAC-адреса интерфейса не всегда зависит от нескольких простых графических кликов).
Назад, когда мы написали наш собственный стек IP, я решил эту проблему, никогда (никогда) не выбирая записи таблицы ARP. Это имеет очевидные недостатки. Более надежным и вполне разумным решением может быть обновление тайм-аута ввода, когда будет просматриваться пакет из той же комбинации MAC/IP. Таким образом, запись будет только время ожидания, если она не сообщила со стеком за это время.
Но теперь мы используем стек IP нашего поставщика, и мы вернулись к глупым таймаутам ARP. У нас достаточно рычагов с этим продавцом, чтобы я мог заставить их использовать менее неудобную схему. Тем не менее, универсальность этого алгоритма «мозгового мертвого таймаута» заставляет меня думать, что это может быть неотъемлемой частью реализации.
Так вот в чем вопрос. Это как-то требуется?
Я бы сказал, что поведение сброса пакета и, вместо этого, процедура arp довольно плохое. например Windows буферизирует только 1 пакет во время arp, в то время как многие другие ОС делают более разумную вещь и буферизуют пакеты в обычном буфере сокета во время arp. – nos
@ nos - Исходящие или входящие? Насколько я могу судить, исходящие * TCP * пакеты буферизуются (так как TCP работает, чтобы обеспечить надежность). Исходящие пакеты UDP просто удаляются. –
Любой исходящий IP-пакет (для адресата), будь то TCP или UDP. Конечно, TCP обнаруживает и повторно передает упавшие пакеты. – nos