`

【转】http文件下载原理

web 
阅读更多

【转自】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也帮了我一些忙,它的文件下载日志对开发人员还是很有帮助的。
分享到:
评论

相关推荐

    PB下载HTTP文件.rar_PB-183下载_pb http_pb http下载_pb http下载图片_pb 下载

    例如,使用libcurl,你可以创建一个封装libcurl的DLL,然后在PB中调用相应的函数进行文件下载。 ```pb // 调用DLL函数,参数为URL和保存路径 long ret = CallLib("curl.dll", "curl_download", ...

    文库下载原理分析

    ### 文库下载原理详解 随着互联网技术的发展与普及,网络上的各类资源变得异常丰富,其中文库类资源因其丰富的信息量而受到了广泛的关注。对于学习和研究者来说,文库内的文档往往包含了宝贵的知识和信息,然而很多...

    基于CH340C设计的USB TYPE-C接口转TTL串口AD硬件原理图+PCB+封装库文件.zip

    本项目提供的资源是基于CH340C芯片设计的一个USB TYPE-C接口转TTL串口适配器的完整硬件设计方案,包括原理图、PCB布局以及封装库文件。这个设计对于学习和实践数字通信、嵌入式系统调试或者DIY爱好者来说是非常有...

    DB9接口RS232转TTL电平单片机烧写下载器AD设计原理图+PCB文件.zip

    DB9接口RS232转TTL电平单片机烧写下载器是电子工程领域中常见的设备,用于将电脑上的编程数据通过串行通信方式传输到单片机内部进行程序烧录。这个设计通常涉及到RS232通信标准、TTL电平转换以及电路设计等方面的...

    AD原理图转cadence

    ### AD原理图转Cadence:实现跨平台设计的无缝衔接 #### 一、背景与需求分析 在电子设计领域,不同的EDA(电子设计自动化)工具因其独特的功能和优势被广泛应用于各类项目中。Altium Designer (AD) 和 Cadence ...

    SP3232芯片 TTL转RS232模块 Cadence16.3设计硬件原理图+PCB文件.zip

    标题中的"SP3232芯片 TTL转RS232模块 Cadence16.3设计硬件原理图+PCB文件.zip"揭示了本主题的核心内容,即基于SP3232芯片实现TTL电平到RS232电平转换的模块设计。这个设计采用了Cadence 16.3软件进行硬件原理图和PCB...

    STM32C8T6+语音识别LD3320+文字转语音SYN6288原理图及PCB全套文件

    全套文件通常包括原理图(Schematic)和PCB布局图(Layout),原理图展示了电路的工作原理和元件间连接,而PCB布局图则是将这些元件实际布置在板上的三维视图,确保信号的正确传输和系统的稳定运行。 在开发过程中...

    MSATA源工程文件(原理图+PCB)

    本压缩包包含的"MSATA源工程文件"是设计MSATA接口硬件时的重要参考资料,包括了原理图、PCB布局以及BOM(Bill of Materials)清单。 一、原理图 原理图是电子电路设计的基础,它清晰地展示了各个元器件之间的连接...

    AC220V转DC(12V15W )电源板AD设计硬件原理图+PCB文件.zip

    AC220V转DC(12V15W )电源板AD设计硬件原理图+PCB文件,2层板设计,大小为100*55mm, ALTIUM设计的原理图+PCB文件,可以做为你的学习设计参考。 主要器件型号如下: Library Component Count : 24 Name Description -...

    关于文件系统原理的ppt文档

    在本篇中,我们将深入探讨文件系统的基本原理、常见类型以及不同操作系统如何支持多种文件系统。 首先,文件系统的核心任务是定义用户接口,包括文件的属性(如权限、大小、创建时间等)、允许的操作(如读、写、...

    ASP.NET(C#) Web Api通过文件流下载文件的实例

    首先,我们要理解Web API的基本原理,它是一个用于构建RESTful服务的框架,允许通过HTTP协议来传输数据,而文件下载正好可以通过HTTP响应进行。 在本例中,我们创建了一个名为`DownloadController`的控制器,该控制...

    INTEL Pcie转千兆网 I210IT+H5020NL+RJ45 AD设计硬件原理图库+PCB封装库文件.zip

    INTEL Pcie 转千兆网 I210IT+H5020NL+RJ45 AD设计硬件原理图库+PCB封装库文件,PcbLib+SchLib格式,Altium Designer原理图库+PCB封装库文件,已在项目中验证使用,可作为你产品设计的参考也可以直接应用到你的项目...

    Cadence OrCAD Capture CIS原理图库PCB库文件(超全阻容电感).zip

    有了这些库文件,设计师可以确保原理图中的元件能够在PCB布局阶段顺利转换,避免因封装不匹配导致的设计问题。 "超全阻容电感"表示这个库包含了大量不同规格和类型的阻容电感元件,涵盖了广泛的应用场景,无论是...

    USB转TTL模块原理图及PCB(可直接投板)

    2. **电路原理图**:TTL.DSN文件是Candence软件中的原理图设计文件。原理图中会详细展示各个元器件之间的连接关系,包括USB收发器、电平转换器、晶振、电源管理单元以及必要的电阻、电容等被动元件。通过原理图,...

    可以把delphi的dcu文件转换为pas文件的工具!

    在Delphi编程环境中,DCU(Delphi Compiled Unit)文件是编译后的单元...这个过程涉及到了Delphi的编译原理、逆向工程的基本概念,以及在没有源代码时恢复源代码的挑战。同时,强调了保留源代码在软件开发中的重要性。

    HTTP 下载文件并打印

    在实际应用中,DLL可能还包含错误处理机制,比如网络连接失败、文件下载不完整、打印机未就绪等情况。为了提高用户体验,可能还会添加进度条显示下载进度,或者提供取消下载的选项。 至于“PCBPrintDll”,根据名称...

    文件目录结构转文本网页(把文件列表转成html格式) V4.0绿色版

    《文件目录结构转文本网页:技术解析与应用》 在现代数字生活中,管理和呈现大量文件目录结构变得日益重要。为了方便浏览和分享这些信息,将文件目录结构转化为文本网页,尤其是HTML格式,成为了一种高效的方式。...

    sb3转html文件和exe文件超详细教程.rar

    "sb3转html文件和exe文件"这个主题,主要是关于如何将Scratch 3.0的项目文件(sb3格式)转换成可以在网页上运行的HTML文件以及在Windows系统上独立运行的可执行文件(exe)。 首先,我们需要了解sb3文件。sb3是...

    hex文件转bin文件工具

    标题提及的“hex文件转bin文件工具”是一个专门用于将Intel HEX格式(HEX)文件转换为二进制格式(BIN)的工具。Intel HEX是一种文本格式,用于存储可编程设备的编程数据,如微控制器或EPROM。它以ASCII字符形式记录...

    USB type C接口英飞凌JTAG下载器PDF原理图PCB+AD集成封装库文件.zip

    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...

Global site tag (gtag.js) - Google Analytics