第三章 HTTP报文内的HTTP信息
HTTP报文:
请求报文和响应报文首部内容由以下几部分组成。
- 请求行:包含用于请求的方法、请求 URI 和 HTTP 版本
- 状态行:包含表明响应结果的状态码、原因短语和 HTTP 版本
- 首部字段:包含表示请求和响应的各种条件和属性的各类首部。一般有 4 种首部:通用首部、请求首部、响应首部和实体首部。
编码提升传输效率:
- 报文主体和实体主体的区别
HTTP 报文的主体用于传输请求或响应的实体主体。通常,报文主体等于实体主体。只有当传输中进行编码操作时,实体主体的内容发生变化,才导致它和报文主体产生差异。
- 压缩传输的内容编码
内容编码指明应用在实体内容上的编码格式,并保持实体信息原样压缩。内容编码后的实体由客户端接收并负责解码。
常用的内容编码有以下几种:gzip(GNU zip)、compress(UNIX 系统的标准压缩)、deflate(zlib) 和 identity(不进行压缩)
- 分割发送的分块传输编码
分块传输编码会将实体主体分为多个部分。使用分块传输编码的实体主体会由接收的客户端负责界面,恢复到编码前的实体主体。
内容协商:
-
服务器驱动协商(Server-driven Negotiation)
由服务器端进行内容协商。以请求的首部字段为参考,在服务器端自动处理。但对用户来说,以浏览器发送的信息作为判定的依据,并不一定能筛选出最优内容。 -
客户端驱动协商(Agent-driven Negotiation)
由客户端进行内容协商的方式。用户从浏览器显示的可选项列表中手动选择。还可以利用JavaScript脚本在Web页面上自动进行上述选择。比如按OS的类型或浏览器类型,自行切换成PC版页面或手机版页面。 -
透明协商(Transparent Negotiation)
是服务器驱动和客户端驱动的结合体,是由服务器端和客户端各自进行内容协商的一种方法。
第四章 返回结果的HTTP状态码
状态码返回告知:
-
2XX 成功
200 OK 客户端发送的请求在服务端正常处理
204 No Content 服务端成功处理请求,但没有资源返回
206 Partial Content 客户端进行了范围请求,而服务器成功执行 -
3XX 重定向
301 Moved Permanently 永久性重定向
302 Found 临时性重定向
303 See Other 由于请求对应的资源存在着另一个URI,应使用GET方法定向获取请求的资源。
304 Not Modified 客户端请求的资源找到,但未符合条件的请求
307 Temporary Redirect 临时重定向,与302不同的是不会从POST变成GET
当301、302、303响应状态码返回时,几乎所有的浏览器都会把POST改成GET,并删除请求报文内的主体,之后请求会自动再次发送。
301、302标准是禁止将POST方法改变成GET方法的,但实际使用时大家都会这么做。 -
4XX 客户端错误
400 Bad Request 客户端请求报文出错
401 Unauthorized 客户端的请求需要HTTP认证
403 Forbidden 请求资源被拒绝访问
404 Not Found 访问的资源不存在 -
5XX 服务器错误
500 Internal Server Error 服务器在执行请求时发生错误
503 Service Unavailable 服务器无法访问
第五章 与HTTP协作
用单台虚拟主机实现多个域名:
HTTP/1.1 规范允许一台 HTTP 服务器搭建多个 Web 站点。即使在物理层面只有一台服务器,但只要利用虚拟主机的功能,则可以假想已具有多台服务器。
在相同的 IP 地址下,由于虚拟主机可以寄存多个不同主机名和域名的 Web 网站,因此在发生 HTTP 请求时,必须在 Host 首部内完整指定主机或域名的 URI。
代理:
代理是一种有转发功能的应用程序,它扮演了位于服务器和客户端“中间人”的角色,接收由客户端发送的请求并转发给服务器,同时也接收服务器返回的响应并转发给客户端。
使用代理服务器的理由有:利用缓存技术(稍后讲解)减少网络带宽的流量,组织内部针对特定网站的访问控制,以获取访问日志为主要目的,等等。
-
缓存代理
代理转发响应时,缓存代理(Caching Proxy)会预先将资源的副本(缓存)保存在代理服务器上。当代理再次接收到对相同资源的请求时,就可以不从源服务器那里获取资源,而是将之前缓存的资源作为响应返回。 -
透明代理
转发请求或响应时,不对报文做任何加工的代理类型被称为透明代理(Transparent Proxy)。反之,对报文内容进行加工的代理被称为非透明代理。
网关:
网关是转发其他服务器通信数据的服务器,接收从客户端发送来的请求时,它就像自己拥有资源的源服务器一样对请求进行处理。有时客户端可能都不会察觉,自己的通信目标是一个网关。
利用网关能提高通信的安全性,因为可以在客户端与网关之间的通信线路上加密以确保连接的安全。比如,网关可以连接数据库,使用SQL语句查询数据。另外,在Web购物网站上进行信用卡结算时,网关可以和信用卡结算系统联动。
隧道:
隧道是在相隔甚远的客户端和服务器两者之间进行中转,并保持双方通信连接的应用程序。
隧道可按要求建立起一条与其他服务器的通信线路,届时使用SSL等加密手段进行通信。隧道的目的是确保客户端能与服务器进行安全的通信。
隧道本身不会去解析HTTP请求。也就是说,请求保持原样中转给之后的服务器。隧道会在通信双方断开连接时结束。
保存资源的缓存:
缓存是指代理服务器或客户端本地磁盘内保存的资源副本。利用缓存可减少对源服务器的访问,因此也就节省了通信流量和通信时间。
缓存服务器是代理服务器的一种,并归类在缓存代理类型中。当代理转发从服务器返回的响应时,代理服务器将会保存一份资源的副本在代理服务器上。
- 缓存的有效期限
缓存服务器的优势在于利用缓存可避免多次从源服务器转发资源。因此客户端可就近从缓存服务器上获取资源,而源服务器也不必多次处理相同的请求了。
缓存的有效期限:即便缓存服务器内有缓存,也不能保证每次都会返回对同资源的请求。因为这关系到被缓存资源的有效性问题。
即使存在缓存,也会因为客户端的要求、缓存的有效期等因素,向源服务器确认资源的有效性。若判断缓存失效,缓存服务器会再次从源服务器上获取"新"资源。
- 客户端的缓存
缓存不仅可以存在于缓存服务器内,也可以存在客户端浏览器中。浏览器缓存如果有效,就不必再向服务器请求相同的资源了,可以直接从本地磁盘内读取。
另外,和缓存服务器相同的一点是,当判定缓存过期后,会向源服务器确认资源的有效性。若判断浏览器缓存失效,浏览器会再次请求新资源。