澳门新浦京娱乐场网站-www.146.net-新浦京娱乐场官网
做最好的网站

澳门新浦京娱乐场网站node静态服务器断点续传完

1、简介

  那朝气蓬勃篇小说重要介绍的是http左券下载时的断点续传,详细到各类步骤。重要步骤有:DNS查找、TCP一遍握手、http请求发送、TCP左券数据传输、暂停后的状态、继续下载、TCP一遍握手、http哀告发送、数据传输、。。。、下载成功发送http响应音信、TCP五回握手断开连接。

阅读目录

当顾客从静态文件服务器上拿到诸如歌曲这样的流媒体文件时,若是网络连接断开,重连后未做拍卖,就供给再一次下载那些文件。所认为了防止这种情景,我们的服务器要求风流倜傥种断点续传的意义。而http 1.第11中学正好规定了生机勃勃种Range编写制定,大家能够透过这种体制来扩丰盛片传输。

假使大家的网址提供文件下载的服务,那么普通我们都梦想下载能够断点续传(Resumable Download),也正是说顾客能够暂停下载,并在以往的有些时间从暂停处继续下载,而不用再一次下载整个文件。

2、原理知识

  2.1、问答问答

  问:什么是断点续传?断点续传的规律是怎样?

  答:断点续传正是确定性信号中断后(掉线或关机等),后一次能够从上次的地点接着传送(平时指下载或上传),不扶植断点续传就代表后一次下载或上传必得从零起头。http左券中的断点续传是依照Http头Range以致Content-Range。HTTP头中平时断点下载时才用到Range和Content-Range实体头,Range顾客央浼头中,钦命第4个字节之处和末段二个字节的岗位,如( Range:200-300也许Range:200- 卡塔尔;Content-Range用于响应头。通俗的来讲正是文件大小为10,本次下载了3,被中断了,下一次波澜起伏下载时则将指针移到3地点,从3从头下载,最后将全方位文件下载下来。

  2.2、轻巧http下载文件

澳门新浦京娱乐场网站node静态服务器断点续传完结,PHP完结文件下载断点续传精解。  伸手下载整个文件: 
  GET /test.rar HTTP/1.1 
  Connection: close 
  Host: 192.168.95.11
  Range: bytes=0-801 //平常诉求下载整个文件是bytes=0- 或实际不是这几个头
  貌似不荒谬回应 :
  HTTP/1.1 200 OK 
  Content-Length: 801      
  Content-Type: application/octet-stream 
  Content-Range: bytes 0-800/801 //801:文件总大小

  2.3、主要的多少个头

澳门新浦京娱乐场网站node静态服务器断点续传完结,PHP完结文件下载断点续传精解。  响应头:

  Content-type:Content-type 告诉浏览器文件的MIME 类型,那是不行关键的一个响应头了,MIME连串成千成万。很恐怕会在程序中漏掉一些MIME类型,表示一切为 content-type:application/octet-stream(字节流卡塔尔国

  Content-Disposition:是 MIME 合同的扩张,MIME 公约提示 MIME 客户代理怎样突显附加的文本。当 Internet Explorer 接收到头时,它会激活文件下载对话框,它的文书名框自动填写了头中内定的文本名。 嗯,正是以此头哟,激活弹出提醒下载框,日常那样写content-disposition:attachment; filename=name

  Content-Length:"Content-Length: 321" 正是告诉浏览器这一个文件的高低是321字节,其实小编发掘贴近不安装那个头,浏览器也能团结辨认

  Pragma Cache-control:把那2个头都安装成public 告诉浏览器缓存,小编平日设置cache-control:public

  Content-Range:字段表明服务器重临了文本的某部范围及文件的总参谋长度。这个时候Content-Length字段就不是总体文件的深浅了,而是对应文件这么些界定的字节数,这点必须求介怀。平日格式,Content-Range: bytes 500-999/1000

  响应头: 

  Range:可以恳求实体的多个依然七个子范围。

  例如:
  表示头500个字节:bytes=0-499
  代表首个500字节:bytes=500-999
  代表最后500个字节:bytes=-500
  表示500字节现在的界定:bytes=500-  【下载断点续传(日常range格式为500-卡塔尔】
  第三个和末段八个字节:bytes=0-0,-1
  同期钦赐多少个范围:bytes=500-600,601-999
  不过服务器能够忽视此诉求头,假诺无条件GET包蕴Range供给头,响应会以状态码206(PartialContent卡塔尔国重回实际不是以200(OK卡塔 尔(阿拉伯语:قطر‎。【206象克服务器已经到位get的一些乞请,即表示断点续传】

  • 1、简介
  • 2、原理知识
  • 3、支持断点续传的文书下载类
  • 4、测验并解析内部的手续
  •   4.1、前提打算职业
  •   4.2、测量检验支持断点续传下载
  •   4.3、测量检验不帮助断点续传下载
  • 5、总结

Range

当多个服务器补助Range时,客商端能够将需求发送的内容分为比超级多份发送给服务端,服务端能够每一回收到部分剧情。有了这么的力量,遭受断网的动静,大家能够在客户端记录下风姿浪漫度传送的公文范围,互连网恢复后再将剩下部分发送给服务端,那样就实现了断点续传。

Range的在http 1.第11中学的具体定义能够参照文书档案:

  • rfc2616

切切实实流程如下:

  • 浏览器央浼内容。

  • 服务器告诉浏览器,该内容能够使用 Accept-Ranges 消息头举办总局分央求。

    response.setHeader('Accept-Ranges', 'bytes');
    
  • 浏览珍视新发送恳求,用 Range 新闻头告诉服务器要求的剧情范围。

    发送的Range格式:字节数(bytes)= (开始)-(结束)

    那是浏览器告知服务器所需办事处分内容范围的新闻头. 注意初阶和甘休地方是都不外乎在内的,並且是从0开首的. 那一个音讯头也足以不发送四个地方,其意义如下:

    • 若是得了地方被去掉了,服务器会回去从注脚的发端地方到总体内容的竣事地方内容的尾声一个可用字节。
    • 假定初阶地方被去掉了,截至地方参数能够被描述成从最终一个可用的字节算起可以棉被和衣服务器重回的字节数。

而服务器会分如下二种境况响应浏览器的乞请:

  • 若果节制是理当如此的,服务器会再次来到所央浼的有些剧情,并带上 206 Partial Content 状态码. 当前内容的范围会在 Content-Range 新闻头中阐明。
    发送的Content-Range格式:字节数(bytes)=(开始)-(结束)/(总数)
  • 假诺界定是不可用的(比如,比内容的总字节数大), 服务器会重返 416 央求范围不创建 Requested Range Not Satisfiable 状态码. 可用的约束也会在 Content-Range 音信头中注明。

澳门新浦京娱乐场网站 1

3、帮助断点续传的文书下载类

类中包括注释,这里不再多解释了

FileDownload.class.php

  1 <?PHP
  2 #文件下载(支持断点续传)
  3 class FileDownload
  4 {
  5     #下载速度
  6     private $_speed = 512;
  7 
  8     /**
  9     * @desc 下载文件
 10     *  
 11     * @param $file string 下载的文件路径
 12     * @param $name string 保存文件时的文件名,不写则最终下载文件默认为原文件名
 13     * @param $reload bool 是否使用断点续传方式下载
 14     */
 15     public function download($file, $name='', $reload=false)
 16     {
 17         if(file_exists($file))  #判断文件是否存在
 18         {
 19             if($name == '')     #判断命名参数是否存在
 20             {
 21                 $name = basename($file);    #采用原文件名进行存储
 22             }
 23             $fHandle = fopen($file, 'rb');   #只读方式打开;为移植性考虑,使用b标记打开文件(不同系统有不同换行符)
 24             $fileSize = filesize($file);    #文件大小
 25             $ranges = $this->getRange($fileSize);  #断点续传时,先查看下载的区间范围
 26             header('cache-control:public');         #可以被任何缓存所缓存
 27             header('content-type:application/octet-stream');  #告诉浏览器响应的对象的类型(字节流、浏览器默认使用下载方式处理)
 28             header('content-disposition:attachment; filename='.$name); #不打开此文件,刺激浏览器弹出下载窗口
 29             #判断是否使用续传方式进行下载
 30             #且请求头ranges不能为null(为null表示第一次请求下载)
 31             if($reload && $ranges!=null)
 32             {
 33                 header('HTTP/1.1 206 Partial Content');     #发送自定义报文 206续传状态码
 34                 header('Accept-Ranges:bytes');              #表明服务器支持Range请求,所支持的单位是字节
 35                 # 剩余长度 
 36                 header(sprintf('content-length:%u',$ranges['end']-$ranges['start'])); 
 37                 # range信息 
 38                 header(sprintf('content-range:bytes %s-%s/%s', $ranges['start'], $ranges['end'], $fileSize));  
 39                 # fHandle指针跳到断点位置 
 40                 fseek($fHandle, sprintf('%u', $ranges['start'])); 
 41             }
 42             else
 43             {
 44                 header('HTTP/1.1 200 OK'); 
 45                 header('content-length:'.$fileSize);
 46             }
 47             while(!feof($fHandle))
 48             { 
 49                 echo fread($fHandle, round($this->_speed*1024,0)); 
 50                 ob_flush();    #把数据从PHP的缓冲中释放出来
 51                 //sleep(2); // 用于测试,减慢下载速度 
 52             } 
 53             ($fHandle!=null) && fclose($fHandle);
 54         }
 55         else
 56         {
 57             #没文件
 58             header("HTTP/1.1 404 Not Found");
 59             return false;
 60         }
 61     }
 62 
 63     /**
 64     * @desc 获取请求头部range信息
 65     *
 66     * @param $fileSize int 该文件的大小
 67     *
 68     * @return array|null 返回range信息或者null
 69     */
 70     public function getRange($fileSize)
 71     {
 72         if(isset($_SERVER['HTTP_RANGE']) && !empty($_SERVER['HTTP_RANGE']))
 73         {
 74             #请求头部range信息  Range: bytes=41078-rn
 75             $range = $_SERVER['HTTP_RANGE']; 
 76             $range = preg_replace('/[s|,].*/', '', $range); 
 77             $range = explode('-', substr($range, 6));       #只需将41078-进行分割变成数组
 78             #断点续传头部range信息都是为 4444- 这种形式 ,因此切割后形成的数组就只有两个元素
 79             $range = array_combine(array('start','end'), $range); 
 80             if(empty($range['start']))
 81             { 
 82                 $range['start'] = 0; 
 83             } 
 84             if(empty($range['end']))
 85             { 
 86                 $range['end'] = $fileSize; 
 87             } 
 88             return $range; 
 89         }
 90         return null;    #第一次请求没有range信息
 91     }
 92 
 93     /**
 94     * @desc 设置文件下载速度
 95     *
 96     * @param $speed int 下载速度
 97     */
 98     public function setSpeed($speed)
 99     { 
100         if(is_numeric($speed) && $speed>16 && $speed<4096)
101         { 
102             $this->_speed = $speed; 
103         } 
104     } 
105 
106 }
107 
108 ?>

回到顶上部分

nodejs轻便达成

getStream(req, res, filepath, statObj) {
    let start = 0;
    let end = statObj.size - 1;
    let range = req.headers['range'];
    if (range) {
        res.setHeader('Accept-Range', 'bytes');
        res.statusCode = 206;
        let result = range.match(/bytes=(d*)-(d*)/);
        if (result) {
            start = isNaN(result[1]) ? start : parseInt(result[1]);
            end = isNaN(result[2]) ? end : parseInt(result[2]) - 1;
        }
    }
    return fs.createReadStream(filepath, {
        start, end
    });
}

平日来讲情状下,Web服务器会暗许开启对断点续传的支撑。由此,假若直白通过Web服务器来提供文件的下载,能够不用做特别的配置,就能够享受到断点续传的受益。由于这几个文件直接通过Web服务器来提供下载,后端脚本不能对这几个下载进程进行调节。那对于仅提供公开、静态文件的网址以来不是主题素材,但对此急需提供个人、动态文件的网址来讲,直接通过Web服务器来提供下载就不能满足急需了。当时,就需求在编写制定后台脚本程序时,参预对断点续传的支撑。

4、测验并解析内部的步骤

1、简介

  那生机勃勃篇文章主要介绍的是http左券下载时的断点续传,详细到各类步骤。重要步骤有:DNS查找、TCP二次握手、http哀告发送、TCP左券数据传输、暂停后的气象、继续下载、TCP一次握手、http央浼发送、数据传输、。。。、下载成功发送http响应新闻、TCP伍次握手断开连接。

重返顶上部分

待续

正文将以PHP为例,简介实现文件下载断点续传的方法。

  4.1、前提考虑干活

  • 将地点类公事中第六行下载速度改正为10
  • 去掉上边类文件第51行的注明,使它有延期
  • 应用火狐浏览器实行下载测验
  • 接纳Wireshark抓包工具举办抓包解析
  • test.php文件

    1 download('./aa.txt','bb.txt');
    6 #援救断点续传 7 #$b=$a->download('./aa.txt','bb.txt',1);
    8 ?>

澳门新浦京娱乐场网站,  初步测量试验:

2、原理知识

  2.1、问答问答

  问:什么是断点续传?断点续传的法规是何许?

  答:断点续传正是复信号中断后,后一次亦可从上次的地点接着传送,不帮助断点续传就代表下一次下载或上传必得从零开端。http合同中的断点续传是基于Http头Range以至Content-Range。HTTP头中貌似断点下载时才用到Range和Content-Range实体头,Range客商央求头中,钦命第叁个字节之处和最终叁个字节的岗位,如( Range:200-300大概Range:200- 卡塔尔;Content-Range用于响应头。通俗的来说就是文件大小为10,此番下载了3,被中断了,后一次波澜壮阔下载时则将指针移到3岗位,从3起来下载,最终将总体文件下载下来。

  2.2、轻巧http下载文件

  倡议下载整个文件:
  GET /test.rar HTTP/1.1
  Connection: close
  Host: 192.168.95.11
  Range: bytes=0-801 //常常央浼下载整个文件是bytes=0- 或不用这些头
  相似符合规律回应 :
  HTTP/1.1 200 OK
  Content-Length: 801
  Content-Type: application/octet-stream
  Content-Range: bytes 0-800/801 //801:文件总大小

  2.3、首要的多少个头

  响应头:

  Content-type:Content-type 告诉浏览器文件的MIME 类型,那是超级重大的一个响应头了,MIME类别恒河沙数。很或者会在前后相继中漏掉一些MIME类型,表示整个为content-type:application/octet-stream

  Content-Disposition:是 MIME 合同的扩大,MIME 合同提醒 MIME 客户代理怎么着显示附加的公文。当 Internet Explorer 选择到头时,它会激活文件下载对话框,它的文书名框自动填写了头中内定的文本名。 嗯,正是以此头哟,激活弹出提醒下载框,经常那样写content-disposition:attachment; filename=name

  Content-Length:"Content-Length: 321" 正是报告浏览器那个文件的朗朗上口是321字节,其实自身发觉临近不设置这么些头,浏览器也能和睦辨认  Pragma Cache-control:把那2个头都安装成public 告诉浏览器缓存,小编一般设置cache-control:public

  Content-Range:字段表达服务器重回了文本的某部范围及文件的总参谋长度。此时Content-Length字段就不是全体文件的分寸了,而是对应文件这一个界定的字节数,这点一定要留意。日常格式,Content-Range: bytes 500-999/1000

  响应头: 

  Range:能够诉求实体的五个依旧多少个子范围。

  例如:
  表示头500个字节:bytes=0-499
  代表第三个500字节:bytes=500-999
  表示最后500个字节:bytes=-500
  代表500字节未来的界定:bytes=500-  【下载断点续传(常常range格式为500-卡塔尔】
  第三个和终极三个字节:bytes=0-0,-1
  同恒生期货指数定多少个范围:bytes=500-600,601-999
  不过服务器能够忽略此伏乞头,如若无条件GET包括Range乞请头,响应会以状态码206(PartialContent卡塔 尔(阿拉伯语:قطر‎重回并非以200。【206象克制务器已经成功get的大器晚成部分央浼,即意味着断点续传】

归来最上部

自个儿计算

在搭建node静态服务器进程中读书应用Http1.1的Range来落到实处断点续传功效

原理

  4.2、测验援助断点续传下载

  推行步骤:

  1、张开抓包工具实行督察

  2、用火狐浏览器举行拜会,Enter下载

澳门新浦京娱乐场网站 2  

  3、确认下载

  4、中途抛锚五回,最后下载成功

澳门新浦京娱乐场网站 3

澳门新浦京娱乐场网站 4

中标下载!

澳门新浦京娱乐场网站 5

  分析抓包:

  1、首先Enter,第一步当然是展开DNS查找啦。这里就不开展讲了,能够参照这里的剧情

  2、获得域名对应的IP后,浏览器向服务器80端口发起TCP的连天诉求,请看上面包车型大巴抓包图-1,大器晚成到三行尾TCP连接,即TCP一次握手。具体能够参见小编写的那篇小说

澳门新浦京娱乐场网站 6

 抓包图-1

  3、TCP连接后,浏览器发起二个HTTP央求,即抓包图-第11中学的第4行。下图是该http GET央求。第二回倡议不设有新闻头range

澳门新浦京娱乐场网站 7

http请求图 

  4、http须求后,以前TCP数据传输,请看上边的抓包图-1,第5行后就起来有种种的进展tcp层数据传输(192.168.95.11Web主机一而再三回九转发送四次数据给192.168.95.10浏览器;浏览器选拔并答应一遍Web主机,告诉Web主机已经接受数额同一时候完全正确,能够持续传输!卡塔尔

  5、这时暂停下载,。请看下边包车型大巴抓包图-2,第72行的时候,暂停下载(即断开与Web服务器的三番五次卡塔尔。因为那是出乎意料断开的,Web主机并不知道浏览器已经断开了,所以还直接发送数据给浏览器(73~76卡塔 尔(阿拉伯语:قطر‎,不过Web服务器并未有选用浏览器的答应,最后它也不发多少,我们分手了。

  这么些须求最终是未曾抽出Web服务器的http响应音讯的。依照原本的必要是下载完全部文件后,Web才发送http响应音信的,不过浏览器顿然单方面断开,当时数量都没传送完,怎会给您对症用药消息呢!

澳门新浦京娱乐场网站 8

抓包图-2

  6、继续下载。请看下图的抓包图-3。

  点击继续下载时,即再从新发送八个http央求给服务器。

  第77~79行是TCP连接(二回握手卡塔 尔(阿拉伯语:قطر‎

  第80作为发送http诉求音信

  请看上面包车型客车http必要新闻,这一遍含有央求头Range,那是Web主要体制。在制动踏板下载的时候,浏览器会铭记已经已经选择的字节数,待后续下载的时候,在营造http央浼消息的时候会追加那三个重大的央求头音讯。那也是支撑断点续传的三个前提条件。

  浏览器引导Range头音信伏乞Web服务器,那时候大家供给在代码层对那么些第风流罗曼蒂克消息举办管理。即抽出该字节数出,然后在文件中定位指针,然后读文件最初续传。【这是断点续传应用中的逻辑关键】

澳门新浦京娱乐场网站 9

抓包图-3

  7、重复暂停二遍,在后续下载,观望相比。暂停五遍能够从抓包图-第11中学最右边能够见到五个革命的横线。

  8、最终下载成功啦,那时候Web服务器会发送http响应消息给浏览器。

  第350行尾响应行

  看下边包车型大巴http响应图,响应状态码为206

  用青黑线标志的是我们代码中自定义的响应头

澳门新浦京娱乐场网站 10

 抓包图-4

澳门新浦京娱乐场网站 11

http响应图

  9、TCP七回握手,端断开连接。看上边的抓包图-4

  第352~354是TCP断开连接。六回握手为啥是独有叁回通信呢?

  TCP断开具体也能够参见笔者事先写的篇章。

  第二次,浏览器发送FIN包(表示要断开卡塔尔、ACK(确认系列号卡塔 尔(英语:State of Qatar)。seq=361 

  第二、一遍,Web服务器选取到浏览器发来的包,并还原FIN包(笔者也要要断开卡塔 尔(阿拉伯语:قطر‎、ACK(确认连串号卡塔尔国。seq=174554、ack=362 【Web将浏览器发来的seq=361 1=362,转换成ack=362发放浏览器,表示本身生机勃勃度清楚了】【此时浏览器并同盟发送seq=174554,告诉浏览器说自家要关门连接啦】

  第七遍,浏览器回复Web服务器,ack=174555 【浏览器将Web服务器发来的seq=174554 1,转换换到ack=174555发放Web主机,表示本身早已通晓了】

   TCP一贯说是八次握手断开,作者觉着那应当是逻辑上的捌次握手,从抓包上来看的话,第二、叁次联合为二遍通信了。

3、援救断点续传的文件下载类

类中富含注释,这里不再多解释了

FileDownload.class.php

澳门新浦京娱乐场网站 12

  1 <?PHP  2 #文件下载  3 class FileDownload  4 {  5     #下载速度  6     private $_speed = 512;  7   8     /**  9     * @desc 下载文件 10     *   11     * @param $file string 下载的文件路径 12     * @param $name string 保存文件时的文件名,不写则最终下载文件默认为原文件名 13     * @param $reload bool 是否使用断点续传方式下载 14     */ 15     public function download($file, $name='', $reload=false) 16     { 17         if(file_exists($file))  #判断文件是否存在 18         { 19             if($name == '')     #判断命名参数是否存在 20             { 21                 $name = basename($file);    #采用原文件名进行存储 22             } 23             $fHandle = fopen($file, 'rb');   #只读方式打开;为移植性考虑,使用b标记打开文件(不同系统有不同换行符) 24             $fileSize = filesize($file);    #文件大小 25             $ranges = $this->getRange($fileSize);  #断点续传时,先查看下载的区间范围 26             header('cache-control:public');         #可以被任何缓存所缓存 27             header('content-type:application/octet-stream');  #告诉浏览器响应的对象的类型(字节流、浏览器默认使用下载方式处理) 28             header('content-disposition:attachment; filename='.$name); #不打开此文件,刺激浏览器弹出下载窗口 29             #判断是否使用续传方式进行下载 30             #且请求头ranges不能为null(为null表示第一次请求下载) 31             if($reload && $ranges!=null) 32             { 33                 header('HTTP/1.1 206 Partial Content');     #发送自定义报文 206续传状态码 34                 header('Accept-Ranges:bytes');              #表明服务器支持Range请求,所支持的单位是字节 35                 # 剩余长度  36                 header(sprintf('content-length:%u',$ranges['end']-$ranges['start']));  37                 # range信息  38                 header(sprintf('content-range:bytes %s-%s/%s', $ranges['start'], $ranges['end'], $fileSize));   39                 # fHandle指针跳到断点位置  40                 fseek($fHandle, sprintf('%u', $ranges['start']));  41             } 42             else 43             { 44                 header('HTTP/1.1 200 OK');  45                 header('content-length:'.$fileSize); 46             } 47             while(!feof($fHandle)) 48             {  49                 echo fread($fHandle, round($this->_speed*1024,0));  50                 ob_flush();    #把数据从PHP的缓冲中释放出来 51                 //sleep; // 用于测试,减慢下载速度  52             }  53             ($fHandle!=null) && fclose($fHandle); 54         } 55         else 56         { 57             #没文件 58             header("HTTP/1.1 404 Not Found"); 59             return false; 60         } 61     } 62  63     /** 64     * @desc 获取请求头部range信息 65     * 66     * @param $fileSize int 该文件的大小 67     * 68     * @return array|null 返回range信息或者null 69     */ 70     public function getRange($fileSize) 71     { 72         if(isset($_SERVER['HTTP_RANGE']) && !empty($_SERVER['HTTP_RANGE'])) 73         { 74             #请求头部range信息  Range: bytes=41078-rn 75             $range = $_SERVER['HTTP_RANGE'];  76             $range = preg_replace('/[s|,].*/', '', $range);  77             $range = explode('-', substr($range, 6));       #只需将41078-进行分割变成数组 78             #断点续传头部range信息都是为 4444- 这种形式 ,因此切割后形成的数组就只有两个元素 79             $range = array_combine(array('start','end'), $range);  80             if(empty($range['start'])) 81             {  82                 $range['start'] = 0;  83             }  84             if(empty($range['end'])) 85             {  86                 $range['end'] = $fileSize;  87             }  88             return $range;  89         } 90         return null;    #第一次请求没有range信息 91     } 92  93     /** 94     * @desc 设置文件下载速度 95     * 96     * @param $speed int 下载速度 97     */ 98     public function setSpeed($speed) 99     { 100         if(is_numeric($speed) && $speed>16 && $speed<4096)101         { 102             $this->_speed = $speed; 103         } 104     } 105 106 }107 108 ?>

澳门新浦京娱乐场网站 13回去最上端

仿照效法资料
  • Node.js中达成HTTP 206剧情分片

断点续传的规律照旧相比较直观的。

  4.3、测量检验不协理断点续传下载

  实施步骤:

  1、张开抓包工具进行监察

  2、用火狐浏览器实行拜访,Enter下载

  3、暂停下载

  4、继续下载。忽地非常了,下载退步!为何会那样吧!上边大家来解析深入分析

澳门新浦京娱乐场网站 14

  抓包剖判:

  1、TCP连接、http get央浼没有差距常

澳门新浦京娱乐场网站 15澳门新浦京娱乐场网站 16 

  2、从抓包解析在断开前都无别的极度

  3、继续下载抓包分析

  TCP连接平常

  http央浼音讯,看上去是正规的,可是相对于我们所写的次第就难堪了。乞请音讯中含有Range央浼头,他需求的是数据该该Range范围内的,而小编辈程序定义的黑白断点续传,即每一次访谈都以重写下载,因此Web传输的数目对不上浏览器在此以前的数目,最后出错啦!

澳门新浦京娱乐场网站 17

澳门新浦京娱乐场网站 18

4、测量试验并深入分析内部的步子

回去顶上部分

Http公约鲜明了如何传输有个别财富的风流倜傥部分,并非全部。比如,有叁个文书的轻重是1000字节,浏览器能够只央浼该文件的前300个字节,可能只央求第500到第1000个字节。通过这种格局,就能够不要在贰次呼吁中传输有个别财富的全体内容,而是发起数十次伸手,每回仅号召个中的豆蔻年华有些内容。等富有那几个央求都回去之后,再把收获的从头到尾的经过一块一块的拼凑起来拿到完全的财富。

 5、总结

  从读书OSI网络模型、TCP/IP网络模型到浓郁掌握TCP传输、http合同、DNS查找、以至http URubiconL访问具体细节步骤,最后到这些HTTP协议利用--断点续传,收获仍然挺富裕的。 以上是和睦对断点续传的知道,以至做的应和测量检验,若有窘迫之处,希望我们建议,好让自家修改修改。

 

(以上是温馨的少年老成部分观点,若有不足可能失实的地点请各位提议卡塔尔

 作者:那一叶随风   

 原来的小说地址:http://www.cnblogs.com/phpstudy2015-6/p/6821478.html 

 注脚:本博客文章为原创,只表示自个儿在办事学习中某一时间内计算的意见或结论。转载时请在文章页面分明地点给出原来的书文链接

 

  4.1、前提计划工作

  • 将地点类公事中第六行下载速度校正为10
  • 去掉上边类文件第51行的声明,使它有延迟
  • 运用火狐浏览器实行下载测验
  • 动用Wireshark抓包工具进行抓包深入分析
  • test.php文件

澳门新浦京娱乐场网站 19

1 <?php2 include 'FileDownload.class.php';3 $a=new FileDownload();4 #不支持断点续传5 #$b=$a->download('./aa.txt','bb.txt');  6 #支持断点续传7 #$b=$a->download('./aa.txt','bb.txt',1);    8 ?>

澳门新浦京娱乐场网站 20

  初步测验:

回来顶端

实现断点续传正是要利用http公约的上述本性。当顾客暂停下载的时候,浏览器会记录已经下载到什么职位,当顾客在现在某有的时候间苏醒下载时,就能够从上次半上落下的岗位连续下载,而毋庸从头起首。

  4.2、测量试验辅助断点续传下载

  推行步骤:

  1、张开抓包工具进行督察

  2、用火狐浏览器进行拜候,Enter下载

澳门新浦京娱乐场网站 21  

  3、确认下载

  4、中途抛锚五次,最后下载成功

澳门新浦京娱乐场网站 22

澳门新浦京娱乐场网站 23

马到功成下载!

澳门新浦京娱乐场网站 24

  解析抓包:

  1、首先Enter,第一步当然是开展DNS查找啦。这里就不进行讲了,能够参照这里的剧情

  2、获得域名对应的IP后,浏览器向服务器80端口发起TCP的连天诉求,请看上边包车型大巴抓包图-1,风度翩翩到三行尾TCP连接,即TCP叁遍握手。具体能够参见笔者写的那篇小说

澳门新浦京娱乐场网站 25

抓包图-1

  3、TCP连接后,浏览器发起一个HTTP乞请,即抓包图-第11中学的第4行。下图是该http GET须求。第二回呼吁不设有新闻头range

澳门新浦京娱乐场网站 26

http请求图 

  4、http乞请后,开首TCP数据传输,请看上边包车型地铁抓包图-1,第5行后就从头有各种的实行tcp层数据传输(192.168.95.11Web主机一而再发送一回数据给192.168.95.10浏览器;浏览器接收并答应一次Web主机,告诉Web主机已经接收多少相同的时候完全精确,能够世襲传输!卡塔 尔(英语:State of Qatar)

  5、那时候中断下载,。请看上边包车型地铁抓包图-2,第72行的时候,暂停下载(即断开与Web服务器的连天)。因为那是忽然断开的,Web主机并不知道浏览器已经断开了,所以还间接发送数据给浏览器,可是Web服务器并没有接到浏览器的应对,最后它也不发多少,我们分手了。

  那几个乞求最终是一直不接到Web服务器的http响应音信的。根据原先的号召是下载完全体文件后,Web才发送http响应音讯的,可是浏览器猛然单方面断开,这时数码都没传送完,怎会给你对景挂画新闻吧!

澳门新浦京娱乐场网站 27

抓包图-2

  6、继续下载。请看下图的抓包图-3。

  点击继续下载时,即再从新发送叁个http诉求给服务器。

  第77~79行是TCP连接

  第80行为发送http恳求音讯

  请看下边包车型大巴http诉求音信,此番含有央求头Range,那是Web主要体制。在暂停下载的时候,浏览器会铭记已经已经接纳的字节数,待继续下载的时候,在创设http哀求音信的时候会扩张那多少个首要的央求头音讯。那也是帮忙断点续传的叁个前提条件。

  浏览器指点Range头音讯必要Web服务器,当时大家须要在代码层对这些第生机勃勃音信举行拍卖。即收取该字节数出,然后在文件中固定指针,然后读文件初始续传。【那是断点续传应用中的逻辑关键】

澳门新浦京娱乐场网站 28

抓包图-3

  7、重复暂停一遍,在世袭下载,观占星比。暂停四次能够从抓包图-第11中学最侧面能够看来多个水绿的横线。

  8、最后下载成功啦,那个时候Web服务器会发送http响应消息给浏览器。

  第350行尾响应行

  看上边包车型地铁http响应图,响应状态码为206

  用中蓝线标志的是大家代码中自定义的响应头

澳门新浦京娱乐场网站 29

抓包图-4

澳门新浦京娱乐场网站 30

http响应图

  9、TCP肆遍握手,端断开连接。看上边的抓包图-4

  第352~354是TCP断开连接。八次握手为何是唯有三次通讯呢?

  TCP断开具体也能够参见小编事先写的篇章。

  第二次,浏览器发送FIN包、ACK。seq=361

  第二、壹回,Web服务器选用到浏览器发来的包,并上升FIN包、ACK。seq=174554、ack=362【Web将浏览器发来的seq=361 1=362,调换成ack=362发给浏览器,表示本身早就精通了】【那时浏览器并一同发送seq=174554,告诉浏览器说作者要关闭连接啦】

  第九遍,浏览器回复Web服务器,ack=174555【浏览器将Web服务器发来的seq=174554 1,调换换到ack=174555发放Web主机,表示自个儿早就知道了】

  TCP平昔讲是七回握手断开,小编以为这应该是逻辑上的伍回握手,从抓包上来看的话,第二、一次联合为一回通信了。

回来顶端

实现

  4.3、测量试验不辅助断点续传下载

  实施步骤:

  1、张开抓包工具进行监督

  2、用火狐浏览器举办探望,Enter下载

  3、暂停下载

  4、继续下载。顿然非常了,下载战败!为啥会如此呢!上边我们来剖判深入分析

澳门新浦京娱乐场网站 31

  抓包深入分析:

  1、TCP连接、http get恳求无不胜

澳门新浦京娱乐场网站 32澳门新浦京娱乐场网站 33

  2、从抓包剖判在断开前都无任何特别

  3、继续下载抓包深入分析

  TCP连接平常

  http央浼音信,看上去是符合规律的,但是相对于大家所写的顺序就难堪了。央求新闻中富含Range央求头,他索要的是多少该该Range范围内的,而我辈程序定义的是非断点续传,即每趟访谈都以重写下载,因而Web传输的数据对不上浏览器此前的数量,最终出错啦!

澳门新浦京娱乐场网站 34

澳门新浦京娱乐场网站 35

回到顶上部分

是因为局地传输不是强制的,服务器能够帮助也得以不扶持,所以,大家须求在前后相继中报告浏览器,它乞求的财富是还是不是援助部分传输。那足以由此设置HTTP的 Accept-Ranges 响应头信息来贯彻。PHP代码如下:

5、总结

  从上学OSI互联网模型、TCP/IP互连网模型到浓烈掌握TCP传输、http合同、DNS查找、以致http U奇骏L访谈具体细节步骤,最终到这么些HTTP协议利用--断点续传,收获依旧挺丰厚的。 以上是万众一心对断点续传的知情,甚至做的相应测验,若有不法规的地点,希望大家提议,好让自家改正改良。

(以上是本人的有的理念,若有欠缺只怕不当之处请各位提出卡塔尔国

初藳地址:

扬言:本博客小说为原创,只表示自己在干活学习中某一时间内总计的见识或结论。转发时请在篇章页面显明地方给出最早的文章链接

代码如下:

header('Accept-Ranges: bytes');

Accept-Ranges: bytes 告诉浏览器,该能源支持以字节为单位的有的传输。那些响应头须要增大在支撑部分传输的有所能源上。

当选择到叁个呼吁时,我们须要从浏览器的伸手中领到浏览器材体是在伸手财富的哪叁个有个别。那个新闻是因此Range 伏乞头来传递的。在PHP中,它被存放在$_SERVER['HTTP_RANGE']中。大家供给检讨那一个变量是还是不是定义了,假设定义了,则动用该值,不然,就将range设为全数财富。

代码如下:

$range = "0-". ($content_length-1);

if(isset($_SERVER['HTTP_RANGE'])){

$range = $_SERVER['HTTP_RANGE'];

}

接下去,就必要深入分析 $range 的值,来决定再次来到能源的哪部分剧情。大概的取值示例:

代码如下:

100-200 // 第100到第200字节

500- // 第500字节到文件末尾

-1000 // 最后的1000个字节

那边供给注意,得到一个Range之后,你供给对它的取值举行稽查,包罗:

1.发端地点非负

2.终了地方须要大于初始地点

3.从头地方供给小于文件长度减生机勃勃 (因为那边的岗位索引是从0开端的)

4.若结束地方大于文件长度减生机勃勃,则要求把它的值设置为文件长度减大器晚成

假使Range的取值违法,则供给结束程序并告诉浏览器:

代码如下:

header('HTTP/1.1 416 Requested Range Not Satisfiable');

为了保持小说删芜就简,具体的校验代码这里就不提供了。上面假定你早已校验了Range的取值,并获取了 $start 和 $end 多少个变量,分别代表起第三人置和竣工地方。

接下去要做的就是把文件的照顾部分的内容发送给浏览器。可是要注意的是,这里涉及到必要发送八个HTTP响应头新闻,具体如下:

代码如下:

header('HTTP/1.1 206 Partial Content');

header('Accept-Ranges: bytes');

header("Content-Range: bytes $start-$end/$filesize");

$length = $end - $start 1;

header("Content-Length: $length");

/* 输出文件的钦命部分 */

这里的$length须要注意一下,它的取值是本次传输的内容的长度,并非百分百文件的尺寸。别的部须求要小心的一些是,这里的HTTP状态码是206,不是200。

总结

文本下载的断点续传实际上是利用了HTTP合同中对传输部分文件的支撑。而HTTP左券的那意气风发特征不但可以用于贯彻断点续传,顾客端程序也得以选取它来落实二十四线程下载。

在达成断点续传的经过中,须求注意科学安装各样HTTP头音信。错误的头音信将以致客商下载到的文本损坏,不可能运用。

原作链接:

本文由澳门新浦京娱乐场网站发布于www.146.net,转载请注明出处:澳门新浦京娱乐场网站node静态服务器断点续传完