图解http
第一章 了解Web及网络基础
http 1.0 1996
http 1.1 1997
TCP/IP协议族
协议 计算机与网络设备要相互通信,双方必须基于相同的方法。不同硬件,操作系统之间的通信,需要规则,这种规叫做协议。
分层管理
应用层 决定向用户提供应用服务时通信的活动 FTP DNS HTTP
传输层 对应用层,提供处于网络连接中的两台计算机之间的数据传输。TCP UDP
网络层 处理在网络上流动的数据包。(数据包是网络传输的最小单位) 规定了通过怎样的路径到达对方的计算机,并把数据包传送给对方。 与对方计算机通过多台计算机或者网络设备进行传输时,网络层的作用是在众多选项内选择一条传输路线。
链路层 用来处理连接网络的硬件部分
IP协议
IP地址: 节点被分配到的地址 可变换
MAC地址: 网卡所属的固定地址 基本上不变
ARP协议 通过IP地址查出对应MAC地址
TCP协议
位于传输层,提供可靠的字节流服务
字节流服务 将大块数据分割成报文段为单位的数据包
可靠 把数据准确可靠得发送给对方 三次握手
DNS 协议
定义:通过域名查找IP地址
第二章 简单的HTTP协议
用于客户端和服务端之间的通信
通过请求和响应的交换达成通信
请求报文 由请求方法、请求URI、请求头部(可选)、内容实体 构成
响应报文 由协议版本、状态码、状态码的原因短语、响应头部(可选)、内容实体 构成
http 不保存状态(无状态)
为了实现保存状态功能,引入Cookie
请求方法
持久连接
每次请求都会TCP建立连接,断开连接,增加通信量的开销。
解决方法:持久连接(只要任意一端没有明确提出断开连接,则保持TCP连接状态) 建立一次TCP连接,进行多次请求和响应的交互
优点 减少TCP连接的重复建立和断开造成的额外开销,减轻服务器端的负载,提高Web页面显示速度
HTTP1.1 默认持久连接
HTTP1.0 keep-alive
管线化
持久连接使得 请求以管线化(pipeline)方式发送
之前:发送请求后等待收到响应,才能发送下一个请求
管线化:不用等待响应,即可发送下一个请求。能够同时并行发送多个请求
使用Cookie
Cookie 根据从服务器发送的响应报文内一个叫做Set-Cookie的首部字段信息,通知客户端保存Cookie.
当下次客户端再往该服务器发送请求时,客户端自动在报文中加入Cookie值后发送。
服务器发现客户端的Cookie,对比服务器记录,得到之前状态信息
第三章 HTTP报文内的HTTP信息
HTTP报文
报文:报文首部+报文主体
一般四种首部
- 通用首部
- 请求首部
- 响应首部
- 实体首部
编码提升传输速率
报文主体和实体主体的差异
报文
HTTP通信的基本单位,8位字节流
实体
实体首部+实体主体
报文实体: 传输 请求或响应的实体主体
通常相等,只有传输中进行编码操作,会导致不同。
压缩传输的内容 编码
服务器:压缩变小
客户端:接收,解码
常用内容编码
gzip
compress
deflate
identity(不进行编码)
分割发送的分块传输编码
在传输大量数据时,通过把数据分割成多块,能够使浏览器逐步显示页面。(每一块用十六进制标记块的大小)
这种把实体主体分块的功能称作分块传输编码
发送多种数据的多部分对象集合
MIME机制 允许处理多个类型的数据
获取部分内容的范围请求
首部字段 Range 指定资源 byte 范围
Range: bytes = -3000,5000-7000
内容协商 返回最合适的内容
Accept
Accept-Charset
Accept-Encoding
Accept-Language
Content-Language
第四章 状态码
200 OK 请求正常处理
204 No Content 请求处理成功,没有资源返回
206 Partial Content 对资源某一部分请求
301 Moved Permanently 永久性重定向
302 Found 临时重定向 希望用户本次用新的URL访问
303 See Other 临时按照新的URL访问 且用GET访问
304 Not Modified 服务器允许请求访问资源,但未满足条件。(协商缓存没有变化时,返回)
400 Bad Request 客户端请求报文存在语法错误
401 Unauthorized 需要认证
403 Forbidden 服务器拒绝
404 Not Found 服务器无法找到资源
500 Internal Server Error 服务器在执行请求时发生错误
503 Service Unavailable 服务器暂时超负载 或 停机维护
第五章 与HTTP协作的Web服务器
通信数据转发程序:代理、网关、隧道
这些将接收那台服务器发送的响应再转发给客户端
代理
接收由客户端发送的请求并转发给服务器,同时接收服务器返回的响应并转发给客户端
通过代理服务器,会增加via首部
缓存代理 预先将资源的副本(缓存)保存在代理服务器上
透明代理 不对报文做任何加工
隧道
确保客户端能与服务器进行安全的通信
第六章 HTTP首部
类型
通用首部 : 请求和响应都会用的首部
请求首部
响应首部
实体首部;请求和响应报文 实体部分使用的首部
Cache-Control
能够控制缓存的行为
表示能否缓存的指令
public,表示其他用户也可以利用缓存
Cache-Control:public
private 缓存服务器会对特定的用户提供资源缓存服务,对于其他用户发送的请求,代理服务器不会返回缓存。
Cache-Control:private
no-cache 目的:防止从缓存中返回过期的资源
Cache-Control:no-cache
客户端包含no-cache,表示客户端不会接收缓存过的响应。于是‘中间’缓存服务器必须把客户端请求转发给源服务器
服务器包含no-cache,那么缓存服务器不能对资源进行缓存。源服务器以后也将不再对缓存服务器请求中提出的资源有效性进行确认,且禁止其对响应资源进行缓存操作(若指定参数,则接收到该指定参数的首部后,不能使用缓存。即无参数的首部字段可以使用缓存)
控制可执行缓存的对象的指令 no-store
Cache-Control:no-store
规定缓存不能再本地存储请求或响应的任一部分,即不进行缓存
指定缓存期限和认证的指令
s-maxage
Cache-Control:s-maxage=604800(单位 秒)
适用于供多位用户使用的公共缓存服务器(对同一用户重复返回响应的服务器来说,这个指令无作用)
当使用s-maxage后,直接忽略Expires首部字段及max-age指令的处理。
max-age
Cache-Control:max-age=604800(单位 秒)
当客户端发送的请求中包含max-age时,如果判定缓存资源的缓存时间数值比指定时间的数值更小,那么客户端就接收缓存的资源。另外,当max-age为0,那么缓存服务器通常需要将请求转发给源服务器。
当服务器返回的响应中包含max-age时,缓存服务器将不对资源的有效性再做确认,而max-age数值代表资源保存为缓存的最长时间
min-fresh
Cache-Control:min-fresh=60(单位 秒)
要求缓存服务器返回至少还未过指定时间的缓存资源。
比如,当为60秒时,过了60秒的资源都无法作为响应返回了。
max-stale
Cache-Control:max-stale=3600(单位 秒)
表示缓存资源,即使过期也照常接收
如果没有指定参数数值,则无论多久,客户端都会接收响应。
如果指定具体数值,即使过期,只要处于max-stale指定时间内,客户端仍接收
only-if-cached
表示客户端仅在缓存服务器本地缓存目标资源的情况下才要求其返回。
即要求缓存服务器不重新加载响应,也不会确认资源有效性。
若发生请求缓存服务器的本地缓存无响应,则返回504
must-revalidate
代理会向源服务器再次验证即将返回的响应缓存目前是否仍然有效。
若代理无法连通源服务器再次获取有效资源,缓存必须给客户端一个504
使用must-revalidate会忽略max-stale指令
proxy-revalidate
指令要求所有的缓存服务器在接收到客户端带有该指令的请求返回响应之前,必须再次验证缓存的有效性。
no-transform
缓存不能改变实体主体的媒体类型,可防止缓存或代理压缩图片等类似操作。
cache-control扩展 cache-extension token
Cache-Control:private,community='UCI'
可以扩展cache-control首部字段内的指令
如上例,添加了community指令,如果缓存服务器不理解,则直接忽略。
Connection
作用:
- 控制不再转发给代理的首部字段
- 管理持久连接
http1.1 默认持久连接。客户端会在持久连接上连续发送请求。当服务端想明确断开连接时,则指定Connection首部字段为Close
http1.0 想要持久连接,则需指定Connection首部字段值为Keep-Alive
Date
表明创建http报文的日期和时间
Date: Tue, 03 Jul 2012 04:40:59 GMT
Pragma
是http1.1之前版本的遗留字段,仅作为与http1.0的向后兼容而定义
只用于客户端发送请求中。客户端要求所有中间服务器不返回缓存的资源。
(如果所有中间服务器都能以http1.1为基准,则直接用cache-control:no-cache,为了兼容会使用两个)
Cache-Control:no-cache Pragma: no-cache
Trailer
说明在报文主体之后记录了哪些首部字段,可应用于http1.1分块传输编码
Transfer-Encoding
规定传输报文主体时,采用的编码方式。
http1.1的传输编码方式仅对分块传输编码有效
Upgrade
用于检测http协议以及其他协议是可使用更高的版本进行,其参数值可以指定一个完全不同的通信协议。
使用时,connection要指定为upgrade
对于首部字段带有Upgrade的请求,服务器可用101返回
Via
为了追踪客户端与服务器之间的请求和响应报文的传输路径。
报文经过代理或网关时,会先在首部Via中附加该服务器的信息,然后在进行转发。
还可以避免请求回环的发生。
Warning
告知用户一些与缓存相关的问题的警告。
Accept
通知服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级。可使用type/subtype这种形式,一次指定多种媒体类型。
优先级:q=0~1 默认为1.0 最大
Accept-Charset
Accept-Encoding
Accept-Language
Authorization
告知服务器,用户代理的认证信息。通常,想要通过服务器认证的用户代理会在接收到返回的401状态码响应后,把首部字段Authorization首部字段加入请求。共用缓存在接收到含有该头部字段请求时的操作处理略有差异。
Expect
告知服务器,期望出现的某种特定行为。
From
告知服务器使用用户代理的用户的电子邮件地址
也可能将电子邮件地址记录在User-Agent首部字段
Host
虚拟主机运行在一个IP上,因此使用Host加以区分
告知服务器,请求资源所处的互联网主机名和端口号。在HTTP1.1中是唯一一个必须被包含在请求内的首部字段。
If-Match
If-XX为条件请求。服务器接收到带有条件的请求后,只有判断指定条件为真时,才会执行请求。
当If-Match和Etag匹配时,服务器才会接受请求。否则返回412
If-Modified-Since
如果在if-modified-since指定日期之后,资源变化,服务器会接受请求
如果没有更新,返回304
If-Modified-Since用于确认代理或客户端拥有本地资源的有效性。
last-modified 获取资源的更新日期时间
If-None-Match
和Etag不一致时,处理请求 与If-Match作用相反
在GET或HEAD方法中使用首部字段 If-None-Match 可获取最新的资源。
End-to-end和Hop-by-hop
Http首部字段将定义成缓存代理和非缓存代理的行为,分成2种类型。
端到端首部
此类别中首部会转发给请求/响应对应的最终接收目标,且必须保存在由缓存生成的响应中,且必须被转发。
逐跳首部
只对单次转发有效,会因通过缓存或代理而不再转发。http1.1和之后的版本中,如果使用hop-by-hop首部,需提供Connection首部字段。除以下这8个字段以外,其他都是端到端首部。
- Connection
- Keep-alive
- Proxy-Authorization
- Trailer
- TE
- Transfer-Encoding
- Upgrade