Вы делаете это с помощью вызова 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 другим способом:
Я не нахожу нигде в моей программе, где установлен "флаг Force DF", но tcpdump
предполагает, что это так. Есть ли другой способ установить это?
С этой превосходной страницы здесь :
IP_MTU_DISCOVER:
Устанавливает или получает настройку Path MTU Discovery для сокета. Когда включено, Linux будет выполнять Обнаружение 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()
, как упоминалось ранее), которое может повлиять на настройку.