2013-05-16 5 views
2

Я знакомлюсь с разъемами BSD, и, щелкнув по странице man от sendto, я столкнулся с флагом MSG_CONFIRM, что для меня сейчас довольно загадочно.Почему я должен использовать MSG_CONFIRM или не использовать его?

Описание говорит:

Сообщить ссылку слой, вперед прогресс произошло: вы получили успешный ответ от другой стороны. Если ссылочный уровень не получает , он будет регулярно воспроизводить соседний (например, посредством одноадресной ARP). Действует только для SOCK_DGRAM и SOCK_RAW сокетов и в настоящее время реализовано только для IPv4 и IPv6.

После быстрого взгляда на человека странице arp, я понимаю, что что-то пометки MSG_CONFIRM предотвращает адрес ARP отображение MAC ↔ IP-адрес удаленной машины из рассматриваемых несвежий.

Теперь я озадачен тем, что не вижу причин, почему я должен был не, и поэтому почему они не применяли это непосредственно в библиотеке. Почему ожидается, что уровень приложения будет иметь дело со всем, что происходит там, на уровне ссылки.

Так что я пропустил что-нибудь? когда я должен его установить или не установить?

ответ

2

Причина, по которой не отправлять ее, в случае, если MAC-адрес для IP-адреса изменяется со временем. Если вы постоянно говорите, что ваша система не проверяет, она будет продолжать отправлять на тот же MAC, даже если IP-адрес больше не существует.

Похоже, что для его отправки требуется особая ситуация, когда вы можете гарантировать что-либо о получателе ваших сообщений. Накладные расходы на периодический запрос ARP очень низки, поэтому преимущества крайне ограничены.

2

Вы должны установить флаг только в том случае, если отправляемая датаграмма является прямым ответом на дейтаграмму, которую вы только что получили от того же однорангового узла.

Если вы отправляете первоначальный запрос или отправку дейтаграммы в ответ на некоторое другое событие (например, пользовательский ввод, или тайм-аут), то вы должны не установить MSG_CONFIRM флаг.