Bạn làm điều đó với các setsockopt()
cuộc gọi, bằng cách sử dụng tùy chọn IP_DONTFRAG
::
int val = 1;
setsockopt(sd, IPPROTO_IP, IP_DONTFRAG, &val, sizeof(val));
Here's một trang giải thích điều này một cách chi tiết hơn nữa.
Đối với Linux, nó xuất hiện bạn phải sử dụng tùy chọn IP_MTU_DISCOVER
với giá trị IP_PMTUDISC_DO
(hoặc IP_PMTUDISC_DONT
để tắt nó đi):
int val = IP_PMTUDISC_DO;
setsockopt(sd, IPPROTO_IP, IP_MTU_DISCOVER, &val, sizeof(val));
tôi đã không kiểm tra này, chỉ cần nhìn vào các tập tin header và một chút tìm kiếm trên web, do đó bạn sẽ cần phải kiểm tra nó.
Là để cho dù có một cách khác để cờ DF có thể được thiết lập:
I find nowhere in my program where the "force DF flag" is set, yet tcpdump
suggests it is. Is there any other way this could get set?
Từ trang tuyệt vời này here:
IP_MTU_DISCOVER:
Sets or receives the Path MTU Discovery setting for a socket. When enabled, Linux will perform Path MTU Discovery as defined in RFC 1191 on this socket. The don't fragment flag is set on all outgoing datagrams. The system-wide default is controlled by the ip_no_pmtu_disc
sysctl
for SOCK_STREAM
sockets, and disabled on all others. For non SOCK_STREAM
sockets it is the user's responsibility to packetize the data in MTU sized chunks and to do the retransmits if necessary. The kernel will reject packets that are bigger than the known path MTU if this flag is set (with EMSGSIZE
).
này vẻ với tôi như bạn có thể thiết lập mặc định cho toàn hệ thống sử dụng sysctl
:
sysctl ip_no_pmtu_disc
trả về "error: "ip_no_pmtu_disc" is an unknown key"
trên hệ thống của tôi nhưng có thể được đặt trên máy của bạn. Ngoài ra, tôi không biết bất cứ điều gì khác (ngoài setsockopt()
như đã đề cập trước đây) có thể ảnh hưởng đến cài đặt.
Mà mức là dưới, IPPROTO_IP? – WilliamKF
Có cách nào khác có thể được thiết lập không? Tôi đoán rằng mặc định DF đã tắt, phải không? – WilliamKF
Tôi nghĩ rằng nó là tắt theo mặc định nhưng bạn có thể sử dụng một getockopt (đáng ngạc nhiên đủ :-) để có được giá trị hiện tại của nó. – paxdiablo