HTTP权威指南读书笔记

第一部分 HTTP:Web的基础

第一章 HTTP概述

  1. HTTP是应用层协议,建立在TCP/IP之上,Web服务器会为所有HTTP对象数据附加一个MIME 类型,MIME 类型是一种文本标记,表示一种主要的对象类型和一个特定的子类型,中间由一条斜杠来分隔,比如text/html;image/jpeg。
  2. HTTP报文是由一行一行的简单字符串组成的,都是纯文本,主要包括三个部分,

    • 起始行,报文的第一行就是起始行,在请求报文中用来说明要做些什么,在响应报文中说明出现了什么情况。
    • 首部字段,起始行后面有零个或多个首部字段。每个首部字段都包含一个名字和一个值, 为了便于解析, 两者之间用冒号(:)来分隔。首部以一个空行结束。添加一个首部字段和添加新行一样简单
    • 主体,其中包含了所有类型的数据,请求报文是要发送给web服务器的内容,响应报文是要发送给客户端的内容

      请求报文范例

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      GET /mumue/archive/2012/04/23/2467072.html HTTP/1.1
      Host: www.cnblogs.com
      Connection: keep-alive
      Cache-Control: max-age=0
      Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
      Upgrade-Insecure-Requests: 1
      User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.85 Safari/537.36
      Referer: https://www.google.com.hk/
      Accept-Encoding: gzip, deflate, sdch
      Accept-Language: zh-CN,zh;q=0.8,en;q=0.6
      Cookie: CNZZDATA1255778100=388437504-1442227353-null%7C1442227353; _ga=GA1.2.1845097067.1442111906; _gat=1
      If-Modified-Since: Tue, 15 Sep 2015 07:16:13 GMT

      响应报文范例

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      HTTP/1.1 200 OK
      Date: Tue, 15 Sep 2015 07:19:07 GMT
      Content-Type: text/html; charset=utf-8
      Connection: keep-alive
      Vary: Accept-Encoding
      Cache-Control: private, max-age=10
      Expires: Tue, 15 Sep 2015 07:19:09 GMT
      Last-Modified: Tue, 15 Sep 2015 07:18:59 GMT
      X-UA-Compatible: IE=10
      Content-Length: 34031
      <html>
      <head></head>
      <body>
      ...
      </body>
      </html>
  3. 目前使用的HTTP协议版本是1.1

第二章 URL与资源

  1. URL的语法基本是这样:://:@:/;?#。但没有哪个URL是包含所有组建的。
  2. 由于URL中只能使用英文字母和阿拉伯数字和某些符号,中文等符号是不能使用的,所以就会遇到编码的问题,一般是%+某种方式编码后的结果,比如空格的ASCII码值是20 编码后就是%20。具体的编码方式和浏览器及操作系统本地环境有关。参考文章:阮一峰–关于URL编码

第三章 HTTP报文

  1. 报文的起始行和首部是由行分割的ASCII文本,每行都以一个由两个字符(回车符和换行符)组成的行终止序列作为结束。主体是一个可选的数据块,可以包含文本或二进制数据,也可以是空。
  2. 状态码(参考文章
    • 100~199 信息性状态码
    • 200~299 成功状态码
    • 300~399 重定向状态码 301永久重定向 304 Not MOdified
    • 400~499 客户端错误状态码
    • 500~599 服务器错误状体码
  3. 303 307是在HTTP1.1才有的,主要是为了细分302,区分POST请求时如何重定向。在HTTP1.1中,302其实是可以删除的,但是为了兼容HTTP1.0,而且很多服务器对重定向序列的返回码使用并不严格,302还是在大量使用。

第四章 连接管理

  1. TCP的数据是通过名为IP分组( 或IP数据报)的小数据块来发送的。
  2. Connection字段可以有三种意义:
    • 其他字段名(表明这些字段将不会被转发)
    • 关键字(HTTP1.1中只定义了Keep-Alive,用于持久连接,HTTP1.1是默认使用这个参数的,除非主动设为close。如果有这个参数,一般会有Keep-Alive: max=5, timeout=120)
    • Close(传输完成即关闭连接)
  3. 只有当连接上所有的报文都有正确的、 自定义报文长度时——也就是说, 实体主体部分
    的长度都和相应的 Content-Length 一致, 或者是用分块传输编码方式编码的——连接
    才能持久保持。

第二部分

第五章 Web服务器

解析请求报文时,首先解析请求行,获取请求方法、指定的资源标识符以及版本号,然后读取报文首部,如果有主体的话,读取请求主体

第六章 代理

  1. 代理的主要作用:
    • 内容访问控制
    • 集中统一式的安全防火墙
    • Web缓存
    • 反向代理
    • 转码器
    • 匿名代理
  2. 使客户端流量流向代理主要有4种方式
    • 修改客户端,比如浏览器设置代理,那HTTP请求就直接发送给代理了
    • 修改网络基础设施,直接在路由器或者某些设施上拦截,转向代理
    • 修改DNS,使代理服务器伪装成真实的web服务器名字和ip
    • 修改web服务器,返回重定向到代理服务器上。

第七章 缓存

  1. 缓存可以节省宽带,加快客户端的反应速度。
  2. HTTP头中可以用来控制缓存的字段主要有
    • Expires:Fri, 22 Jan 2016 04:43:59 GMT。绝对时间点,在这个时间点之前都是直接拉取缓存,无需再次请求。但是因为全球各地的时间可能不一样,所以不建议使用这个,而且优先级低于Cache-Control。如果两者同时出现会被覆盖
    • Cache-Control:max-age=86400。相对时间,即缓存有效期为24小时,24小时内都是直接拉取缓存,无需再次请求。
    • Last-Modified/If-Modified-Since。请求时带上If-Modified-Since:Wed, 28 Nov 2012 06:02:44 GMT。web服务器收到请求后发现有头If-Modified-Since 则与被请求资源的最后修改时间进行比对。若最后修改时间较新,说明资源又被改动过,则响应整片资源内容。如果没有修改则返回304。响应返回会带上Last-Modified:Wed, 28 Nov 2012 06:02:44 GMT告诉浏览器资源的最后修改时间
    • Etag/If-None-Match。web服务器响应请求时,告诉浏览器当前资源在服务器的唯一标识(生成规则由服务器自定义)。Apache中,ETag的值,默认是对文件的索引节(INode),大小(Size)和最后修改时间(MTime)进行Hash后得到的。当资源过期时(使用Cache-Control标识的max-age),发现资源具有Etag:05a7bfb2dcdcd1:0声明,客户端会再次向web服务器请求时带上头If-None-Match:05a7bfb2dcdcd1:0(Etag的值)。web服务器收到请求后发现请求头带有If-None-Match 则与被请求资源的相应校验串进行比对,决定返回200或304。
  3. Etag主要是来解决Last-Modified没法解决的问题:时间精确到1秒以内、某些定期生成的文件,内容并没有变化、代理服务器的时间不一致或无法获取准确的文档修改时间。

第八章 集成点:网关、隧道及中继

  1. 网关可以作为某种翻译器使用,它抽象出了一种能够到达资源的方法。网关是资源和应用程序之间的粘合剂。应用程序可以(通过 HTTP或其他已定义的接口)请求网关来处理某条请求,网关可以提供一条响应。网关可以向数据库发送查询语句,或者生成动态的内容,就像一个门一样: 进去一条请求, 出来一个响应。
  2. 隧道就是通过HTTP应用程序访问使用非HTTP协议的应用程序。Web隧道最常见的原因就是要在HTTP连接中嵌入非HTTP流量,这样,这类流量就可以穿过只允许Web流量通过的防火墙了
  3. HTTP中继(relay)是没有完全遵循HTTP规范的简单HTTP代理。中继负责处理HTTP中
    建立连接的部分,然后对字节进行盲转发。

第九章 Web机器人

  1. robots.txt文件用于控制爬虫获取页面的权限。格式为
    1
    2
    3
    4
    5
    User-Agent: slurp
    User-Agent: webcrawler
    Disallow: /private
    User-Agent: *
    Disallow:

第十章 HTTP-NG

这一章的内容已经没有多大参考价值了,HTTP2.0已经出来了,以谷歌的SPDY技术为主,主要就是异步连接复用,头压缩和请求响应管线化,复用TCP连接。实现缩短网页的加载时间和提高安全性。
HTTP2.0详解
SPDY 维基百科

第三部分 识别、认证与安全

第十一章 客户端识别与Cookie机制

识别客户端主要方法有富url,cookie,ip,HTTP请求头,用户登录。cookie是用的最广泛的方法。

第十二章 基本认证机制

  1. 基本认证就是用户提供用户名和密码,服务器进行验证,目前广泛采用的认证方案。
  2. 缺陷就在于密码是明文发送,容易被截获。需要配合ssl等加密通道结合使用。

第十三章 摘要认证

  1. 客户端发送密码的摘要而不是发送明文密码。
  2. 必须加上随机数,不然被截获好了摘要也就和截获了密码是一样的,加入随机数,保证每次摘要都是不一样的。

第十四章 安全HTTP

  1. 对称密钥加密技术就是,发送端和接收端要共享相同的密钥k才能进行通信。发送端用共享的密钥来加密报文,并将得到的密文发送给接收端。接收端收到密文,并对其应用解密函数和相同的共享密钥,恢复出原始的明文。
  2. 公开密钥加密技术是编码密钥是众所周知的,但只有主机才知道私有的解密密钥,这
    样,每个人都能找到某个特定主机的公开密钥,密钥的建立变得更加简单。但解码密钥是保密的,因此只有接收端才能对发送给它的报文进行解码。
  3. HTTPS在建立HTTP连接之前会先进行SSL连接,使客户端和服务端建立加密通道,然后忘了报文就全在这个加密通道上进行传输,服务端进行解密后再发送给传输层。

第四部分 实体、编码和国际化

第十五章 实体和编码

  1. Content-Length 首部指示出报文实体主体的字节大小,如果进行了压缩的话,那这个长度指的是压缩后的大小。
  2. Content-Encoding主要有gzip、compress、deflate三种无损压缩算法。gzip效率最高、使用最广泛。

第十六章 国际化

  1. 服务端通过Content-Type中的charse参数和Content-Language通知客户端文档的字符集和语言。客户端通过Accept-Charset和Accept-Language告知服务端用户可以理解何种语言。

第十七章 内容协商与转码

  1. 一个URL代表若干个不同的资源的时候,就需要协商具体提供哪个资源。主要有客户端驱动协商、服务器驱动的协商、透明(中间代理)协商。
  2. 客户端驱动协商就是服务端返回可选列表,有客户端选择使用哪个。服务端协商就是根据客户端发送过来的信息比如首部或者UA来判定返回哪一个资源。

第五部分 内容发布与分发

第十八章 Web主机托管

使用托管,可以免去很多烦恼,同时让自己的网站更加可靠,被访问速度更快。

第十九章 发布系统

这个部分的内容已经有点过时了,但是用visual studio还是可以安装webDAV实现远程发布。现在常用的都是用git或者svn来实现远程代码提交以及发布了。

第二十章 重定向与负载均衡

  1. 为了可靠的执行HTTP事务、最小化时延、节约网络带宽,经常需要使用重定向。

第二十一章 日记记录与使用情况跟踪

日志一般都会记录时间、请求端的ip、用户名、请求路径、响应状态码、主体长度