Почему 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).