一、文件传输

前端时间做了和文件传输相关的工作,今天抽空做个总结。总结一下平常使用的几种协议以及BtTorrent协议。其实BitTorrent协议也不是什么新协议,它诞生也十几年了。咱也蹭个热点,最近几年大火的区块链技术也和BitTorrent协议有着异曲同工之处,都是p2p。话不多说,先介绍几种传统的文件传输协议:

1、FTP协议

FTP,File Transfer Protocol的简写,文件传输协议,属于TCP/IP协议之一。包含两个部分:FTP服务器和FTP客户端。

FTP服务器用来存储文件,用户可以使用FTP客户端通过FTP协议访问位于FTP服务器上的资源,包括上传和下载。

通常情况下,FTP传输效率非常高,一般网络上传输大的文件时,也采用该协议。

不过,FTP毕竟已经诞生40多年了,许多厂商已经考虑不再支持FTP了。

据悉,Chrome浏览器开发者正讨论逐步放弃对FTP协议的支持。即将生效的一个变化是,部分FTP文件将不再提供页面预览,而是直接跳转下载。这是弱化FTP协议并最终取消的开端,Chrome开发者们对维护文件服务器目录也已经厌倦了,况且还有安全问题。

另外,Mozilla也早有类似弱化FTP的讨论,预计Firefox也将追随Chrome的脚步。

FTP协议有一些难以改善的缺点,尤其是密码和文件内容都使用明文传输而容易被窃听、传输大量小文件时效果不好等,很早之前,有将SSL证书应用到FTP上的讨论,但最终,开发者们认为继续为FTP增加代码已经没有必要,倒不如扫入回收站。如今,P2P点对点协议已经在很大程度上成为如今互联网文件传输的主流。

2、SFTP协议

由于FTP协议的安全性相对不高,后来又发展出来SFTP协议。SFTP:SSH文件传输协议(英语:SSHFile Transfer Protocol,也称Secret File Transfer Protocol,中文:安全文件传送协议,英文:Secure FTP或字母缩写:SFTP)是一数据流连接,提供文件访问、传输和管理功能的网络传输协议。SFTP协议是在FTP的基础上对数据进行加密,使得传输的数据相对来说更安全。但是这种安全是以牺牲效率为代价的,也就是说SFTP的传输效率比FTP要低。

3、SCP协议

全称Secure Copy协议,是用来定义“本地机器和远端机器之间”或者“远端机器和远端机器之间”传输文件的过程的协议。SCP协议处于OSI(Open System Interconnection)七层体系中的应用层。通常是在linux之间分发文件使用的。

scp是secure copy的缩写,scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令。linux的scp命令可以在linux服务器之间复制文件和目录。上述三种方式区别:FTP是基于TCP协议传输文件,明文传输文件数据和用户信息;SFTP基于SSH协议,文件加密,可靠性高,可断点续传;SCP基于SSH协议,文件加密,但不可断点续传,由此诞生scp的增强版rsync。

4、rsync

rsync是linux系统下的数据镜像备份工具。使用快速增量备份工具Remote Sync可以远程同步,支持本地复制,或者与其他SSH、rsync主机同步。与scp不同:sync和scp在文件均不存在时,执行时间相差不大,但是文件存在的情况下差异很大。原因是scp是复制:若文件不存在则新建,若存在则覆盖,可以理解为scp为“复制”。而rsync则在文件在存在于两主机时,比较两文件是够相同,相同的话,就什么都不做,若存在差异就直接更新。简单的说rsync只对差异文件做更新。

二、BitTorrent协议

1、简介

BitTorrent是一种内容分发协议,由布拉姆·科恩2001年自主开发。

一般的下载服务器为每一个发出下载请求的用户提供下载服务,而BitTorrent的工作方式与之不同。文件的持有者将文件发送给其中一名用户,再由这名用户转发给其它用户,用户之间相互转发自己所拥有的文件部分,直到每个用户的下载都全部完成。这种方法可以使下载服务器同时处理多个大体积文件的下载请求,而无须占用大量带宽。

简而言之:资源不再由一个服务器提供,而是所有下载文件的服务器提供。服务器既是下载者,也是上传者。参与者越多,速度也快!

原理:制作目标文件的种子文件或者磁力链接(其中会把目标文件分成若干个碎片文件),下载者通过种子文件或磁力链接,去tracker服务器或DHT网络下载文件,同时获取其它下载该文件的下载者信息。此时,每一个下载者不光能从文件源服务器处下载文件,也能从其它下载者处获取文件。

传统文件传输方式与p2p模式对比:

1)传统文件传输方式:

传统文件传输方式,比如FTP、SCP、RSYNC等都是一对一传输,如下图所示。这种方式对于下载者少是很好的,但是如果下载者多了,对服务器来说就是一种负担了,占带宽并且速度慢,这种方式是串行的。

2)p2p分发文件方式:

BitTorrent协议就归属于P2P分发方式,p2p文件分发上面已经说过,就是peer-to-peer。每一个peer既是下载者也是上传者,peer下载的同时也会向其它的peer提供上传服务。甚至在下载完毕的时候,也会向其它peer再提供一段时间的上传服务。如下图所示:

2、架构

BitTorrent架构主要包括:Tracker服务器(或者DHT网络)、种子解析文件服务器、以及下载者BTclient。

Tracker服务器:一个BTclient在开始下载以及下载进行的过程中,要不断与tracker服务器进行通信,并报告自己的信息,同时获取其它BTclient的信息。这种通信是基于HTTP协议的,故又称之为tracker HTTP协议。不过这种方式弊端还是比较大的,如果Tracker服务器一旦挂掉,BTclient就不能继续下载文件了。由此,后来者又发明了DHT网络,这我们之后的文章会讲。

备注:

P2P文件分发是有几个阶段的,最早是使用Tracker服务器作为BTclient信息的交换网络。后来因为Tracker的局限性,又发展处DHT网络以及混合型P2P网络。

种子解析文件服务器:该服务器通常的作用就是把文件制作成种子文件,并且一直提供该文件的上传服务,BTclient通过Tracker服务器找到它,并从中下载文件。

下载者BTclient,其实就是下载的用户,用户通过相应的软件去对应地址下载文件。

它们之间的关系如下:

三、BitTorrent优缺点

有得就有失,这个世界没有什么是只有好处没有坏处的,技术发展也一样。BitTorrent具有非常明显的优势:分发速度快、分发机器多、节省带宽。

缺点也很明显:耗资源,尤其是cpu和内存,那是因为BitTorrent是把文件划分为一个个小文件用于peer之间进行比对。分发文件时,peer之间需要频繁的对自己和其它peer拥有的小文件碎片进行比对,以判断哪些小文件是自己能下载的,以及能上传的,这很耗CPU。并且不断的上传和下载对内存的使用也是一种负担。

四、BitTorrent的python实现

1、使用python-libtorrent

Python-libtorrent模块是一个使用python语言编写的BitTorrent模块,使用它可以制作BT种子,以及根据种子下载文件。和OpenTracker结合起来可以搭建一整套BT环境。篇幅所限,就不在此赘述了,有兴趣者可以百度自行搜索。

2、murder

除了使用python-libtorrent外,我们还可以使用相对便捷的murder。murder是twitter开源的一款产品,比较成熟,不需要python-libtorrent那样还需要自己写程序,非程序员可以考虑使用它。而且里面包含了上述所有的组件。方便快捷,具体安装和使用方式如下:

1)tracker服务器安装:

2)seeder生成种子以及开启种子解析文件服务器:

3)peer节点下载文件(BTclient下载文件):

五、结语

这几个文件分发协议其实各有优劣,没有哪个是完完全全碾压其它协议的。总之,有所得就得有所失。今天大概只是讲了几个文件传输协议的基础原理,并没有很探讨更深入的原理。里面还有很多可讲的点,比如DHT网络,怎么制作一个类似迅雷的软件,这些东西我们下次再聊。

 

了解新钛云服

招聘:高级运维工程师

新钛云服正式获批工信部ISP/IDC(含互联网资源协作)牌照

深耕专业,矗立鳌头,新钛云服获千万Pre-A轮融资

新钛云服,打造最专业的Cloud MSP+,做企业业务和云之间的桥梁

新钛云服一周年,完成两轮融资,服务五十多家客户

上海某仓储物流电子商务公司混合云解决方案

新钛云服出品的部分精品技术干货

国内主流公有云VPC使用对比及总结

万字长文:云架构设计原则|附PDF下载

刚刚,OpenStack 第 19 个版本来了,附28项特性详细解读!

Ceph OSD故障排除|万字经验总结

七个用于Docker和Kubernetes防护的安全工具

运维人的终身成长,从清单管理开始|万字长文!

OpenStack与ZStack深度对比:架构、部署、计算存储与网络、运维监控等

什么是云原生?

IT混合云战略:是什么、为什么,如何构建?

c++判断ftp服务器文件存在性判断_BitTorrent协议与传统文件分发协议对比相关推荐

  1. 【FTP工具类】提供FTP服务器的连接, 查找文件目录,及读取文件内容等操作

    介绍:FTP工具类,提供FTP服务器的连接, 查找文件目录,及读取文件内容等操作. 应用场景: 通过FTP连接需要获取文件目录列表 通过FTP连接读取指定文件内容 递归读取遍历服务器上所有文件 其他功 ...

  2. java判断ftp创建目录是否成功_Java判断Ftp服务器目录是否存在,若不存在创建目录 ....

    解决方法1: package com.soft4j.log4j; import java.io.IOException; import sun.net.ftp.FtpClient; public cl ...

  3. ftp服务器通常提供文件上传和,基于FTPClient的文件上传至Nginx服务器

    一.Nginx做图片服务器 通常一个小型系统的图片,保存在应用服务器的项目目录下即可,但是对于一个中型规模的系统,就需要使用独立的图片服务器,单独分离图片的访问.目的是一方面缓解应用服务器的访问压力, ...

  4. 服务器常规维修与判断方法,服务器常规维修与判断方法88119.doc

    服务器故障排除 相比PC而言,服务器出故障的机率是小多了,但是它出故障造成的损失可也大多了.作为服务器维修人员需要了解一些服务器故障恢复的基本知识,知道在维修时可以做些什么来最快速的解决问题也可以减少 ...

  5. es文件浏览器自动上传ftp服务器,es文件浏览器访问ftp服务器

    es文件浏览器访问ftp服务器 内容精选 换一换 WordPress简称WP,最初是一款博客系统,后逐步演化成一款免费的CMS(内容管理系统/建站系统).本文档指导用户使用华为云市场镜像"W ...

  6. ftp服务器文件复制文件路径,FTP将文件复制到同一FTP的另一个位置

    我需要将同一文件上传到同一FTP的2个不同位置. 有没有办法将FTP上的文件复制到另一个位置,而不是再次上传? 谢谢. 斯坦 自从他问了这个简单的问题以来已经7年了,而每个人都必须努力完成这项任务已经 ...

  7. 使用cmd上传指定文件到ftp服务器,命令行下的FTP使用详解

    命令行下的FTP使用详解 更新时间:2011年11月08日 11:59:51   作者: 今天新到一台服务器,需要做一些环境配置拷入一些备份数据,在这台服务器上装FlashFxp又觉得麻烦,所以干脆用 ...

  8. PHP中curl使用案例(四)-- 从ftp服务器下载文件到本地

    //从FTP服务器下载一个文件到本地 //初始化 $curl = curl_init(); //设置被下载文件的url curl_setopt($curl, CURLOPT_URL,"ftp ...

  9. es文件浏览器怎么开ftp服务器,es文件浏览器怎么建立ftp服务器

    es文件浏览器怎么建立ftp服务器 内容精选 换一换 弹性云服务器的密钥文件是在创建密钥对后,浏览器会提示您下载或自动下载私钥文件,请妥善保管.在SSH登录弹性云服务器时,您将需要提供相应的私钥.密钥 ...

最新文章

  1. boost learn notes
  2. 今天才发现ff不支持navigate。
  3. golang append时slice len 和 cap
  4. 内存泄漏的原因及解决办法_编程基础 | C++片段 指针、多态和内存分配
  5. url override and HttpSession implements session
  6. 官网安装Nvidia CUDA Toolkit、cuDNN报错502的备用镜像下载网址
  7. 高通骁龙855刚捂热 骁龙865就现身:三星代工 7nm EUV制程
  8. dell 虚拟linux,戴尔:Linux是轻松构建虚拟主机的关键
  9. BundleLoader:帮你无缝加载自定义Bundle里的资源文件
  10. 计算机二级做的完吗,大学计算机二级都没过 毕业后却做起了IT。。。。。
  11. QQ群聊天记录统计分析 V0.2
  12. Python爬虫入门【11】:半次元COS图爬取
  13. layui 下拉框多选
  14. 【Leetcode】每日一题2021/09/08
  15. 使用drbd实现数据的高可用
  16. 坚果云 linux程序名称,备份Linux系统数据到坚果云
  17. 嵌入式程序编写方法与规范
  18. sq-接口项目-外卖系统
  19. python 日期字符串转换时间戳
  20. 三星note3怎样刷原生Android,三星note3怎样刷机 三星note3刷机步骤介绍【教程】

热门文章

  1. Android应用程序显示未读消息计数
  2. Java加密解密快速入门上篇【包括MD5、BASE64、DES、RSA等算法】
  3. 20 | 散列表(下):为什么散列表和链表经常会一起使用?
  4. php sslbug,PHP错误抑制符(@)导致引用传参失败Bug的分析
  5. mybatis新增返回主键值
  6. 第14章 任务和特权级保护
  7. 压缩命令_Linux gzip命令:压缩文件或目录
  8. python集群到hadoop_如何使用Hadoop流在本地Hadoop集群中运行MRJob?
  9. k-means 聚类过程演示
  10. Xcode添加pch文件