第一部分 HTTP:Web的基础
第一章 HTTP概述
- HTTP是应用层协议,建立在TCP/IP之上,Web服务器会为所有HTTP对象数据附加一个MIME 类型,MIME 类型是一种文本标记,表示一种主要的对象类型和一个特定的子类型,中间由一条斜杠来分隔,比如text/html;image/jpeg。
HTTP报文是由一行一行的简单字符串组成的,都是纯文本,主要包括三个部分,
- 起始行,报文的第一行就是起始行,在请求报文中用来说明要做些什么,在响应报文中说明出现了什么情况。
- 首部字段,起始行后面有零个或多个首部字段。每个首部字段都包含一个名字和一个值, 为了便于解析, 两者之间用冒号(:)来分隔。首部以一个空行结束。添加一个首部字段和添加新行一样简单
主体,其中包含了所有类型的数据,请求报文是要发送给web服务器的内容,响应报文是要发送给客户端的内容
请求报文范例
1
2
3
4
5
6
7
8
9
10
11
12GET /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
16HTTP/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>
目前使用的HTTP协议版本是1.1
第二章 URL与资源
- URL的语法基本是这样:
:// : @ : / ; ? # 。但没有哪个URL是包含所有组建的。 - 由于URL中只能使用英文字母和阿拉伯数字和某些符号,中文等符号是不能使用的,所以就会遇到编码的问题,一般是%+某种方式编码后的结果,比如空格的ASCII码值是20 编码后就是%20。具体的编码方式和浏览器及操作系统本地环境有关。参考文章:阮一峰–关于URL编码
第三章 HTTP报文
- 报文的起始行和首部是由行分割的ASCII文本,每行都以一个由两个字符(回车符和换行符)组成的行终止序列作为结束。主体是一个可选的数据块,可以包含文本或二进制数据,也可以是空。
- 状态码(参考文章)
- 100~199 信息性状态码
- 200~299 成功状态码
- 300~399 重定向状态码 301永久重定向 304 Not MOdified
- 400~499 客户端错误状态码
- 500~599 服务器错误状体码
- 303 307是在HTTP1.1才有的,主要是为了细分302,区分POST请求时如何重定向。在HTTP1.1中,302其实是可以删除的,但是为了兼容HTTP1.0,而且很多服务器对重定向序列的返回码使用并不严格,302还是在大量使用。
- 303是返回GET请求的重定向,即重定向的url是GET方式,可以意淫为之前的POST过来的数据已经处理,只需重新请求这个重定向后的GET请求即可。
- 307 则是由客户端来决定是发送GET还是POST请求。
- RFC文档-Status Code Definitions
- HTTP状态码302、303和307的故事
第四章 连接管理
- TCP的数据是通过名为IP分组( 或IP数据报)的小数据块来发送的。
- Connection字段可以有三种意义:
- 其他字段名(表明这些字段将不会被转发)
- 关键字(HTTP1.1中只定义了Keep-Alive,用于持久连接,HTTP1.1是默认使用这个参数的,除非主动设为close。如果有这个参数,一般会有Keep-Alive: max=5, timeout=120)
- Close(传输完成即关闭连接)
- 只有当连接上所有的报文都有正确的、 自定义报文长度时——也就是说, 实体主体部分
的长度都和相应的 Content-Length 一致, 或者是用分块传输编码方式编码的——连接
才能持久保持。
第二部分
第五章 Web服务器
解析请求报文时,首先解析请求行,获取请求方法、指定的资源标识符以及版本号,然后读取报文首部,如果有主体的话,读取请求主体
第六章 代理
- 代理的主要作用:
- 内容访问控制
- 集中统一式的安全防火墙
- Web缓存
- 反向代理
- 转码器
- 匿名代理
- 使客户端流量流向代理主要有4种方式
- 修改客户端,比如浏览器设置代理,那HTTP请求就直接发送给代理了
- 修改网络基础设施,直接在路由器或者某些设施上拦截,转向代理
- 修改DNS,使代理服务器伪装成真实的web服务器名字和ip
- 修改web服务器,返回重定向到代理服务器上。
第七章 缓存
- 缓存可以节省宽带,加快客户端的反应速度。
- 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。
- Etag主要是来解决Last-Modified没法解决的问题:时间精确到1秒以内、某些定期生成的文件,内容并没有变化、代理服务器的时间不一致或无法获取准确的文档修改时间。
第八章 集成点:网关、隧道及中继
- 网关可以作为某种翻译器使用,它抽象出了一种能够到达资源的方法。网关是资源和应用程序之间的粘合剂。应用程序可以(通过 HTTP或其他已定义的接口)请求网关来处理某条请求,网关可以提供一条响应。网关可以向数据库发送查询语句,或者生成动态的内容,就像一个门一样: 进去一条请求, 出来一个响应。
- 隧道就是通过HTTP应用程序访问使用非HTTP协议的应用程序。Web隧道最常见的原因就是要在HTTP连接中嵌入非HTTP流量,这样,这类流量就可以穿过只允许Web流量通过的防火墙了
- HTTP中继(relay)是没有完全遵循HTTP规范的简单HTTP代理。中继负责处理HTTP中
建立连接的部分,然后对字节进行盲转发。
第九章 Web机器人
- robots.txt文件用于控制爬虫获取页面的权限。格式为
1
2
3
4
5User-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是用的最广泛的方法。
第十二章 基本认证机制
- 基本认证就是用户提供用户名和密码,服务器进行验证,目前广泛采用的认证方案。
- 缺陷就在于密码是明文发送,容易被截获。需要配合ssl等加密通道结合使用。
第十三章 摘要认证
- 客户端发送密码的摘要而不是发送明文密码。
- 必须加上随机数,不然被截获好了摘要也就和截获了密码是一样的,加入随机数,保证每次摘要都是不一样的。
第十四章 安全HTTP
- 对称密钥加密技术就是,发送端和接收端要共享相同的密钥k才能进行通信。发送端用共享的密钥来加密报文,并将得到的密文发送给接收端。接收端收到密文,并对其应用解密函数和相同的共享密钥,恢复出原始的明文。
- 公开密钥加密技术是编码密钥是众所周知的,但只有主机才知道私有的解密密钥,这
样,每个人都能找到某个特定主机的公开密钥,密钥的建立变得更加简单。但解码密钥是保密的,因此只有接收端才能对发送给它的报文进行解码。 - HTTPS在建立HTTP连接之前会先进行SSL连接,使客户端和服务端建立加密通道,然后忘了报文就全在这个加密通道上进行传输,服务端进行解密后再发送给传输层。
第四部分 实体、编码和国际化
第十五章 实体和编码
- Content-Length 首部指示出报文实体主体的字节大小,如果进行了压缩的话,那这个长度指的是压缩后的大小。
- Content-Encoding主要有gzip、compress、deflate三种无损压缩算法。gzip效率最高、使用最广泛。
第十六章 国际化
- 服务端通过Content-Type中的charse参数和Content-Language通知客户端文档的字符集和语言。客户端通过Accept-Charset和Accept-Language告知服务端用户可以理解何种语言。
第十七章 内容协商与转码
- 一个URL代表若干个不同的资源的时候,就需要协商具体提供哪个资源。主要有客户端驱动协商、服务器驱动的协商、透明(中间代理)协商。
- 客户端驱动协商就是服务端返回可选列表,有客户端选择使用哪个。服务端协商就是根据客户端发送过来的信息比如首部或者UA来判定返回哪一个资源。
第五部分 内容发布与分发
第十八章 Web主机托管
使用托管,可以免去很多烦恼,同时让自己的网站更加可靠,被访问速度更快。
第十九章 发布系统
这个部分的内容已经有点过时了,但是用visual studio还是可以安装webDAV实现远程发布。现在常用的都是用git或者svn来实现远程代码提交以及发布了。
第二十章 重定向与负载均衡
- 为了可靠的执行HTTP事务、最小化时延、节约网络带宽,经常需要使用重定向。
第二十一章 日记记录与使用情况跟踪
日志一般都会记录时间、请求端的ip、用户名、请求路径、响应状态码、主体长度