HTTP协议学习笔记(二)

1.HTTP报文

HTTP报文:用于HTTP协议交互的信息。
请求报文:请求端(客户端)的HTTP报文叫做请求报文。
响应报文:响应端(服务端)的HTTP报文叫做响应报文。

HTTP报文大致可分为报文首部和报文主体两块。
两者最初由空行(CR+LF)来划分。通常,并不一定要有报文主体。

2.请求报文及响应报文的结构

请求报文和响应报文首部内容由以下数据组成。

请求行:包含用于请求的方法,请求URI和HTTP版本。

状态行:包含表明响应结果的状态码,原因短语和HTTP版本

首部字段:包含表示请求和响应的各种条件和属性的各类首部

一般有四种首部,分别是:通用首部,请求首部,响应首部和实体首部
其他:可能包含HTTP的RFC里未定义的首部(Cookie等)

请求报文结构

 响应报文结构

3.编码提升传输速率

HTTP在传输数据时可以按照数据原貌直接传输,也可以使用编码传输,能有效地处理大量的访问请求。

1.报文主体和实体主体的差异

报文(message)
是HTTP通信中最基本的基本单位,由8位组字节流组成,通过HTTP通信传输。

实体(entity)
作为请求或响应的有效载荷数据(补充项)被传输,其内容由实体首部和实体主体组成。

HTTP报文的主体用于传输请求和响应的实体主体。

HTTP报文的主体相当于实体主体的载体。

通常,报文主体等于实体主体。只有当传输中进行编码操作,实体的内容发生变化,才导致它和报文产生差异。

2.压缩传输的内容编码
HTTP协议中有一种被称为内容编码的功能。
内容编码:指明应用在实体内容上的编码格式,并保持实体信息原样压缩。
内容编码后的实体由客户端接收并负责解码

常见的内容编码有以下几种:
gzip(GNU zip)
compress(UNIX系统的标准压缩)
deflate(zlib)
identity(不进行编码)

3.分割发送的分块传输编码

在HTTP通信过程中,请求的编码实体资源尚未全部传输完成之前,浏览器无法显示请求页面。在传输大容量数据时,通过把数据分割成多块,能够让浏览器逐步显示页面。

这种把实体主体分块的功能称为分块传输编码

分块传输编码会将实体主体分成多个部分(块)。每一块都回用十六进制来标记块的大小,而实体主体的最后一块会使用“0(CR+LF)”来标记。

使用传输分块传输编码的实体主体会由接收的客户端负责解码,恢复到编码前的实体主体。

HTTP/1.1中存在一种称为传输编码的机制,它可以在通信时按某种编码方式传输,但只定义作用于分块传输编码中。

4.发送多种数据的多部分对象

HTTP协议采纳了多部分对象集合,发送的一份报文主体内可含有多类型实体。通常是在图片或文本文件等上传时使用。

5.获取部分内容的范围请求

如果下载过程中遇到网络中断,那就必须重头开始,为了解决这个问题,需要一种可恢复的机制。
要实现该功能需要指定下载的实体范围。像这样,指定范围发送的请求叫做范围请求。

对一份10000字节大小的资源,如果使用请求,可以只请求5001-10000字节内的资源。

执行范围请求时,会用到首部字段Range来指定资源的byte范围

byte范围的指定形式如下:

5001-10000字节
Range:bytes=5001-10000

从5001字节之后全部的
Range:bytes=5001-

从一开始到3000字节和5000-7000字节的多重范围
Range:bytes=-3000,5000-7000

针对范围请求,响应会返回状态码为206 Partial Content的响应报文。
另外,对于多重范围请求,响应会在首部字段Content-Type标明multipart/byteranges后返回响应报文
如果服务端无法响应范围请求,则会返回状态码200 OK和完整的实体内容

6.内容协商返回最合适的内容

同一个Web网站有可能存在着多分相同内容的页面。比如英语版和中文版的Web页面,它们内容上虽相同,但使用的语言却不同。

当浏览器的默认语言为英语或中文,访问相同的URI的Web页面时,则会显示对应的英文版或中文版的Web页面。这样的机制称为内容协商。

内容协商机制是指客户端和服务端就响应的资源内容进行交涉,然后提供给最合适的资源。内容协商会以响应资源的语言、字符集、编码方式等作为判断的基准。

包含在请求报文中的某首部字段(如下)就是判断的基准:
Accept
Accept-Charset
Accept-Encoding
Accept-Language
Content-Language

内容协商技术有以下三种类型:
服务器驱动协商:
由服务器进行内容协商。以请求的首部字段为参考,在服务器端自动处理。但对用户来说,以浏览器发送的信息作为判定的依据,并不一定能筛选出最优内容。

客户端驱动协商:
由客户端进行内容协商的方式。用户从浏览器显示的可选项列表中手动选择。还可以利用JavaScript脚本在Web页面上自动进行上述选择。比如按OS的类型或浏览器类型,自动切换成PC版页面或手机版页面。

透明协商:
是服务器驱动和客户端驱动结合体,是由服务器端和客户端各自进行内容协商的一种方法。

HTTP协议学习笔记(二)的更多相关文章

  1. 网络协议学习笔记(二)物理层到MAC层,交换机和VLAN,ICMP与ping原理

    概述 之前网络学习笔记主要讲解了IP的诞生,或者说整个操作系统的诞生,一旦有了IP,就可以在网络的环境里和其他的机器展开沟通了.现在开始给大家讲解关于网络底层的相关知识. 从物理层到MAC层:如何在宿 ...

  2. AJax 学习笔记二(onreadystatechange的作用)

    AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...

  3. 纯JS实现KeyboardNav(学习笔记)二

    纯JS实现KeyboardNav(学习笔记)二 这篇博客只是自己的学习笔记,供日后复习所用,没有经过精心排版,也没有按逻辑编写 这篇主要是添加css,优化js编写逻辑和代码排版 GitHub项目源码 ...

  4. WPF的Binding学习笔记(二)

    原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...

  5. [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计

    源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...

  6. JMX学习笔记(二)-Notification

    Notification通知,也可理解为消息,有通知,必然有发送通知的广播,JMX这里采用了一种订阅的方式,类似于观察者模式,注册一个观察者到广播里,当有通知时,广播通过调用观察者,逐一通知. 这里写 ...

  7. java之jvm学习笔记二(类装载器的体系结构)

    java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...

  8. Java IO学习笔记二

    Java IO学习笔记二 流的概念 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 程序中的输入输 ...

  9. 《SQL必知必会》学习笔记二)

    <SQL必知必会>学习笔记(二) 咱们接着上一篇的内容继续.这一篇主要回顾子查询,联合查询,复制表这三类内容. 上一部分基本上都是简单的Select查询,即从单个数据库表中检索数据的单条语 ...

随机推荐

  1. js 判断身份证好是否合法

    function cidInfo(sId){ var info="" //if(!/^\d{17}(\d|x)$/i.test(sId))return false; sId=sId ...

  2. python(十四)新式类和旧式类

    这里有个重要概念呢在下面那个链接 http://blog.csdn.net/zimou5581/article/details/53053775 http://www.cnblogs.com/btch ...

  3. iOS性能优化技巧

    通过静态 Analyze 工具,以及运行时 Profile 工具分析性能瓶颈,并进行性能优化.结合本人在开发中遇到的问题,可以从以下几个方面进行性能优化. 一.view优化 1.不透明的View 设置 ...

  4. Python Tools for Machine Learning

    Python Tools for Machine Learning Python is one of the best programming languages out there, with an ...

  5. pl sql 存储过程 执行sql 锁死状态

    背景 这是在一个不知如何表达的项目中,我在这个项目中做的就是不知如何表达的事情.只是想着技术,到是通过这个项目把存储过程基本能用的都用了,oracle开发的技术我感觉基本都全活了.别人没搞定的我搞定了 ...

  6. CentOS6.3重新加载网卡报错 Active connection path: /org/freedesktop/NetworkManager/ActiveConnection

    现象系统无法上网,ping本地127.0.0.1不通,局域网IP也不通,网关也无法ping通 通过 ifconfig 查看网卡和lo回环口 都已启用 重启network服务报错如下: # servic ...

  7. jquery学习集合

    跳转网页:$(location).attr('href', '/index');

  8. VeeValidate配置中文的两种方法

    使用VeeValidate时遇到的问题,下面是我找到的一些解决办法: VeeValidate一直报错早不到addlocale方法 解决办法:1.卸载掉当前版本,重新安装低版本如2.0.0-rc.25  ...

  9. TestNG测试方法

    @Test(enabled = false)有助于禁用此测试用例. 分组测试是TestNG中的一个新的创新功能,使用<groups>标记在testng.xml文件中指定分组. 它可以在&l ...

  10. 使用mybatis-spring-boot-starter如何打印sql语句

    只需要将接口文件的日志设置为debug即可. 例如你的mapper接口所在的文件夹是 com.demo.mapper 那么在application.properties配置文件中添加 logging. ...