图解HTTP读书笔记2

来源:互联网 发布:仙侣情缘手游java 编辑:程序博客网 时间:2024/05/21 15:07

图解HTTP读书笔记(三)

第三章 HTTP报文内的HTTP信息
HTTP报文

HTTP报文:用于HTTP协议交互的信息。

HTTP报文本身是由多行数据构成的字符串文本。

请求报文与响应报文结构

请求报文和响应报文的结构
wpsDCAC.tmp

wpsDCAD.tmp

请求报文和响应报文的首部内容由一下数据组成。
- 请求行:包含用于请求的方法,请求URI和HTTP版本。
- 状态行:包含表明响应的结果的状态码。原因短语和HTTP版本。
- 首部字段:包含表示请求和响应的各种条件和属性的各类首部。
一般有4种首部,分别是:通用首部,请求首部,响应首部,实体首部。
- 其他:可能包含HTTP的RFC里未定义的首部(如:Cookie等)。

报文主体与实体主体

· 报文主体:是HTTP通信中的基本单位,由8位组字节流组成,通过HTTP通信传输。

· 实体主体:作为请求或响应的有效载荷数据被传输,其内容由实体首部和实体主体组成。

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

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

编码&分块传输

HTTP在传输数据时可以按照数据原貌直接传输,但也可以在传输过程中通过编码来提升传输速率。但是,编码的操作需要计算机来完成,因此会消耗更多的CPU资源。

· 压缩传输的内容编码

HTTP协议中内容编码指明应用在实体内容上的编码格式,并保持实体信息原样压缩。内容编码后的实体由客户端接收并负责解码。

wpsDCBE.tmp

常用的内容编码:
1. gzip(GNU zip)
2. compress(UNOX系统的标准压缩)
3. deflate(zlib)
4. identity(不进行编码)

· 分割发送的分块传输编码

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

wpsDCBF.tmp

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

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

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

发送多种数据的多部分对象集合(Multipart)

发送邮件时,我们可以在邮件里写入文字并添加多分附件,这是因为采用MIME机制。

MIME(Multipurpose Internet Mail Extension):多用途因特网邮件扩展机制。它允许邮件处理文本、图片、视频等多个不同类型的数据。在MIME扩展中会使用一种称为多部分对象集合(Multipart)的方法,来容纳多份不同类型的数据。

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

多部分对象集合的对象如下: (在请求报文首部content-type中即form)
1  - multipart/form-data:在web表单上传时使用

2   boundary:表示分隔符

wpsDCC0.tmp

· (响应报文)multipart/byteranges:状态码206(Partial Content,部分内容)响应报文包含了多个范围的内容时使用。

wpsDCC1.tmp

在HTTP报文中使用多部分对象集合时,需要在首部字段里加上Content-type。有关这个首部字段,后面章节讲解。

使用boundary字符串来划分多部分对象集合指明的各类实体。如:以“–ABC”开始,以“–ABC–”结束。

多部分对象集合的每个部分的类型中,都可以含有首部字段。(可以看到每个分隔符后都有首部的标志)

另外,可以在某个部分中嵌套使用多部分对象集合。

获取部分内容的范围请求

以前,用户宽带不好,下载稍大的文件非常吃力,如果下载过程中遇到网络中断,需要重新开始,为了解决这一个问题,需要一种可恢复的机制。也就是可以重之前下载中断处恢复下载(断点下载)。

要实现该功能需要指定下载的实体范围。像这样,指定范围发送的请求叫做范围请求(Range Request)。

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

wpsDCD2.tmp

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

byte范围的指定形式:
- 5001-10000字节

· Range:bytes=5001-10000

· 5001字节之后的全部字节

· Range:bytes=5001-

· 从一开始到3000,5000-7000字节的多重范围

· Range:bytes= -3000,5000-7000

针对范围请求,响应会返回状态码206。另外响应会在Content-Type标明multipart/byteranges后返回响应报文。

内容协商机制(返回最适合的内容)

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

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

包含在请求报文中的某些首部字段(如下)就是判断的基准。详情在后面说明。
- Accept
- Accept-Charset
- Accept-Encoding
- Accept-Language
- Content-Language

内容协商技术有3中类型:服务器驱动协商,客户端驱动协商,透明协商。

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

· 客户端驱动协商:有客户端进行内容的协商,用户从浏览器显示的可选项列表中手动选择。还可以利用javascript脚本在web页面上自动进行上述选择。如:自定切换成PC版或手机版。

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

总结:

报文首部包含实体通用请求响应首部,这几个首部不在实体报文内容中;

传输时对http报文可以进行编码分块,并且可以用MIME和断点重传传送多种类型和多断点的数据,可以看到MIME内容中各种不同类型的内容是分段存储的,且内容也含有自己的首部!

请求协商就资源内容根据首部字段来进行判断,如accept等等字段来选择内容决定者;

图解HTTP读书笔记(四)

第四章 HTTP状态码
状态码的类别

状态码中的数字第一位指定了响应的类别,响应的而类别有5种

状态码

类别

原因短语

1XX

Informational(信息性状态码)

接受的请求正在处理

2XX

Success(成功状态码)

请求正常处理完毕

3XX

Redirection(重定向状态码)

需要进行附加操作以完成请求

4XX

Client Error(客户端错误状态码)

服务器无法处理请求

5XX

Server Error(服务器错误状态码)

服务器处理请求出错

只要遵循状态码类别的定义,即使改变RFC2616中定义的状态码或服务端自行创建状态码都没有问题

常用的状态码

2XX成功

2XX的响应结果表明请求被正常处理了。

· 200 OK

表示从客户端发来的请求在服务端被正常处理了。

在响应报文内,随状态码一起返回的信息会因方法的不同而发生改变。比如GET方法和HEAD方法的响应返回。
- 204 No Content

该状态码代表服务接收的请求已成功处理。但在返回的响应报文中不含实体的主体部分。另外,也不允许返回任何实体的主体。如:当浏览器发出请求处理后,返回204响应,那么浏览器显示的页面不发生更新

· 206 Partial Content

该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的GET请求。响应报文中包含有Content-Range指定范围的实体内容。

3XX重定向

3XX响应结果表明浏览器需要执行某些特殊的处理以正确处理请求。

· 301 Moved Permanently

永久性重定向。该状态码表示请求的资源被分配了新的URI,以后应使用资源现在所指的URI。

· 302 Found

临时性重定向。该状态码表示请求的资源已被分配了新的URI地址,希望用户(本次)能使用新的URI访问。

· 303 See Other

该状态码表示由于请求对应的资源存在着另一个URI,应使用GET方法定向获取请求的资源。

303状态码和302状态码有着相同的功能,但303状态码明确表示客户端应当采用GET方法获取资源,这点与302状态码不同。

当301、302、303响应状态码返回时,几乎所有的浏览器都会把POST改成GET,并删除请求报文内的主体,之后请求会自动再次发送。
- 304 Not Modified

该状态码表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但未满足条件的情况。

304状态码返回时,不包含任何响应的主体部分。304虽然被划分在3XX类别中,但是和重定向没有关系。

· 307 Temporary Redirect
临时重定向。该状态码与302状态码有着相同的含义。尽管302标准禁止POST变换成GET,但实际使用时大家都不遵守。

307会遵守浏览器标准,不会从POST变成GET。但是,对于处理响应时的行为,每种浏览器有可能出现不同的情况。

4XX客户端错误

4XX的响应结果表明客户端是发生错误的原因所在。
- 400 Bad Request
该状态码表示请求报文中存在语法错误。当错误发生时,需要改请求的内容再次发送请求。
- 401 Unauthorized

该状态码表示需要发送的请求需要有通过HTTP认证(BASIC认证、DIGEST认证)的认证信息。另外若之前已进行过1次请求,则表示用户认证失败。

返回含有401的响应必须包含一个适用于被请求资源的WWW-Authenticate首部用以质询用户信息。当浏览器初次接收到401响应,会弹出认证的对话窗口。

· 403 Forbidden
该状态码表明对请求资源的访问被服务器拒绝了。服务器没有必要给出拒绝理由,但如果想做说明的话,可以在实体的主体部分对原因进行描述,这样就能让用户看到了。

未获取文件系统的访问授权,访问权限出现某些问题(从未授权的发送源IP地址试图访问)等列举的情况都可能是发生403的原因。

· 404 Not Found

该状态表明服务器上无法找到请求的资源,除此之外,也可以在服务端拒绝请求且不想说明拒绝理由时使用。

5XX服务器错误

5XX的响应结果表明服务器本身发生错误。
- 500 Internal Server Error

该状态码表明服务器在执行请求时发生了错误。也可能是web应用存在的bug或某些临时故障。

· 503 Service Unavailable

该状态码表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。如果事先得知解除以上状况需要时间,最好写入RetryAfter首部字段再返回给客户端。

总结:

随状态码一起返回的信息会因方法的不同而发生改变。比如GET方法和HEAD方法的响应返回。
- 204 No Content

图解HTTP读书笔记(五)

第五章 与HTTP协作的web服务器

一台web服务器可搭建多个独立域名的web网站,也可作为通信路径上的中转服务器提升传输效率。

一个ip可以对应多个域名,一个域名对应一个ip,所以一台web服务器可以搭建多个域名的web网站。

单台虚拟主机实现多个域名

HTTP/1.1规范允许一台HTTP服务器搭建多个web站点。这是因为利用了虚拟主机(Virtual Host,又称虚拟服务器)的功能。

即使物理层面只有一台服务器,但只要使用虚拟主机的功能,则可以假象已具有多台服务器(多个域名)。

如果一台服务器内托管了www.tricorder.jp和www.hackr.jp这2个域名,当收到请求时就需要弄清楚究竟访问那个域名。(他们的ip是一致的)

例如下图:

wpsDCD3.tmp

在相同的ip地址下,由于虚拟主机可以寄存多个不同主机和域名的web网站,因此在发送HTTP请求时,必须在Host首部内完整指定主机名或域名的URI

通信数据转发程序:代理、网关、隧道

HTTP通信时。除了客户端和服务器以外,还有一些用于通信数据转发的应用程序,例如代理、网关和隧道。他们可以配合服务器工作。

· 代理:代理是一种有转发功能的应用程序,它接收由客户端发送的请求,并转发给服务器,同时也接受服务器返回的响应转发给客户端。

代理不改变请求的URI,会直接发送给有资源目标的服务器(持有资源实体的服务器成为源服务器)。

wpsDCD4.tmp

在HTTP通信过程中,可以级联多台服务器,请求和响应的转发会经过数台连起来的代理服务器。代理服务器在转发是需要附加Via首部字段,以标记经过的主机信息。

代理服务器有多种使用方法,按两种基准分为:一种是是否使用缓存,另一种是是否修改报文。

1.

缓存代理:代理转发响应时,缓存代理会预先将资源保存在代理服务器上。

2.

透明代理:转发请求或响应时,不对报文做任何的加工。这种代理类型成为透明代理。反之,对报文内容进行加工的代理成为非透明代理。

3.

o 网关:是转发其他服务器通信数据的服务器,接收从客户端发送过来的请求时,他就像自己拥有资源的源服务器一样,对请求进行处理。

wpsDCD5.tmp

网关的工作机制和代理十分相似。但是网关能使通信线路上的服务器提供非HTTP协议服务。

利用网关提高通信的安全性,因为客户端与网关之间的通信线路上加密以确保连接的安全性。(网关和非HTTP服务器之间比如FTP来获取资源再用类HTTP发送给客户端,用的是其他协议)

· 隧道:是在相隔甚远的客户端和服务器两者之间进行中转,并保持双方通信连接的应用程序。

wpsDCE5.tmp

隧道可按要求建立起一条与其他服务器的通信线路,届时使用SSL等加密手段进行通信。隧道的目的是确保客户端和服务器进行安全的通信。

隧道本身不会去解析HTTP请求。请求会保持原样中转给服务器。隧道会在通信双方断开连接时结束。

保存资源的缓存

缓存是指代理服务器或客户端本地磁盘内保存的资源副本。利用缓存可以减少对源服务器的访问,节省通信流量和时间。

wpsDCE6.tmp

· 缓存的有效期限
即便缓存服务器内有缓存,当遇上源服务器上的资源更新时,如果还是使用不变的缓存,那就会演变成返回更新的旧资源。

所以即使存在缓存,也会因为客户端的要求、缓存的有效期等因素,向源服务器确认资源的有效性。若判断缓存失败,则从源服务器获取新的资源。

wpsDCE7.tmp

· 客户端的缓存

缓存还可以缓存在客户端,客户端的缓存文件成为临时网络文件(Temporary Interent File)。

客户端缓存如果有效,就不必在向服务器请求相同的资源,可以直接从本地读取。另外,当判断缓存过期,会向服务器确认资源的有效性。若缓存失效,浏览器会再次请求新资源。

总结:

单台虚拟主机实现多域名(在相同的ip地址下,由于虚拟主机可以寄存多个不同主机和域名的web网站,因此在发送HTTP请求时,必须在Host首部内完整指定主机名或域名的URI。)

通信数据转发:代理:修改报文或拥有资源缓存(可以不去目的服务器直接携带资源返回);网关:能使通信线路上的服务器提供非HTTP协议服务。利用网关提高通信的安全性,因为客户端与网关之间的通信线路上加密以确保连接的安全性(网关和非HTTP服务器之间比如FTP来获取资源再用类HTTP发送给客户端,用的是其他协议);隧道可按要求建立起一条与其他服务器的通信线路,届时使用SSL等加密手段进行通信。隧道的目的是确保客户端和服务器进行安全的通信,隧道本身不会去解析HTTP请求。请求会保持原样中转给服务器。隧道会在通信双方断开连接时结束。

总结:

第一章讲整个http在tcpip体系中是如何通过各层传输过去,以及url和uri的定位

第二章讲报文的请求方法和连接,不同方法返回不同内容(请求行)

第三章讲报文实体的内容

第四章讲返回内容的解析

第五章讲http的中间web服务器

0 0
原创粉丝点击