Почему IP_TTL и IP_MULTICAST_TTL являются отдельными опциями сокетов?

При отправке UDP multicast вы можете использовать IP_MULTICAST_TTL установить TTL. Но в противном случае вы бы использовали IP_TTL, Почему эти два разных варианта в глазах setsockopt() а также getsockopt()? Есть ли ситуации, в которых установка их по отдельности имеет смысл?

Мне кажется, что они в конечном итоге устанавливают одинаковое значение в заголовке IP.

1 ответ

Решение

Эти параметры на самом деле работают по-разному.

настройка IP_MULTICAST_TTL влияет только на исходящие многоадресные дейтаграммы, но не на одноадресные. Напротив, установка IP_TTL опция (по крайней мере, в Linux) влияет только на исходящие одноадресные дейтаграммы. Это позволяет использовать один TTL для многоадресной рассылки и один TTL для одноадресной рассылки.

Есть похожие флаги для IPv6, а именно IPV6_MULTICAST_HOPS а также IPV6_UNICAST_HOPS,

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

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

Такое поведение было подтверждено в CentOS 7.2 (ядро 3.10) и Ubuntu 16.04 (ядро 4.4).

Другие вопросы по тегам