TCP/IP传输文件与FTP传输文件有什么区别?效率如何
前言
最近因项目需要,需要把一定数量的中等文件从开发板上传到电脑上,分别选择了FTP和TCP自定义协议两种方式进行传输,进行了简单的对比测试,故做如下记录。
测试环境
开发板:Linux,ARMv7 单核,内存512M
PC:winodw, i7,8G内存,SSD
网络:100M,局域网
文件:大小4.06M,数量50个
四种方案简述
1、FTP上传,短连接,单线程
2、FTP上传,长连接,单线程
3、TCP上传,短连接,单线程
4、TCP上传,短连接,多线程
5、TCP上传,长连接,单线程
说明
1、这里提的TCP上传,是指使用自定义协议TCP方式上传。
2、短连接是指每上传一个文件就连接一次,传完后就关闭连接。
3、长连接是指先连接,再上传多个文件,到退出程序时再关闭连接。
4、单线程是指所有文件的连接、发送、关闭都是在一个线程内完成。
5、多线程是指一个文件对应一个线程,多个文件同时使用多个线程发送。
自定义文件传输协议
自定义文件协议设计得非常简单。
客户端发送数据包 = 128B文件名 + 4B文件长度 + 文件数据
服务端响应数据包 = “OK”
之所以如此设计,列如下几点原因:
1、固定文件名长度,方便处理,也方便定位到文件长度字段。
2、4字节文件长度刚好和整型相等,在两个32位小端机器上直接拷贝发送,代码简单。
3、文件长度字段可以方便检查数据是否接收完全,解决粘包问题。
4、局域网内网络相对比较好,所以没带文件校验。
测试结果
方案1,2分钟
方案2,45秒
方案3,20秒
方案4,20秒
方案5,20秒
结果分析
分析之前,先计算一下理论的传输速度应该是多少,文件总大小约为203M,按100M网络计算,速度应该是203/(100/8) = 16秒。所以说20秒是一个比较不错的速度了,毕竟还有一些文件操作等操作,需要占用一些时间。
方案1和方案2比较
FTP建立连接相对复杂,不断的连接和断开肯定消耗不少时间,所以长连接比短连接传输速度快也是应该的。
FTP方案和TCP方案比较
FTP方案整体上比TCP方案慢得多,毕竟FTP协议肯定比自定义的文件传输协议要复杂得多,交互指令越多,速度越慢。
方案3和方案4比较
两个方案的差别在于是否使用多线程发送。从结果来看,速度相差不大。因为网络的极限速度就是100M,同时发送再多的数据也没有用,都会阻塞在网络上。即使发送的速度可能快一点点,但开启多个线程、线程同步锁等也需要时间,可能相抵消了。
方案3和方案5比较
两个方案的差别在于是否使用长连接。从结果来看,速度相关不大。和上面分析一样,网络的极限速度是100M,而TCP在局域网内建立连接(三次握手)、关闭都非常快。对于发送大量数据的情况,是否使用长连接影响都不大。
从上面的测试和分析结果来看,在本项目中使用方案3或5(TCP上传,单线程),是比较合适的。首先传输速度上表现不错,而且避免使用多线程,不需要线程同步,代码设计更简单,越简单越容易做得更可靠。
当然上面的测试是不充分的,对于其他情况没有进行测试分析。例如,使用FTP多线程发送、更小的文件(小于1k)、更大的文件(大几百M)、更多的数量等等,因时间有限不做测试了。不过通过上面的分析,考虑各个因素对速度的影响,也大概可以选择出比较优的方案。如有机会再测试分析。
欢迎各位评论,指出不足之处。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- django实现后台显示媒体文件
- 服务发现与消费--Eureka与Ribbon的联手出击
- 自我加戏,在自闭的边缘尝试高可用的Eureka
- 视频直播系统源码,图片叠加
- SpringCloud初体验--Hello Eureka
- Android自定义View实现水平带数字百分比进度条
- AndResGuard编译速度优化
- Android自定义带拼音音调Textview
- Android仿音乐播放器带进度的播放暂停按钮
- 一个比较自闭的SpringIOC问题
- 我在大厂写React,学到了什么?
- leetcode(4)寻找正序数组中位数
- jvm源码解析(二)HashMap
- 硬件笔记(23)---- PCB的保护走线
- TabLayout+ViewPager实现切页的示例代码