|
|
1
23
下面并没有直接回答您的问题,但您可能会发现它很有趣;它说IP数据包可以分解/重新组装,因此超过了底层媒体(例如1500字节以太网)的限制: Resolve IP Fragmentation, MTU, MSS, and PMTUD Issues with GRE and IPSEC 有关此主题的详细信息:
我不知道如何通过Windows上的API生成ICMP:有一次,这样的API被提出了,并引起了争议,因为人们认为这样可以很容易地编写通过生成大量ICMP消息来实现拒绝服务功能的软件。 不,看起来像 是 已实现:请参见示例 Winsock Programmer's FAQ Examples: Ping: Raw Sockets Method . 因此,要发现MTU,请使用“不分段”标志生成ping数据包。 也许还有比这更简单的API,我不知道;但我希望我已经给了您理解底层协议。 |
|
|
2
12
除了前面所有的答案,引用 classic : IPv4和IPv6定义 最小重组缓冲区大小 ,保证任何实现都必须支持的最小数据报大小。对于IPv4,这是576字节。ipv6将此值提升到1280字节。
|
|
|
3
3
这对我来说是个有趣的话题。也许在通过UDP在现实世界的互联网上传输大块的UDP数据时,一些实际的结果可能会很有趣,并且以每秒1个数据包的传输速率,数据继续以最小的数据包丢失率出现,最多可达2 K左右。在这一点上,您开始遇到问题,但我们定期提供1600+字节的数据包,而不存在分发区。S-这是通过GPRS移动网络和广域网实现的。假设信号稳定(不是!)你的包丢失率很低。 有趣的是,它不是奇怪的数据包,而是经常有几秒钟的大量数据包——这大概就是为什么VoIP呼叫偶尔会崩溃的原因。 |
|
|
4
2
|
|
|
5
0
对于UDP应用程序,如果要避免IP碎片或丢失数据包,则必须自己处理端到端MTU。任何应用程序的推荐方法都是尽最大努力使用PMTU选择最大数据报,或发送数据报<最小PMTU https://tools.ietf.org/html/rfc5405#section-3.2
Windows通过其基本套接字选项界面设置和访问PMTU信息: 您可以确保PMTU Discover通过IP_MTU_Discover打开,并且可以通过IP_MTU读取MTU。 https://docs.microsoft.com/en-us/windows/desktop/winsock/ipproto-ip-socket-options |