HTTP下载原理

合集下载

浏览器下载原理

浏览器下载原理

浏览器下载原理
浏览器下载是指通过浏览器从互联网上获取文件或资源并保存到本地设备的过程。

浏览器下载的原理可以概括为以下几个步骤:
1. 用户在浏览器中输入下载链接或通过单击页面上的下载链接触发下载操作。

2. 浏览器向服务器发送HTTP请求,请求服务器提供文件或资源的许可。

3. 服务器接收到请求后,根据请求中的信息判断是否有提供下载资源的权限。

4. 如果服务器允许下载,将文件或资源划分为一个或多个数据块,每个数据块都有唯一的标识符。

5. 服务器将数据块按照一定的顺序和规则发送给浏览器。

6. 浏览器接收到数据块后,将其放入下载队列,并逐步按照标识符正确的顺序组合数据块。

7. 下载过程中,浏览器将已经下载的数据块写入到本地文件系统中的一个临时文件。

8. 下载完成后,浏览器将临时文件移动到用户指定的下载目录,并根据用户的设置进行命名。

9. 下载过程中,浏览器还会显示下载进度、文件大小、剩余时间等信息以供用户了解下载的状态。

10. 下载完成后,用户可以通过浏览器或操作系统的文件管理
器进行查找和使用下载的文件。

需要注意的是,不同的浏览器可能有不同的下载机制和细节处
理方式,但总的原理是相似的。

此外,浏览器下载还可以通过使用多线程、断点续传等技术来提高下载速度和可靠性。

http协议下载文件

http协议下载文件

http协议下载⽂件1. 通过在 URL 上调⽤ openConnection ⽅法创建连接对象。

(HttpURLConnection conn = (HttpURLConnection)new URL("⽹址").openConnection();)2. 处理设置参数和⼀般请求属性。

(conn.setRequestProperty())3. 使⽤ connect ⽅法建⽴到远程对象的实际连接。

(conn.connect())4. 远程对象变为可⽤。

远程对象的头字段和内容变为可访问。

(conn.getHeaderField(),conn.getInputStream等⽅法对连接进⾏操作)下⾯是对⽂件下载的具体实现案例(单线程):HttpURLConnection conn = (HttpURLConnection)new URL("资源⽹址").openConnection();conn.connect();InputStream is = connection.getInputStream();FileOutputStream os = new FileOutputStream("保存路径");int count = 1024;if(connection.getResponseCode()==200){while ((count = is.read(b))!=-1) {os.write(b,0,count);}os.close();is.close();}多线程要设置的头⽂件:connection.setRequestProperty("Range", "bytes=0-4194304");/*有个疑惑:代码这样写的话,出现⽂件下载不全。

while (count==1024) {count = is.read(b)os.write(b,0,count);}*/。

Http工作原理

Http工作原理

Http⼯作原理HTTP协议(HyperText Transfer Protocol,超⽂本传输协议)是⽤于从WWW服务器传输超⽂本到本地浏览器的传送协议。

它可以使浏览器更加⾼效,使⽹络传输减少。

它不仅保证计算机正确快速地传输超⽂本⽂档,还确定传输⽂档中的哪⼀部分,以及哪部分内容⾸先显⽰(如⽂本先于图形)等。

在了解HTTP如何⼯作之前,我们先了解计算机之间的通信。

2. 计算机相互之间的通信互联⽹的关键技术就是TCP/IP协议。

两台计算机之间的通信是通过TCP/IP协议在因特⽹上进⾏的。

实际上这个是两个协议:TCP : Transmission Control Protocol 传输控制协议和IP: Internet Protocol ⽹际协议。

IP:计算机之间的通信IP协议是计算机⽤来相互识别的通信的⼀种机制,每台计算机都有⼀个IP.⽤来在internet上标识这台计算机。

IP 负责在因特⽹上发送和接收数据包。

通过 IP,消息(或者其他数据)被分割为⼩的独⽴的包,并通过因特⽹在计算机之间传送。

IP 负责将每个包路由⾄它的⽬的地。

IP协议仅仅是允许计算机相互发消息,但它并不检查消息是否以发送的次序到达⽽且没有损坏(只检查关键的头数据)。

为了提供消息检验功能,直接在IP协议上设计了传输控制协议TCP.TCP : 应⽤程序之间的通信TCP确保数据包以正确的次序到达,并且尝试确认数据包的内容没有改变。

TCP在IP地址之上引端⼝(port),它允许计算机通过⽹络提供各种服务。

⼀些端⼝号为不同的服务保留,⽽且这些端⼝号是众所周知。

服务或者守护进程:在提供服务的机器上,有程序监听特定端⼝上的通信流。

例如⼤多数电⼦邮件通信流出现在端⼝25上,⽤于wwww 的HTTP通信流出现在80端⼝上。

当应⽤程序希望通过 TCP 与另⼀个应⽤程序通信时,它会发送⼀个通信请求。

这个请求必须被送到⼀个确切的地址。

在双⽅“握⼿”之后,TCP 将在两个应⽤程序之间建⽴⼀个全双⼯ (full-duplex) 的通信,占⽤两个计算机之间整个的通信线路。

http断点续传的原理

http断点续传的原理

http断点续传的原理
——————————————先讲原理,如下:——————————————————
举⼀个详细的例⼦:
⼀般场景,要访问的域名:,⽂件名为down.zip
服务器到请求后,按要求寻找请求的⽂件,提取⽂件的信息,然后返回给浏览器,返回信息如下
好了。

现在讲解⼀下断点续传原理:
所谓断点续传,也就是要从⽂件已经下载的地⽅开始继续下载。

因此,在客户端,浏览器传给web服务器的时候要多加⼀条信息--从哪⾥开始。

⽐⽅说,“浏览器”来传递请求信息给服务器,要求从2000070字节开始:
range: bytes=2000070- 这个就是浏览器对服务器喊话:“喂!服务器,down.zip这个⽂件从2000070字节开始传过来!前⾯的字节不⽤传了哈~”
服务器说:“好嘞!您等着~”,返回如下(返回的代码也改为206了,⽽不再是200了):
——————————————原理到此结束——————————————————。

web端断点续传研究

web端断点续传研究

假如一个文件有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字段说明服务器返回了文件的某个范围及文件的总长度。这时ContentLength字段就不是整个文件的大小了,而是对应文件这个范围的字节数,这一点一定要注意。
2.应用分析
• 2.1.web端上传下载 • 2.2.客户端上传下载
2.1.web端上传下载
• • • • • • • • • • • • • • • • • • • • • • • • 下载实例 $fname = './MMLDZG.mp3'; $fp = fopen($fname,'rb'); $fsize = filesize($fname); if (isset($_SERVER['HTTP_RANGE']) && ($_SERVER['HTTP_RANGE'] != "") && preg_match("/^bytes=([0-9]+)-$/i", $_SERVER['HTTP_RANGE'], $match) && ($match[1] < $fsize)) { $start = $match[1]; } else { $start = 0; } header("Cache-control: public"); header("Pragma: public"); if ($star > 0) { fseek($fp, $start); ‘ Header("HTTP/1.1 206 Partial Content"); Header("Content-Length: " . ($fsize - $start)); Header("Content-Ranges: bytes" . $start . "-" . ($fsize - 1) . "/" . $fsize); } else { header("Content-Length: $fsize"); Header("Accept-Ranges: bytes"); } header("Content-Type: application/octet-stream"); header("Content-Disposition: attachment;filename=mmdld.mp3"); fpassthru($fp); fclose($fp);

HTTP协议的原理和应用场景分析

HTTP协议的原理和应用场景分析

HTTP协议的原理和应用场景分析HTTP协议是现代互联网的基础协议之一,它是超文本传输协议的缩写。

HTTP协议的主要作用是建立在互联网基础设施之上的应用层协议,它使得网络上的应用能够相互通信和交互。

本文将详细介绍HTTP协议的原理和应用场景分析。

一、HTTP协议的原理HTTP协议是一个客户端和服务器之间通信的协议,一个HTTP请求由客户端发送至服务器,服务器响应这个请求,发送相关的数据和内容回到客户端。

HTTP协议是建立在TCP/IP协议之上,使用TCP或UDP端口作为传输层。

HTTP协议的工作方式是客户端发送请求给服务器,服务器回应响应。

HTTP协议的请求部分由以下几个部分组成:1.请求方法:表示请求哪种操作,常见的有GET、POST、HEAD等。

2.请求URI:表示请求的资源及其位置,如:/index.html。

3.协议版本:表示使用HTTP协议的版本号,如:HTTP/1.1。

4.请求头部:包含一些对请求的描述,如Accept、User-Agent 等。

5.请求正文:请求数据,如POST请求时传送的数据。

HTTP协议的响应部分由以下几个部分组成:1.状态码:表示服务器对请求的处理结果,如200表示成功,404表示未找到。

2.协议版本:表示使用HTTP协议的版本号,如:HTTP/1.1。

3.响应头部:包含一些对响应的描述,如Content-Type、Content-Length等。

4.响应正文:响应数据,如网页的HTML代码。

二、HTTP协议的应用场景HTTP协议是互联网中最为常用的协议之一,被广泛应用在互联网上的各类应用程序中,下面是HTTP协议的几个典型的应用场景:1.万维网(WWW)WWW是HTTP协议最为常见和重要的应用场景。

通过HTTP 协议,我们可以在网页之间进行超链接,实现网页之间的跳转和交互。

2.下载文件HTTP协议可以实现文档、图片、音频等文件的下载,例如常见的软件下载、视频下载等。

http是什么

http是什么

http是什么HTTP(HyperText Transfer Protocol,超文本传输协议)是一种用于传输超文本的应用层协议。

它是互联网上应用最广泛的协议之一,用于客户端和服务器之间的通信。

HTTP通过传输和接收超文本,实现了Web浏览器和Web服务器之间的数据交换。

本文将介绍HTTP的基本概念、工作原理和应用。

一、HTTP的基本概念HTTP是一种无状态协议,即服务器不会记住之前的通信状态。

每个HTTP请求都是独立的,服务器无法通过之前的请求了解客户端的信息。

这样设计的原因是为了提高服务器的处理效率,并使得系统更具有可扩展性。

二、HTTP的工作原理1. 客户端发送请求当用户在浏览器中输入网址或点击链接时,浏览器会向服务器发送HTTP请求。

请求包括请求方法(如GET、POST等)、请求头和请求体。

2. 服务器处理请求服务器接收到请求后,会解析请求头中的信息,并根据请求方法和请求地址来确定如何处理请求。

服务器可能会对请求进行验证、验证用户身份、查询数据库等操作。

3. 服务器返回响应服务器根据请求的处理结果生成响应数据,包括响应头和响应体。

响应头包含了响应状态码、响应类型等信息,响应体则包含了实际的数据。

4. 客户端处理响应浏览器接收到响应后,会根据响应头中的信息来判断如何处理响应。

根据响应头的内容,浏览器可能会展示网页内容、下载文件、重定向等。

三、HTTP的应用HTTP在互联网上广泛应用于各类Web应用程序,其中最为重要的应用就是网页浏览。

用户通过浏览器向Web服务器发送HTTP请求,服务器返回相应的HTML、CSS和JavaScript等前端代码,浏览器解析后展示给用户。

此外,HTTP还可用于下载文件、提交表单数据、管理账户和会话等。

例如,当用户在网上购物时,通过HTTP将购物车中的商品信息和用户信息提交给服务器进行处理。

四、HTTP的发展HTTP的发展经历了多个版本的迭代,目前最新的版本是HTTP/2。

下载原理是什么

下载原理是什么

下载原理是什么
下载原理是通过网络将文件从服务器传输到本地设备的过程。

具体而言,下载过程可以分为以下几个步骤:
1. 客户端发起下载请求:用户在浏览器或其他下载工具中输入下载链接或点击下载按钮,客户端会向服务器发送下载请求。

2. 服务器响应请求:服务器接收到下载请求后,会根据请求的URL找到对应的文件,并生成响应。

3. 响应头信息:服务器的响应包括响应头和响应体两部分。

响应头中包含了下载文件的相关信息,比如文件类型(Content-Type)和文件大小(Content-Length)等。

4. 建立连接:客户端在收到服务器响应后,会尝试与服务器建立连接。

连接的建立可以通过一些传输协议(如HTTP协议)实现。

5. 下载文件:在连接建立后,客户端会按照事先定义的下载策略向服务器请求文件数据。

服务器将文件数据分块发送给客户端,客户端根据接收到的数据逐渐组装成完整的文件。

6. 断点续传:如果支持断点续传,客户端在下载过程中可能会请求文件的某一部分,而非整个文件。

服务器会根据客户端请求头中的“Range”字段来返回对应的文件数据。

7. 下载完成:当客户端接收到文件的所有数据后,文件下载就
完成了。

客户端会保存下载的文件到本地设备的指定位置。

值得注意的是,下载速度还受到网络带宽、服务器性能以及客户端设备的限制。

同时,一些下载工具还支持多线程下载或使用下载加速器等技术来提高下载速度。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

HTTP下载原理对于HTTP协议,向服务器请求某个文件时,只要发送类似如下的请求即可:GET /Path/FileName HTTP/1.0Host: :80Accept: */*User-Agent: GeneralDownloadApplicationConnection: 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 OKContent-Length: 13057672 Content-Type: application/octet-streamLast-Modified: Wed, 10 Oct 2005 00:56:34 GMTAccept-Ranges: bytesETag: "2f38a6cac7cec51:160c"Server: Microsoft-IIS/6.0X-Powered-By: Date: Wed, 16 Nov 2005 01:57:54 GMTConnection: 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/1000Content-Range字段说明服务器返回了文件的某个范围及文件的总长度。

这时Content-Length字段就不是整个文件的大小了,而是对应文件这个范围的字节数,这一点一定要注意。

一切好像基本上没有什么问题了,本来我也是这么认为的,但事实并非如此。

如果我们请求的文件的URL 是类似/filename.exe这样的文件,则不会有问题。

但是很多软件下载网站的文件下载链接都是通过程序重定向的,比如pchome的ACDSee的HTTP下载地址是:/php/tdownload2.php?sid=5547&url=/multimedia/viewer/acdc31sr1b051007.exe&svr =1&typ=0这种地址并没有直接标识文件的位置,而是通过程序进行了重定向。

如果向服务器请求这样的URL,服务器就会返回302(Moved Temporarily),意思就是需要重定向,同时在HTTP头中会包含一个Location字段,Location字段的值就是重定向后的目的URL。

这时就需要断开当前的连接,而向这个重定向后的服务器发请求。

#include <winsock2.h>#include <fstream>#pragma comment(lib, "ws2_32.lib ")using namespace std;#define BUFFSIZE 2048void main(){//初始化Socket函数库WSADATA wsaData;if(WSAStartup(MAKEWORD(2,0), &wsaData) || LOBYTE(wsaData.wVersion) != 2)return;struct protoent *ppe;ppe = getprotobyname("tcp");//创建SOCKEt对象SOCKET sock = socket(PF_INET, SOCK_STREAM, ppe->p_proto);if(sock == INVALID_SOCKET)return;//根据主机名获得IP地址hostent* pHostEnt = gethostbyname("");if(pHostEnt == NULL)return;int nTime = 10000;setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char*)&nTime, sizeof(nTime)); setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char*)&nTime, sizeof(nTime));//连接struct in_addr ip_addr;memcpy(&ip_addr, pHostEnt->h_addr_list[0], 4); //haddr_list[0]里4个字节,每个字节8位struct sockaddr_in destaddr;memset((void *)&destaddr, 0, sizeof(destaddr));destaddr.sin_family = AF_INET;destaddr.sin_port = htons(80);destaddr.sin_addr = ip_addr;if(0 != connect(sock,(struct sockaddr*)&destaddr, sizeof(destaddr)))return;//格式化请求,各字段含义参见HTTP协议RFC2616char request[] = "GET / HTTP/1.1\r\n""Host:\r\n""Accept:*/*\r\n""User-Agent:Mozilla/4.0 (compatible; MSIE 5.00; Windows 98)\r\n""Connection:Close\r\n\r\n";//发送请求if(SOCKET_ERROR == send(sock, request, strlen(request), 0))return;//接收网页信息并存储int rcv_bytes = 0;char buf[BUFFSIZE] = {0,};ofstream ofs("out.txt", ios::binary | ios::out | ios::trunc);rcv_bytes = recv(sock, buf, BUFFSIZE, 0); //先接收服务器返回的报文至"\r\n\r\n"while(1){rcv_bytes = recv(sock, buf, BUFFSIZE, 0);if(rcv_bytes <= 0)break;ofs.write(buf, rcv_bytes);}ofs.close();closesocket(sock);WSACleanup();}。

相关文档
最新文档