http 之 非常规部分响应

 

当在chrome上测试video标签的流媒体播放mp4时,发现确实不会完全下载完再播放,关键是使用range http头时从来只指定开始位置,不指定结束位置,为什么呢?

chrome video标签加载mp4的大概逻辑是:

  1. 先查看一下资源大小,一般来讲,head方法可以查看资源大小,但是chrome没有使用head方法(怀疑是考虑到很多服务器管理员并不专业,仅仅允许GET、POST方法),而是使用了GET + range ( range: 0- )头的方法; 但是,这样web服务器会比较规矩地返回整个文档内容,并且告知文档的总大小,显然,浏览器并不想要全部的内容(而仅仅想看看资源最后的64KB),怎么办呢?于是,读取到自己想要的信息(http头中包含的资源总大小)就把连接close掉,如此一来,client再收到后续的数据包的时候,就自然会reset了
  2. 知道了资源总大小后,再次发送一个GET请求,这次只请求资源的最后64KB(瞎猜,最后64KB估计是包含一些元信息吧),这次就可以正常结束请求,而不需要使用鲁棒的reset
  3. 后续的按需加载,不过,也并没有使用严格的range来指定想要的大小:

    也是client想读多少就读多少,最后reset掉,或许和mp4格式有关系,毕竟mp4不是流媒体格式,client应该真的不知道要确切读多少才行

 

 

 

 

留下评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据