我正在开发一个应用程序,它处理(视频处理等)并通过网络发送大文件(高达数十千兆字节)。我正在使用FTP发送文件。为了提高应用程序的性能/内存消耗,我希望优化缓冲区,这样我就不会发送太大的数据包并使其碎片化。我的问题是,我没有太多的RAM来保存发送时的文件数据。基本上,我只是从磁盘读取足够的字节,处理它,并立即发送到目的地。目前,我正在寻求实现MTU路径发现。
我对如何做的基本概念很熟悉。我想知道windows中是否有.NET API可以跟踪目的地的MTU?
我猜没有这样的事情,但我的一个朋友告诉我windows vista会跟踪。
我正在为windows XP开发这个应用程序,但我想知道windows中是否有这样的网络跟踪API。
发布于 2009-10-22 14:22:03
winsock不支持报告发现的MTU,即使其他TCP/IP堆栈也支持(例如,通过套接字选项IP_GETPMTU报告AIX )。由于winsock不能报告这一点,所以.NET不能提供API (必须在winsock之上)。
我建议以64kiB为单位发送数据。这是IP数据包的最大大小,并且可能大于MTU,因此堆栈将发送几个完整的数据段。最后一个片段可能更小,但是系统可能会延迟发送它(因为它仍然需要接收早期数据的确认),所以如果您快速跟进64kiB的下一次发送,系统将使用路径mtu将这些块重新组合为数据包。
发布于 2009-10-22 13:09:17
如果您使用的是TCP,这不是您必须自己做的事情。此外,这与发送缓冲区的大小没有关系。可以有多个数据包正在传输(最大为TCP窗口大小),但它们将不再位于您维护的缓冲区中。
发布于 2009-10-22 13:10:27
如果您使用的是UDP,您可能会关心碎片,但如果是这样,为什么要实现自己的协议来传输大文件?改用TCP,不用担心。如果您在UDP上实现自己的协议,并具有拥塞控制和所有其他所需的功能,则在数据包上设置DF位并处理响应。
如果你使用的是TCP,你根本不需要担心碎片,堆栈会帮你做到这一点。
https://stackoverflow.com/questions/1605084
复制相似问题