【转自】
http://hi.baidu.com/71site/item/bada63752cab5544ee1e5306
文件下载原理详解1 http协议
最近研究了一下关于文件下载的相关内容,觉得还是写些东西记下来比较好。起初只是想研究研究,但后来发现写个可重用性比较高的模块还是很有必要的,我想这也是大多数开发人员的习惯吧。
对于HTTP协议,向服务器请求某个文件时,只要发送类似如下的请求即可:
GET /Path/FileName HTTP/1.0
Host: www.server.com:80
Accept: */*
User-Agent: GeneralDownloadApplication
Connection: close
每行用一个“回车换行”分隔,末尾再追加一个“回车换行”作为整个请求的结束。
第一行中的GET是HTTP协议支持的方法之一,方法名是大小写敏感的,HTTP协议还支持OPTIONS、HAED、POST、PUT、DELETE、TRACE、CONNECT等方法,而GET和HEAD这两个方法通常被认为是“安全的”,也就是说任何实现了HTTP协议的服务器程序都会实现这两个方法。对于文件下载功能,GET足矣。GET后面是一个空格,其后紧跟的是要下载的文件从WEB服务器根开始的绝对路径。该路径后又有一个空格,然后是协议名称及协议版本。
除第一行以外,其余行都是HTTP头的字段部分。Host字段表示主机名和端口号,如果端口号是默认的80则可以不写。Accept字段中的*/*表示接收任何类型的数据。User-Agent表示用户代理,这个字段可有可无,但强烈建议加上,因为它是服务器统计、追踪以及识别客户端的依据。Connection字段中的close表示使用非持久连接。
关于HTTP协议更多的细节可以参考RFC2616(HTTP 1.1)。因为我只是想通过HTTP协议实现文件下载,所以也只看了一部分,并没有看全。
如果服务器成功收到该请求,并且没有出现任何错误,则会返回类似下面的数据:
HTTP/1.0 200 OK
Content-Length: 13057672
Content-Type: application/octet-stream
Last-Modified: Wed, 10 Oct 2005 00:56:34 GMT
Accept-Ranges: bytes
ETag: "2f38a6cac7cec51:160c"
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
Date: Wed, 16 Nov 2005 01:57:54 GMT
Connection: close
不用逐一解释,很多东西一看几乎就明白了,只说我们大家都关心内容吧。
第一行是协议名称及版本号,空格后面会有一个三位数的数字,是HTTP协议的响应状态码,200表示成功,OK是对状态码的简短文字描述。状态码共有5类:1xx属于通知类;2xx属于成功类;3xx属于重定向类;4xx属于客户端错误类;5xx属于服务端错误类。对于状态码,相信大家对404应该很熟悉,如果向一个服务器请求一个不存在的文件,就会得到该错误,通常浏览器也会显示类似“HTTP 404 - 未找到文件”这样的错误。Content-Length字段是一个比较重要的字段,它标明了服务器返回数据的长度,这个长度是不包含HTTP头长度的。换句话说,我们的请求中并没有Range字段(后面会说到),表示我们请求的是整个文件,所以Content-Length就是整个文件的大小。其余各字段是一些关于文件和服务器的属性信息。
这段返回数据同样是以最后一行的结束标志(回车换行)和一个额外的回车换行作为结束,即“\r\n\r\n”。而“\r\n\r\n”后面紧接的就是文件的内容了,这样我们就可以找到“\r\n\r\n”,并从它后面的第一个字节开始,源源不断的读取,再写到文件中了。
以上就是通过HTTP协议实现文件下载的全过程。但还不能实现断点续传,而实际上断点续传的实现非常简单,只要在请求中加一个Range字段就可以了。
假如一个文件有1000个字节,那么其范围就是0-999,则:
Range: bytes=500- 表示读取该文件的500-999字节,共500字节。
Range: bytes=500-599 表示读取该文件的500-599字节,共100字节。
Range还有其它几种写法,但上面这两种是最常用的,对于断点续传也足矣了。如果HTTP请求中包含Range字段,那么服务器会返回206(Partial Content),同时HTTP头中也会有一个相应的Content-Range字段,类似下面的格式:
Content-Range: bytes 500-999/1000
Content-Range字段说明服务器返回了文件的某个范围及文件的总长度。这时Content-Length字段就不是整个文件的大小了,而是对应文件这个范围的字节数,这一点一定要注意。
一切好像基本上没有什么问题了,本来我也是这么认为的,但事实并非如此。如果我们请求的文件的URL是类似http://www.server.com/filename.exe这样的文件,则不会有问题。但是很多软件下载网站的文件下载链接都是通过程序重定向的,比如pchome的ACDSee的HTTP下载地址是:
http://download.pchome.net/php/tdownload2.php?sid=5547&url=/multimedia/viewer/acdc31sr1b051007.exe&svr=1&typ=0
这种地址并没有直接标识文件的位置,而是通过程序进行了重定向。如果向服务器请求这样的URL,服务器就会返回302(Moved Temporarily),意思就是需要重定向,同时在HTTP头中会包含一个Location字段,Location字段的值就是重定向后的目的URL。这时就需要断开当前的连接,而向这个重定向后的服务器发请求。
好了,原理基本上就是这些了。其实装个Sniffer好好分析一下,很容易就可以分析出来的。不过NetAnts也帮了我一些忙,它的文件下载日志对开发人员还是很有帮助的。
分享到:
相关推荐
例如,使用libcurl,你可以创建一个封装libcurl的DLL,然后在PB中调用相应的函数进行文件下载。 ```pb // 调用DLL函数,参数为URL和保存路径 long ret = CallLib("curl.dll", "curl_download", ...
### 文库下载原理详解 随着互联网技术的发展与普及,网络上的各类资源变得异常丰富,其中文库类资源因其丰富的信息量而受到了广泛的关注。对于学习和研究者来说,文库内的文档往往包含了宝贵的知识和信息,然而很多...
首先,我们要理解Web API的基本原理,它是一个用于构建RESTful服务的框架,允许通过HTTP协议来传输数据,而文件下载正好可以通过HTTP响应进行。 在本例中,我们创建了一个名为`DownloadController`的控制器,该控制...
本项目提供的资源是基于CH340C芯片设计的一个USB TYPE-C接口转TTL串口适配器的完整硬件设计方案,包括原理图、PCB布局以及封装库文件。这个设计对于学习和实践数字通信、嵌入式系统调试或者DIY爱好者来说是非常有...
### AD原理图转Cadence:实现跨平台设计的无缝衔接 #### 一、背景与需求分析 在电子设计领域,不同的EDA(电子设计自动化)工具因其独特的功能和优势被广泛应用于各类项目中。Altium Designer (AD) 和 Cadence ...
标题中的"SP3232芯片 TTL转RS232模块 Cadence16.3设计硬件原理图+PCB文件.zip"揭示了本主题的核心内容,即基于SP3232芯片实现TTL电平到RS232电平转换的模块设计。这个设计采用了Cadence 16.3软件进行硬件原理图和PCB...
全套文件通常包括原理图(Schematic)和PCB布局图(Layout),原理图展示了电路的工作原理和元件间连接,而PCB布局图则是将这些元件实际布置在板上的三维视图,确保信号的正确传输和系统的稳定运行。 在开发过程中...
本压缩包包含的"MSATA源工程文件"是设计MSATA接口硬件时的重要参考资料,包括了原理图、PCB布局以及BOM(Bill of Materials)清单。 一、原理图 原理图是电子电路设计的基础,它清晰地展示了各个元器件之间的连接...
AC220V转DC(12V15W )电源板AD设计硬件原理图+PCB文件,2层板设计,大小为100*55mm, ALTIUM设计的原理图+PCB文件,可以做为你的学习设计参考。 主要器件型号如下: Library Component Count : 24 Name Description -...
在本篇中,我们将深入探讨文件系统的基本原理、常见类型以及不同操作系统如何支持多种文件系统。 首先,文件系统的核心任务是定义用户接口,包括文件的属性(如权限、大小、创建时间等)、允许的操作(如读、写、...
INTEL Pcie 转千兆网 I210IT+H5020NL+RJ45 AD设计硬件原理图库+PCB封装库文件,PcbLib+SchLib格式,Altium Designer原理图库+PCB封装库文件,已在项目中验证使用,可作为你产品设计的参考也可以直接应用到你的项目...
USB type C接口英飞凌JTAG下载器PDF原理图PCB+AD集成封装库文件,可供设计参考 集成库器件列表: Library Component Count : 23 93LC56B T-I/SN AMS1117 ESD7C3.3DT5G FT2232HL Header 2X1 2*1P接口插件 Header 3...
有了这些库文件,设计师可以确保原理图中的元件能够在PCB布局阶段顺利转换,避免因封装不匹配导致的设计问题。 "超全阻容电感"表示这个库包含了大量不同规格和类型的阻容电感元件,涵盖了广泛的应用场景,无论是...
在实际应用中,DLL可能还包含错误处理机制,比如网络连接失败、文件下载不完整、打印机未就绪等情况。为了提高用户体验,可能还会添加进度条显示下载进度,或者提供取消下载的选项。 至于“PCBPrintDll”,根据名称...
"sb3转html文件和exe文件"这个主题,主要是关于如何将Scratch 3.0的项目文件(sb3格式)转换成可以在网页上运行的HTML文件以及在Windows系统上独立运行的可执行文件(exe)。 首先,我们需要了解sb3文件。sb3是...
2. **电路原理图**:TTL.DSN文件是Candence软件中的原理图设计文件。原理图中会详细展示各个元器件之间的连接关系,包括USB收发器、电平转换器、晶振、电源管理单元以及必要的电阻、电容等被动元件。通过原理图,...
在Delphi编程环境中,DCU(Delphi Compiled Unit)文件是编译后的单元...这个过程涉及到了Delphi的编译原理、逆向工程的基本概念,以及在没有源代码时恢复源代码的挑战。同时,强调了保留源代码在软件开发中的重要性。
标题中的“51单片机开发板PCB文件+原理图(STC常用芯片封装库+51系列全库)”指的是一个资源包,包含了用于51系列单片机开发板设计的相关资料。这个资源包的核心是PCB(Printed Circuit Board,印制电路板)文件和原理...
《文件目录结构转文本网页:技术解析与应用》 在现代数字生活中,管理和呈现大量文件目录结构变得日益重要。为了方便浏览和分享这些信息,将文件目录结构转化为文本网页,尤其是HTML格式,成为了一种高效的方式。...