Вы делаете это с помощью вызова setsockopt()
, используя опцию IP_DONTFRAG
:
int val = 1;
setsockopt(sd, IPPROTO_IP, IP_DONTFRAG, &val, sizeof(val));
Вот страница, объясняющая это более подробно .
Похоже, что для Linux вы должны использовать параметр IP_MTU_DISCOVER
со значением IP_PMTUDISC_DO
(или IP_PMTUDISC_DONT
, чтобы отключить его):
int val = IP_PMTUDISC_DO;
setsockopt(sd, IPPROTO_IP, IP_MTU_DISCOVER, &val, sizeof(val));
Я не проверял это, просто просмотрел файлы заголовков и немного поиска в Интернете, так что вам нужно это проверить.
Что касается того, есть ли другой способ установить флаг DF:
Я нигде не нахожу в своей программе, где установлен флаг принудительного DF, но tcpdump
предполагает, что это так. Есть ли другой способ установить это?
На этой отличной странице здесь:
IP_MTU_DISCOVER:
Устанавливает или получает параметр обнаружения MTU пути для сокета. Если этот параметр включен, Linux будет выполнять обнаружение Path MTU, как определено в RFC 1191, для этого сокета. Флаг «не фрагментировать» устанавливается для всех исходящих дейтаграмм. Общесистемное значение по умолчанию контролируется ip_no_pmtu_disc
sysctl
для SOCK_STREAM
сокетов и отключено для всех остальных. Для сокетов, отличных от SOCK_STREAM
, пользователь несет ответственность за пакетирование данных в куски размером с MTU и, при необходимости, за повторную передачу. Ядро будет отклонять пакеты, превышающие MTU известного пути, если этот флаг установлен (с EMSGSIZE
).
Мне кажется, что вы можете установить общесистемное значение по умолчанию, используя sysctl
:
sysctl ip_no_pmtu_disc
возвращает "error: "ip_no_pmtu_disc" is an unknown key"
в моей системе, но может быть установлено в вашей. Кроме этого, я не знаю ничего другого (кроме setsockopt()
, как упоминалось ранее), что может повлиять на настройку.
person
paxdiablo
schedule
10.06.2009