C++ 堂在哪里;使用的IP标志的t片段位?

C++ 堂在哪里;使用的IP标志的t片段位?,c++,c,networking,network-programming,network-protocols,C++,C,Networking,Network Programming,Network Protocols,我很想知道IP标志的“Don't Fragment”[DF]位在哪里使用。因为碎片对更高层是看不见的,他们也不在乎 我也在寻找一个例子 事先非常感谢。并非所有上层都看不到碎片。一些早期(甚至可能是当前)的微控制器TCP/IP堆栈没有实现完整的功能,例如碎片处理。在这种情况下使用标志将确保数据包以其原始形式到达,而不是另一端无法处理的大量片段 此外,在使用UDP时,并不需要所有片段都到达目的地,因此,防止碎片化意味着消息要么到达,要么不到达——不可能只有一部分UDP数据报到达目的地。我记不起TCP

我很想知道IP标志的“Don't Fragment”[DF]位在哪里使用。因为碎片对更高层是看不见的,他们也不在乎

我也在寻找一个例子


事先非常感谢。

并非所有上层都看不到碎片。一些早期(甚至可能是当前)的微控制器TCP/IP堆栈没有实现完整的功能,例如碎片处理。在这种情况下使用标志将确保数据包以其原始形式到达,而不是另一端无法处理的大量片段

此外,在使用UDP时,并不需要所有片段都到达目的地,因此,防止碎片化意味着消息要么到达,要么不到达——不可能只有一部分UDP数据报到达目的地。我记不起TCP/IP堆栈在等待丢失片段的未组装IP数据包上保留了多长时间,但使用DF标志意味着在此期间没有不必要的资源被占用

最后,您可以使用它来测试网络基础设施的行为,例如,当您得到一个大于最大传输单元的数据包时会发生什么情况(DF将防止该数据包被碎片化以“挤穿”该漏洞)。

除了(或者作为他提到的测试的一部分),DP标志也在中使用。这是当您试图找出对于给定链接,可以发送而不被分段的最大数据包是什么

避免碎片化通常很有用,即使高级协议在理论上与它的机制隔离,它们仍然可以“感觉”到后果。如果对网络套接字的单个应用程序级别
write()
由于太大而被碎片化,并且其中一个碎片在网络中丢失,则整个IP数据包将丢失。这当然会影响吞吐量


出于这个原因,通常希望知道最大传输单元,即可以发送到目的地而不被分段的最大分组。Path MTU discovery用于查找此大小,只需设置DF位并连续发送更大的数据包,直到网络报告(通过)故障。

请注意,没有标准方法在C中设置DF。在Linux上,此代码可以工作:

result = setsockopt(mysocket, IPPROTO_IP, 
                IP_MTU_DISCOVER, IP_PMTUDISC_DO, sizeof(int));
但FreeBSD6上没有

此外,路径MTU发现在真实的互联网上非常不可靠。太多损坏的防火墙和中间盒过滤掉ICMP“数据包太大”消息(以下是在面试中测试候选网络管理员的一个好方法:让他/她停止ping,他/她可能会完全阻止ICMP)。请参阅RFC 2923:“路径MTU发现的TCP问题”


这就是为什么IETF现在提出了一种新的方法来测试MTU,而不依赖路径MTU发现:RFC 4821:“打包层路径MTU发现”

,这非常便于了解+1.