关于wcf的tcp绑定传文件的速率问题的深究
前面有篇随笔比较了http、tcp和管道绑定的文件传输速率
今天又特意比较了http和tcp每次Read的大小,结果是这样的:
http绑定不管怎么样每次都是4096;
tcp绑定与maxBytesPerRead属性有关。
测试过程记录如下:
tcp 客户端 maxBytesPerRead="4089"
255 4083 12 4083 4083 4083 4083
tcp 客户端 maxBytesPerRead="40890"
255 4095 40884 24654 40884 24651 40884 24651 40884
tcp 客户端 maxBytesPerRead="65536"
255 4095 65529 9 65529 6 65529 9 65529 6
tcp 客户端 maxBytesPerRead="65538"
255 4095 65532 6 65532 6 3
初步判断 这是 tcp的流量控制机制导致 每次大小的区别涉及到 tcp的滑动窗口
窗口由16bit定义,所以最大支持65535个字节的缓冲 maxBytesPerRead基本上等于窗口大小+7
TCP的最大报文长度是65535byte(即64K) 测试发现 最大长度可以达到65538byte(前提是maxBytesPerRead>65535+7)
在程序中减少循环次数可以加快速度
在这篇随笔中http://www.cnblogs.com/langu/archive/2013/02/26/2933309.html,本机wcf的tcp绑定传文件流模式60~70MB/s的速度(大概0.38秒),结合这篇随笔的结论,
将maxBytesPerRead="65543" 每次Read的BufferSize设置为65536,结果流模式只需要0.16秒(大概155MB/s),速度提升了一倍之多。
局域网wcf的tcp绑定流模式原来的2~3MB/s的速度(大概10秒),现在也只需要0.31秒(8.05MB/s)。
这是本人目前测试时流模式下最快速度的设定。
至于http为什么每次都是4096字节?还待继续深究
在TCP的一本书中看到这样的介绍:
接收方提供的窗口大小通常可以由接收经常控制,这将影响TCP的性能(HTTP在TCP之上)。
迄今为止,SunOS,BSD/386和SVR4系统仍然使用4096字节的默认大小……
……对以太网而言,默认的4096字节并不是最理想的大小……《TCP/IP协议详解 卷一:协议》P214
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?