《图解HTTP》读书笔记

1. 了解WEB及网络基础

HTTP是TCP/IP协议族的一个子集,是在TCP/IP的基础上运作的

计算机要与网络设备之间的通信,双方就必须基于相同的方式。比如如何探测到通信目标、有哪边先发起通信、怎么结束通信等。所有的一切都是一种规则,这种规则就是协议

1.1 TCP/IP的分层管理

TCP/IP协议族按层次分别为以下4层:

  • 应用层:决定了向用户提供服务时通信的活动,比如ftp, dns, http协议
  • 传输层:提供处于网络连接中的两台计算机之间的数据传输。TCP, UDP
  • 网络层:用来处理网络上流动的数据包,确定传输路线
  • 数据链路层:用来处理连接网络的硬件部分。包括控制操作系统、硬件的设备驱动、网卡
# 客户端发送请求
HTTP客户端 -> TCP -> IP -> 链路层
# 客户端接受请求
链路层 -> IP -> TCP -> HTTP客户端
# 服务端发送数据
HTTP服务器 -> TCP -> IP -> 链路层
# 服务端接受数据
链路层 -> IP -> TCP -> HTTP服务器

举例来说:就是页面发送请求(应用层) -> 把从应用层接收到的数据(HTTP请求报文)进行分割,并在各个报文打上标记及端口号(传输层) -> 增加作为通信目的地的MAC地址后转发链路层(网络层) -> 发送真正的请求(链路层)

1.2 与HTTP关系密切的协议:IP/TCP/DNS

  1. 负责传输的IP协议(Internet Protocol),IP是一种协议的名称,并非IP地址,要确保正确的传输到对方的计算机上,则需要满足各种条件,其中两个重要的条件就是mac地址和ip地址,没有那台计算机能掌握全面的互联网中的细节,这就需要多台计算机做中转,而进行中转时,会利用下一站中转设备的MAC地址来搜索下一个目标。这是会采用ARP协议(Address Resolution Protocol),这是一种解析地址的协议,能根据IP查询MAC地址。 具体的步骤如下:
发送端请求IP -> ARP解析成MAC地址 -> 找到相关路由 ->  ARP解析成MAC地址 -> 找到相关路由 -> ... -> 目的地
  1. 确保可靠性的TCP协议

TCP位于传输层,提供可靠的字节流服务。将大块数据分割成报文段为单位的数据包进行管理,而可靠的传输服务是指,能够将数据准确可靠的传给对方。

为了能准确的到达目标,TCP协议采取了三次握手策略,握手过程中采用了TCP的标志SYNACK

发送端发送SYN -> 接收端回传SYN/ACK(用来传达确认信息) -> 发送端发送SYN + 数据包(握手结束)

如果以上任何一个步骤终端,会再次以相同的顺序发送数据包

1.3 负责域名解析的DNS服务(应用层)

DNS协议通过提供的域名查找IP地址,或者逆向从IP地址反查域名的服务

# 访问某个页面
DNS解析成IP -> HTTP协议生成请求报文 -> TCP切割报文,三次握手保证传输的可靠性 -> IP协议搜索对方地址,一边中转一遍传送
(最终可以利用TCP/IP通信协议向用户进行回传)

1.4 URI和URL

URL(Uniform Resource Locator) 统一资源定位符,比如http://cnblogs.com

URI(Uniform Resource Identifier) 统一资源标识符

Identifier表示可标识对象。也成为标识符。

URI用字符串标识某一互联网资源,而URL表示资源的地点。可见URL是URI的子集

# 一个标准的URI
http://user:pass@www.example.com:80/dir/index.html?uid=1#ch1

2. 简单的HTTP协议

2.1 HTTP协议用于客户端和服务端之间的通信

HTTP协议能明确的确定哪端是服务端,哪端是客户端。先从客户端建立通信,服务端没有接收到请求前不会发送响应。

2.2 通过请求和响应的交换达成响应

# 简单的请求头
GET /index.html HTTP/1.1
HOST: hackr.jp

以上简单的请求头规定了请求方法,请求资源,HTTP版本

响应报文由基本的协议版本,状态码,用以解释状态码的原因短语、可选的响应首部字段以及实体构成。

# 简单的响应体
HTTP/1.1 200 OK
Date: Tue, 10 Jul 2012 06:50:16 GMT
Content-Length: 362
Content-Type: text/html

2.3 HTTP是不保存状态的协议

HTTP是一种不保存状态,即无状态的协议。也就是说协议对于发送过得请求或者响应都不做持久化处理

为了实现期望的保持状态的功能,于是引入了cookie技术。有了cookie再用HTTP协议通信,就可以管理状态了

2.4 请求URI定位资源

如果不是访问特定资源,而是访问这个服务器,可以使用一个*来代替URI

OPTIONS * HTTP/1.1

2.5 告知服务器意图的HTTP方法

GET

POST 传输实体主题

PUT 传输文件

HEAD 获得报文首部

DELETE 删除文件

OPTIONS 用来查询支持的方法

TRACE 追踪路径

客户端通过trace方法可以查询发送出去的请求是怎样被加工修改/篡改的。这是因为请求想要连接到源目标服务器可能会通过代理中转,trace方法就是用来确认连接过程中发生的一系列操作

CONNECT 要求用隧道协议连接代理

2.6 使用方法下达命令

指定请求的资源按期望产生某种行为。方法中有GET, POST, HEAD等

2.7 持久连接节省通信量

为解决上述TCP连接的问题,HTTP/1.1和一部分的HTTP/1.0想出了持久连接keep-alive,持久连接的特点是只要任意一端没有明确提出断开连接,则保持TCP连接状态。

建立TCP连接 ->SYN -> SYN/ACK -> ACK 
-> HTTP请求 -> HTTP响应 -> HTTP请求 -> HTTP响应... 
-> FIN -> ACK -> FIN -> ACK -> 断开TCP连接

2.8 使用Cookie的状态管理

HTTP无状态协议,它不对之前发生过的请求和响应做状态管理。也就是说无法根据之前的状态进行本次请求处理

Cookie技术通过在请求和响应报文中写入cookie信息来控制客户端状态

响应报文中一个叫Set-Cookie的首部字段信息,通知客户端保存cookie,当下次客户端再往改服务器发送请求时,客户端会自动在请求报文中加入cookie

3. HTTP报文内HTTP信息

3.1 HTTP报文

请求报文

响应报文

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

3.2 请求报文以及响应报文的结构

请求行:包含用于请求的方法,请求URI和HTTP版本

状态行:包含表明响应结果的状态码,原因短语和HTTP版本

首部字段:包含表示请求和响应的各种条件和属性的各类首部

3.3 编码提升传输速率

传输过程中通过编码提升传输速率,通过在传输时编码,能有效处理大量的访问请求。但是编码的操作会消耗更多的CPU

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

通常的编码有:

gzip
compress
deflate
identify

HTTP会对较大的实体进行分割,将实体主体分成多个部分。每一块都会用十六进制来标记块的大小

3.4 发送多种数据的多部分对象集合

发送的一份报文主体内可含有多种类型实体。通常是在图片或文本文件等上传时使用

多部分对象集合包含的对象如下

multipart/form-data 在WEB表单文件上传时使用
multipart/byteranges 状态码206响应报文包含了多个范围的内容时使用

在HTTP报文中使用多部分对象集合时,需要在首部字段里加上Content-Type

3.5 获取部分内容的范围请求

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

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

获取5001-10000字节的部分
Range: bytes=5001-10000

3.6 内容协商返回最合适的内容

请求报文中某些首部字段就是判断的基准

Accept
Accept-Charset
Accept-Encoding
Accept-Language
Content-Language

4. 返回结果的HTTP状态码

4.1 状态码告知从服务器端返回的请求结果

4.2 2XX成功

200 OK
204 No Content
206 Partial Content

4.3 3XX重定向

301 Moved Permanently
302 Found
303 See Other
304 Not Modified 不包含任何响应的主体部分

4.4 客户端错误

400 Bad Request 请求报文中存在语法错误
401 Unauthorized 表示发送的请求需要通过HTTP认证
403 Forbidden 服务器拒绝访问
404 Not Found 服务器上找不到资源

4.5 5XX服务器错误

500 Interal Server Error 服务端执行请求发生bu
503 Service Unavailable 服务器暂时处于超负载或正在进行停机维护,现在无法处理请求

5. 与HTTP协作的Web服务器

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

HTTP1.1规范允许一台HTTP服务器搭建多个WEB站点。即使物理层只有一台服务器,但只要使用虚拟主机的功能,则可以假想已经拥有多台服务器

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

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

代理服务器的基本行为就是接受客户端发送的请求后转发给其他服务器。代理不改变请求URI,会直接发送给前方持有资源目标服务器

每次经过代理服务器转发请求或响应时,会追加写入Via首部信息

缓存代理:代理转发响应时,缓存代理会预先将资源的副本保存在代理服务器上。当再次接收到相同请求时,就不会从源服务器那里获取资源。而是将缓存返回。

5.3 保存资源的缓存

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

缓存不仅可以存在客户端浏览器中。还可以存在于服务器中。把客户端缓存称为临时网络文件Temporary Internet File

6.http首部

6.1 HTTP报文首部

首部内容为客户端和服务器端分别处理请求和响应提供所需要的信息。

请求报文首部包含

  1. 请求行(方法,URI,HTTP版本)
  2. 请求首部字段
  3. 通用首部字段
  4. 实体首部字段

响应报文包括

  1. 状态行(HTTP版本,状态码)
  2. 请求首部字段
  3. 通用首部字段
  4. 实体首部字段

6.2 HTTP首部字段

在HTTP协议通信交互中使用到的首部字段,不限于RFC2616中定义的47种首部字段。还有Cookie, Set-Cookie, Content-Disposition等在其他RFC中定义的首部字段。

6.3 HTTP/1.1通用首部字段

  1. Cache-Control

多个指令之间通过分隔。首部字段

Cache-Control: private, max-age=0, no-cache
  • public 明确表示其他用户也可以使用缓存
  • private 特定的用户可以使用缓存
  • no-cache 禁用缓存,防止从缓存中返回过期资源
  • no-store 暗示请求和响应中包含机密信息
  • max-age 设置缓存时间。如果超过这个缓存时间就需要将请求转发给源服务器
  1. Connection
  • 控制不再转发给代理的首部字段
GET / HTTP / 1.1
Upgrade: HTTP/1.1
Connection: Upgrade
# Upgrade首部字段将不再转发
  • 管理持久连接
Connection: Keep-Alive
  1. Date

表示创建HTTP报文的日期和时间

  1. Pragma

6.4 请求首部字段

请求首部字段是从客户端往服务器端请求报文中所使用的字段,用于补充请求的附加信息、客户端信息、对响应内容相关的优先级等

  1. Accept 首部字段可通知服务器,用户代理能够处理的媒体类型或文件类型

  2. Accept-Charset 客户端支持接收的字符集

  3. Accept-Encoding 客户端支持的内容编码,可一次性指定多种编码

  4. Accept-Language 用来告知服务器用户代理能够处理的自然语言集

  5. Authorization 用来告知服务器用户代理认证信息

  6. Expect 用来告知服务器期望出现的某种特定行为

  7. Host 请求的资源所处的互联网主机名和端口号

  8. If-Match 服务器接收到附带条件后,只有判断指定条件为真时,才会接受请求

  9. User-Agent 将创建请求的浏览器和用户代理名称等信息传达给服务器。

6.5 响应首部字段

响应首部字段是由服务器端向客户端返回响应报文中所使用的字段

  1. Accept-Ranges 告知客户端是否能处理范围请求,以指定服务器端某个部分的资源

  2. Age 告知客户端源服务器多久前创建了响应

  3. ETag 将资源以字符串形式做唯一性标志的方式,当资源更新时,ETag值也会更新。

  4. Location 可以将响应接受方引导至某个与请求URI位置不同的资源

  5. Proxy-Authenticate 会把由代理服务器所要求的认证信息发送给客户端

  6. Retry-After 告知客户端应该在多久之后再次发送请求

  7. Server 告知客户端当前服务器上安装的HTTP服务器程序信息(Apache/2.2.17 Unix)

  8. Vary 源服务器会向代理服务器传达关于本地缓存使用方法的命令

  9. WWW-Authenticate 用于HTTP访问认证

6.6 实体首部字段

实体首部字段是包含在请求报文和响应报文中的实例部分所使用的首部。

  1. Allow 通知客户端能够支持的所有的HTTP方法

  2. Content-Encoding 通知客户端对实体的主体部分选用的内容编码方式

  3. Content-Language 通知客户端实体的主体部分的自然语言

  4. Content-Length 通知客户端实体主题部分的大小(字节)

  5. Content-Location 给出报文主体部分相对应的URI

  6. Content-MD5 对报文主体执行MD5算法,再通过Base64编码后将结果写入Content-MD5字段值

  7. Content-Range 返回响应时使用的首部字段

  8. Content-Type 说明了实体主题内对象的媒体类型

  9. Expires 通知客户端资源的失效日期

  10. Last-Modified 通知客户端资源的最终修改时间

6.7 为Cookie服务的首部字段

当服务器准备开始管理客户端状态时,会事先告知各种信息

  1. Set-Cookie 设置cookie

    • NAME=VALUE
    • expires
    • path
    • domain
    • secure
    • HttpOnly
  2. Cookie 告知服务器,携带客户端的Cookie

7. 确保Web安全的HTTPS

7.1 HTTP的缺点

  • 通信使用明文,可能会被窃听
    通过和SSL(Secure Socket Layer)或者TLS(Transport Layer Security)的组合使用,加密HTTP的通信内容。与SSL组合使用的HTTP称为HTTPS

  • 不验证通信方的身份,可能遭遇伪装
    SSL不仅提供加密处理,而且还使用了一种被称为证书的手段,可以用于确定方。

  • 无法证明报文的完整性

7.2 HTTP+加密+认证+完整性保护=HTTPS

8.确认访问用户身份认证

8.1 何为认证

HTTP/1.1 使用的认证方式如下所示

  • BASIC认证
  • DIGEST认证
  • SSL客户端认证
  • FormBase认证

8.2 BASIC认证

基本步骤

需要basic认证 -> 服务端401 Authrization Required -> WWW-Authenticate -> ID和密码发送给服务器(base64编码) -> 服务端密码认证

8.3 DIGEST认证

采用质询/响应方式

认证要求 -> 质询码 -> 响应码

8.4 SSL客户端认证

SSL客户端认证是借由HTTPS的客户端证书完成认证的方式,凭借客户端证书认证,服务端可确认访问是否来自于已登录的客户端。

8.5 基于表单的认证

基于表单的认证方法并不是在HTTP协议中定义的。客户端会向服务器上的web应用程序发送登录信息,按登录信息的验证结果认证

9. 基于HTTP的功能追加

9.1 基于HTTP的协议

9.2 消除HTTP瓶颈的SPDY

HTTP的瓶颈

  • 一条连接上只可发送一个请求
  • 请求只能从客户端开始。客户端不可以接收除响应以外的指令
  • 请求响应首部未经过压缩就发送
  • 发送冗长的首部。每次互相发送相同的首部造成浪费较多
  • 可任意选择数据压缩格式。非强制压缩发送

9.3 使用浏览器进行全双工通信的WebSocket

连接的发起方仍是客户端。一旦确立通信,不论服务器还是客户端,任意一方都可直接向对方发送报文。

10. 构建web内容技术

本章是web开发基础,略

11. Web的攻击技术

11.1 针对web的攻击技术

从浏览器那接收到的HTTP请求的全部内容,都可以在客户端自由的变更,篡改。所以web应用可能会接收到与预期数据不相同的内容。

  • 主动攻击
  • 被动攻击

11.2 因输出值转义不完全引发的安全漏洞

XSS: 通过存在安全漏洞的web网站注册用户的浏览器内运行非法的HTML标签或JavaScript进行的一种攻击

// 常见情况一
input中输入带有非法字符的代码
// 常见情况二
URL中的查询参数带有非法代码

SQL注入是指针对web应用使用的数据库,通过运行非法的SQL产生的攻击

OS攻击

HTTP首部注入攻击:在HTTP响应首部字段内插入换行,添加任意响应首部或主体的一种攻击

%0D%0A代表HTTP的换行符

邮件首部注入攻击:攻击者通过向邮件首部ToSubject内任意添加非法内容发起的攻击

11.4 因会话管理疏忽引发的安全漏洞

  1. session劫持

  2. CSRF 跨站请求伪造

跨站点请求伪造攻击是指攻击者通过设置好的陷阱,强制对已完成认证的用户进行非预期的个人信息或设定信息等某些状态的更新

posted @ 2018-01-25 11:11  郭励之  阅读(196)  评论(0编辑  收藏  举报