我正在开发一个处理(视频处理等)并通过网络发送大文件(高达数十千兆字节)的应用程序。我正在使用FTP发送文件。为了提高应用程序的性能/内存消耗,我想优化缓冲区,这样我就不会发送太大而且碎片化的数据包。我的问题是我没有太多的RAM来保存文件数据发送时。基本上,我从磁盘读取足够的字节,处理它并立即发送到目的地。目前我正在寻求实现MTU路径发现。
我熟悉如何做的基本概念。我想知道Windows中是否有任何.NET API跟踪目的地的MTU?
我猜不会有这样的事情,但是我的一个朋友告诉我,windows vista会跟踪。
我正在为Windows XP开发此应用程序,但我想了解Windows中是否有这样的网络跟踪API。
答案 0 :(得分:2)
winsock不支持报告发现的MTU,即使其他TCP / IP堆栈也是如此(例如AIX通过套接字选项IP_GETPMTU)。由于winsock无法报告,因此.NET无法提供API(必须在winsock之上)。
我建议以64kiB的块发送数据。这是最大IP数据包大小,可能大于MTU,因此堆栈将发送几个完整的段。最后一个片段可能更小,但是,系统可能会延迟发送它(因为它仍然需要接收早期数据的确认),因此如果您在下一次发送64kiB时快速跟进,系统将再次将这些块组合成使用路径mtu的数据包。
答案 1 :(得分:0)
如果您使用TCP,这不是您必须自己做的事情。此外,与发送缓冲区的大小无关。传输中可能有多个数据包(最多为TCP窗口大小),但它们将不再位于您维护的缓冲区中。
答案 2 :(得分:0)
如果您使用UDP,您可能会关心碎片,但如果是这样,为什么要实现自己的协议来传输大文件?请改用TCP,不要担心。如果您通过UDP实现自己的协议,包括拥塞控制和所有其他需要的东西,那么在数据包上设置DF位并处理响应。
如果您使用的是TCP,则根本不需要担心碎片,堆栈会为您执行此操作。
答案 3 :(得分:0)
使用FtpWebRequest
和FtpWebResponse
。问题是这些类不使用大缓冲区而是使用流(使用最佳大小的缓冲区实现)。内存使用量非常小。
数据包大小不在您的控制之下,而是在网络驱动程序下。
如果您需要最佳速度,请在服务器端和客户端实施数据发送/接收TcpClient
类。
UPD:以下是有关如何上传文件的示例:http://msdn.microsoft.com/en-us/library/system.net.ftpwebrequest.aspx请参阅class AsynchronousFtpUpLoader
。
还有一件事。前段时间我正在试验MTU。我的所有更改都降低了数据传输速度。 Windows网络驱动程序非常智能,可以使用最佳MTU。
答案 4 :(得分:0)
PMTU Discovery仅用于TCP堆栈,用于在发送时优化数据包大小。在你的水平上,你只能看到流(即,在打包之前甚至发生,更不用说碎片了)。你真正的问题是你正在尝试发送数据,但是你的tcp / ip连接速度较慢,所以这会导致ram所需的空间增加。既然您正在使用FTP,我希望您使用的FTP实现已经支持并理解这一点???既然你要求缓冲区,它听起来像是你自己基于套接字或类似的东西。如果您正在使用同步发送方法,当套接字缓冲区已满时,它应该阻止您发送,直到它有缓冲区空间。
您是否可以提供有关您用来发送文件的API的更多详细信息,您自己使用的是Builtin vs. roll?无论是socket,networkstream等?