图解HTTP
第四章 返回结果的HTTP状态码
HTTP状态码负责表示客户端HTTP请求的返回结果、标记服务器端的处理是否正常、通知出现错误等工作。
4.1状态码告知从服务器端返回的请求结果
状态码的职责是当客户端向服务器端发送请求时,描述返回的请求结果。借助状态码,用户可以知道服务器端是正常处理了请求,还是出现了错误。
状态码如 200 OK, 以3位数字和原因短语组成。
数字中第一位指定了响应类型,后两位无分类。
状态码类别:
1XX Informational(信息性状态码) 接收的请求正在处理
2XX Success(成功状态码) 请求正常处理完毕
3XX Redirection(重定向状态码) 需要惊醒附加操作以完成请求
4XX Client Error(客户端错误状态码)服务器无法处理请求
5XX Server Error(服务器状态码) 服务器处理强求出错
只要准守状态码类别的定义,即使改变RFC2616中状态码,或者服务器自行创建状态码都没问题
4.2 2XX成功
2XX的响应结果表明请求被正常处理了
4.2.1 200 OK
表示从客户端发来的请求在服务器端被正常处理了
在响应报文内,随状态码一起返回的信息会因方法的不同而发生改变。
比如:使用GET方法时,对应请求资源的实体会作为响应返回;而使用HEAD方法时,对应请求资源的实体首部不随报文主体作为响应返回
4.2.2 204 Not Content
该状态代表服务器接收的请求已经成功处理,但是在返回的响应报文中不包含实体的主体部分。另外,也不允许返回任何实体的主体。
比如:当从浏览器发出请求处理后,返回204响应,那么浏览器显示的页面不发生更新
4.2.3 206 Partial Content
该状态码表示客户端进行了范围请求,而服务器执行了这部分的GET请求。
4.3 3XX 重定向
3XX相应结果表明浏览器需要执行某些特殊的处理以正确处理请求
4.3.1 301 Moved Permanently
永久性重定向,该状态码表示请求的资源已经被重新分配了新的URI,以后应使用资源现有的URI。也就是说,如果已经把资源对应的URI保存为书签了,这是应该按Localtion首部字段提示的URI重新保存。
4.3.2 302 Found
临时性重定向,该状态码表示请求资源已经被分配了新的URI,希望用户能使新的URI访问,同301相比,302状态码代表的资源不是被永久移动的。
4.3.3 303 See Other
该状态码表示由于请求对应的资源存在着另一个URI,应使用GET方法定向获取请求的资源。
303状态码和302Found 装态码有着相同的功能,但是303状态码明确表示客户端应该使用GET方法获取资源。
!!当301、302、302响应状态码返回时,几乎所有的浏览器都会把POST改成GET,并且删除请求报文内的主体,之后请求会自动再次发送。
!!301、302标准是禁止将POST方法改成GET方法的,但实际使用时大家都会这么做
4.3.4 304 Not Modified
该状态码表示客户端发送附带条件请求时,服务器端允许请求访问资源,但未被满足条件的情况。304状态码返回时,不包含任何形影的主体部分。虽然被划分到3XX,但是和重定向没有关系
4.3.5 307 Temporary Redirect
临时重定向,该状态码和302有着相同的含义,尽管302标准禁止POST变换成GET,但是实际大家使用时并不遵守。
307会遵守浏览器标准,不会从POST变成GET。但是对于处理响应时的行为,每种浏览器有可能不同的情况。
4.4 4XX 客户端错误 响应结果表明客户端时发生错误的原因所在
4.4.1 400 Bad Request
该状态码表示请求报文中存在语法错误。当错误发生时,需要修改请求的内容后再次发送请求。另外,浏览器会像对待200 Ok 一样对待该状态码
4.4.2 401 Unauthorized
该状态码表示发送的请求需要通过HTTP认证的认证信息。另外若之前已进行1次请求,则表示用户认证失败。
返回含有401的响应必须包含一个适用于请求资源的WWW-Authenticate首部用以质询用户信息。当浏览器初次节后到401时,就会弹出认证用的对话框
4.4.3 403 Forbidden
该状态码表明对请求资源的访问被服务器拒绝了。服务器没有必要给出拒绝的详细理由,但如果想作说明的话,可以在实体的主体部分对原因进行描述,就能让用户看了。
未获得文件系统的访问授权,访问权限出现某些问题等情况,都可能是403出现的情况
4.4.4 404 Not Found
该状态码表明服务器上无法找到请求的资源,除此之外,也可以在服务器端拒绝请求且不想说明理由时使用。
4.5 5XX 服务器错误 响应结果表明服务器本身发生错误
4.5.1 500 Internal Server Error
该状态码表明服务器在执行请求时发生了错误。也有可能是Web应用存在bug或者某些临时的故障。
4.5.2 503 Service Unavailable
该状态码表明服务器暂时处于超负载或者正在进行停机维护,现在无法处理请求。如果事先得知解除以上状态所需要的时间,最后写入Retry-After首部字段再返回给客户端
!!状态码和状况的不一致
不少返回的状态码响应的都是错误,但是用户可能感觉不到这一点。比如Web应用程序内部发生错误,状态码依然返回200 OK
第五章 与HTTP协作的Web服务器
一台Web服务器可以搭建多个独立域名的Web网站,也可以作为通信路径上的一台中转服务器提升传输效率
5.1 用单台虚拟机实现多个域名
HTTP/1.1规范允许一个HTTP服务器搭建多个Web站点。比如,提供Web托管服务(Web Hosting Service)的供应商,可以用一台服务器为多位客户服务,可以以每位客户持有的域名运行各自不同的网站。
这是为了利用虚拟主机(Virtual Host,又称为虚拟机服务器)的功能。
即使物理层面只有一条服务器,但是只要用虚拟机的功能,则可以假象以具有多台服务器。
客户端使用HTTP协议访问服务器时,经常采用类似www.jrange.com这样的主机名和域名
在互联网上,域名通过DNS服务映射到IP地址之后访问目标网站。可见,当请求发送到服务器时,已经是以IP地址的形式访问了。
所以一台服务器托管了几个域名后,当收到请求后要知道是访问哪个域名,在相同的IP下,
由于虚拟机可以寄存多个不同的主机名和域名的Web网站,因此在发送HTTP请求时,必须在Host首部内完整指定主机或域名的URI
5.2 通过数据转发程序:代理、网关、隧道
HTTP通信时,出客户端和服务器以外,还有一些用于通信数据转发的应用程序,例如代理、网关和隧道。他们可以配合服务器工作
这些应用程序和服务器可以将请求转发给通信线路上的下一站服务器,并且能接收从那台服务器发送的响应再转发给客户端。
代理:
是一种有转发功能的应用程序,它扮演了位于服务器和客户端“中间人”的角色,接收由客户端发送的请求并转发给服务器,同时也接收服务器返回的响应并转发给客户端。
网关:
是转发其他服务器通信数据的服务器,接收从客户端发送来的请求时,他就像自己拥有资源的服务器一样对请求进行处理。有时客户端可能不会察觉,自己的通信目标是一个网关。
隧道:
是在相隔甚远的客户端和服务器之间进行中转,并保持双方通信连接的应用程序
5.2.1 代理
代理服务器的基本行为就是接受客户端发送的请求后转发给其他服务器。代理不改变请求URI,会直接发送给前方持有资源的目标服务器。
持有资源实体的服务器被称为源服务器。从源服务器返回的响应经过代理服务器后再传给客户端。
每次通过代理服务器转发请求或者响应时,会追加写入Via首部信息
在HTTP通信过程中,可级联多台服务器。请求和响应的转发会经过数太类似锁链一样连接起来的代理服务器。转发时,需要附加Via首部字段已标记经过的主机信息
使用代理的理由有:
利用缓存技术减少网络带宽的流量,组织针对内部针对特定网站的访问控制,以获取访问日志为主要目的。
代理的方法有多种,一种是是否使用缓存技术,一种是是否修改报文
缓存代理:
代理转发响应时,缓存代理会预先将资源的副本保存在代理服务器上。
代理再次接收到相同的请求时,就可以不从源服务器上获取资源,而是将之前的副本缓存资源返回作为响应
透明代理:
转发请求或者响应时,不对报文做任何加工的代理被称为透明代理。反之,进行报文加工的代理称为非透明代理。
5.2.2 网关
网关的工作机制和代理十分相似,而网关能使通信线路上的服务器提供非HTTP协议服务。
利用网关能提高通信的安全性,因此可以在客户端与网管之间的通信线路上加密以确保连接的安全。比如,网关可以连接数据库,使用SQL语句查询数据。另外,在Web购物网站上进行信用卡结算时,网关可以和信用卡结算系统联动。
5.2.3 隧道
隧道可以按要求建立起一条与其他服务器的通信线路,届时使用SSL等加密手段进行通信。隧道的目的是确保客户端能与服务器进行安全的通信。
隧道本身不会去解析HTTP请求,也就是说,请求保持原样中转给之后的服务器。隧道会在通信双方断开链接时结束。
通过隧道的传输,可以和远距离的服务器安全通信。隧道本身是透明的,客户端不用在意隧道的存在
5.3 保存资源的缓存
缓存是指代理服务器或者客户端本地磁盘内保存的资源副本。利用缓存可减少服务器的访问,因此也就节省了通信流量和时间。
缓存服务器是代理服务器的一种,并归类在缓存代理类型中。话句话说,当代理转发服务器返回的响应时,代理服务器会保存一份资源的副本。
5.3.1 缓存的有效期
当遇到源服务器上的资源更新时,如果还是使用不变的缓存,那就会演变成返回更新前旧的资源了。即使存在缓存,也会因为客户端的要求,缓存的有效期等因素,向源服务器确认资源的有效性。若判断缓存失败,缓存服务器会再次从源服务器上获取新资源。
5.3.2客户端的缓存
缓存不仅可以存在于缓存服务器内,还可以存在客户端的浏览器中。以IE为例,把客户端缓存称为临时网络文件。(Temporary Internet File)
浏览器缓存如果有效,就不必再向服务器请求相同的资源了,可以直接从本地磁盘内读取。
另外,和缓存服务器相同的一点是,但判断缓存过期后,会向源服务器确认资源的有效性。若判断浏览器缓存失败,浏览器会再次请求新资源。
!!在HTTP出现之前的协议
FTP(File Transfer Protocol)
NNTP(NetWork News Transfer Protocol)
Archie
WAIS
Gopher
第六章 HTTP首部
HTTP协议的请求和响应报文中必定包含HTTP首部,只是我们在平时使用Web的过程中感受不到他。
6.1HTTP报文首部
HTTP协议的请求和响应报文必定包含HTTP首部。首部内容为客户端和服务器分别处理请求和响应提供所需的信息。对于客户端用户来说,这些信息中的大部分内容都无需亲自查看。
HTTP请求报文
在请求中,HTTP报文由方法、URI、HTTP版本、HTTP首部字段等部分组成。
HTTP响应报文
在响应中,HTTP报文由HTTP版本、状态码、HTTP首部字段
6.2 HTTP首部字段
6.2.1 HTTP首部字段传递重要信息
HTTP首部字段是构成HTTP报文的重要因素之一。在客户端与服务器之间以HTTP进行通信时,无论是请求还是响应都会用到首部字段,它能传递额外重要信息的作用。
使用首部信息字段是为了给浏览器和服务器提供报文主体大小、使用的语言、认证信息等内容。
6.2.2 HTTP首部字段结构
HTTP首部字段是由首部字段和字段值构成的,中间用“:”分割
首部字段名:字段值
字段值对应单个HTTP首部字段可以有多个值
6.2.3 4种HTTP首部字段类型
通用首部字段 (GeneralHeader Fields)
请求报文和响应报文都会使用的首部
请求首部字段(Request Header Fields)
从客户端向服务器端发送报文时使用的首部。补充了请求的附加内容、客户端信息、响应内容相关优先级等信息。
响应首部字段(Response Header Fields)
从服务器向客户端返回响应报文时使用的首部。补充了响应的附加内容,也会要求客户端附加额外的内容信息。
实体首部字段(Entity Headers Fields)
针对请求报文和响应报文的实体部分使用的首部。补充了资源内容更新时间等与实体有关的信息
6.2.4 HTTP/1.1 首部字段一览
通用首部字段
Cache-Control 控制缓存的行为
Connection 逐跳首部、连接的管理
Date 创建报文的日期时间
Pragma 报文指令
Trailer 报文末端的首部一览
Transfer-Encoding 指定报文主体的传输编码方式
Upgrade 升级为其他协议
Via 代理服务器的相关信息
Warning 错误通知
请求首部字段
Accept 用户代理可处理的媒体类型
Accept-Charset 优先的字符集
Accept-Encoding 优先的内容编码
Accept-Language 优先的语言(自然语言)
Authorization Web认证信息
Except 期待服务器的特定行为
From 用户的电子邮箱地址
Host 请求资源所在服务器
If-Match 比较实体标记(ETag)
If-Modified-Since 比较资源的更新时间
If-None-Match 比较实体标记(与If-Match相反)
If-Range 资源未更新时发送实体Byte的范围请求
If-Unmodified-Since 比较资源的更新时间(与If-Modified-Since相反)
Max-Forwards 最大传输逐跳数
Proxy-Authorization 代理服务器要求客户端的认证信息
Range 实体的字节范围请求
Referer 对请求中URI的原始获取方
TE 传输编码的优先级
User-Agent HTTP 客户端程序的信息
响应首部字段
Accept-Ranges 是否接受字节范围请求
Age 推算资源创建经过时间
ETag 资源的匹配信息
Location 令客户端重定向至指定URI
Proxy-Authenticate 代理服务器对客户端的认证信息
Rentry-After 对再次发起请求的时机要求
Server HTTP服务器的安装信息
Vary 代理服务器缓存的管理信息
WWW-Authenticate 服务器对客户端的认证信息
实体首部字段
Allow 资源可支持的HTTP方法
Content-Encoding 实体主体适用的编码方式
Content-Language 实体主体的自然语言
Content-Length 实体主体的大小(单位 :字节)
Content-Location 替代对应资源的URI
Content-MD5 实体主体的报文摘要
Content-Range 实体主体的位置范围
Content-Type 实体主体的媒体类型
Expires 实体主体过期的日期时间
Last-Modified 资源的最后修改日期时间