Правите го с повикването 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:
Задава или получава настройката Path MTU Discovery за сокет. Когато е активиран, Linux ще извърши Path MTU Discovery, както е дефинирано в 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