HTTP图解_学习笔记
一.与HTTP关系密切的协议:IP、TCP、DNS
IP协议 网络层
- ARP(Address Resolution Protocol)即地址解析协议, 用于实现从 IP 地址到 MAC 地址的映射,即询问目标IP对应的MAC地址。
- 在网络通信中,主机和主机通信的数据包需要依据OSI模型从上到下进行数据封装,当数据封装完整后,再向外发出。所以在局域网的通信中,不仅需要源目IP地址的封装,也需要源目MAC的封装。
- 一般情况下,上层应用程序更多关心IP地址而不关心MAC地址,所以需要通过ARP协议来获知目的主机的MAC地址,完成数据封装。
TCP协议 传输层
三次握手
- 客户端发送SYN标志数据包(synchronize,[ˈsɪŋkrənaɪz] 同步)
- 服务端回传SYN/ACK标志数据包
- 客户端发送ACK标志数据包(acknowledge,[əkˈnɒlɪdʒ],确认收到)
DNS协议 应用层
- 域名-IP地址解析
- ip-反查域名
二.HTTP1.0与HTTP1.1
keep-alive:支持pipeline(不等待响应结果,连续发送请求)
- HTTP1.1:所有连接默认
- HTTP1.0:未标准化
三.HTTP报文
请求报文 | 响应报文 |
---|---|
请求行:方法、URI、版本 | 状态行:版本、状态码、描述 |
请求头:请求字段、通用字段 | 响应头:响应字段、通用字段 |
请求正文 | 响应主体 |
四.Cookie
Cookie由来:HTTP协议是无状态协议,无法保存请求记录
Cookie流程
- 客户端发送请求,服务端生成Cookie,在响应报文中 Set-Cookie返回
- 客户端发送带Cookie请求、服务端检查Cookie,得到历史状态信息
Set-Cookie
当服务器准备开始管理客户端的状态时,会事先告知各种信息。
-
NAME=VALUE(必填)
赋予Cookie的名称和其值
-
expires=DATE
Cookie的有效期(若不明确指定则默认为浏览器关闭为止)
-
path=PATH
将服务器上的文件目录作为Cookie的适用对象(若不指定则默认为文档所在的文件目录)
-
domain=域名
作为Cookie适用对象的域名(若不指定则默认为创建Cookie的服务器的域名)
-
Secure
仅在HTTPS安全通信时才会发送Cookie
-
HttpOnly
加以限制,使Cookie不能被JavaScript脚本访问
Cookie
当客户端想获得HTTP状态管理支持时,就会在请求中包含从服务器接收到的Cookie。
五.状态码
六.代理、网关、隧道
HTTP通信时,除客户端和服务器,还有一些用于通信数据转发的应用程序,例如代理、网关和隧道。他们可以配合服务器工作。
1. 代理
- 扮演“中间人”的角色,接收客户端请求转发给服务器,同时也接收服务器返回响应转发给客户端。
- 代理转发时,需要附加Via首部字段以标记出经过的主机信息。
- 缓存代理:代理转发响应时,缓存代理会预先将响应缓存在代理服务器。下次接收到相同资源请求不经过资源服务器,直接返回缓存响应。
- 透明代理:转发请求或响应时,不对报文做任何加工的代理类型
2. 网关
客户端以HTTP协议通信获取网关响应。网关和服务器之间可以采用非HTTP协议服务,如SQL语句。
3.隧道
隧道可按要求建立起一条与其他服务器的通信线路,届时使用SSL等加密手段进行通信。
七.首部字段
1.通用首部
请求和响应都要用到的首部字段
-
Cache-Contronl
控制缓存的行为:指令的参数是可选的,多个指令之间通过“,”分隔。
-
Connection
- 控制不再转发的首部字段
- 管理持久连接
-
Date
创建HTTP报文的日期和时间。
-
Pragma
HTTP /1.1之前版本控制缓存的字段
-
Trailer
说明在报文主体后记录了哪些首部字段。该首部字段可应用在HTTP/1.1版本分块传输编码。
-
Transfer-Encoding
规定了传输报文主体时采用的编码方式,HTTP/1.1的传输编码方式仅对分块传输编码有效。
-
Upgrade
用于检测HTTP协议是否可使用更高的版本进行通信,其参数值可以指定一个完全不同的通信协议。
该参数仅作用于客户端与邻接服务器,因此还需指定Connection:Upgrade
-
Via
使用Via是为了跟踪客户端与服务器之间的请求响应和响应报文的传输路径。
-
Warning
HTTP/1.0的首部(Retry-After)演变而来,通常会告知用户与缓存相关的问题警告。
2. 请求首部字段
请求首部字段是从客户端往服务器端发送请求报文中所使用的字段,用于补充请求的附加信息、客户端信息、对响应内容相关的优先级等内容。
-
Accept
Accept首部字段可通知服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级。可使用type/subtype这种形式,一次指定多种媒体类型。
-
Accept-Charset
用来通知服务器用户代理支持的字符集的相对优先顺序。
-
Accept-Encoding
用来告知服务器用户代理支持的内容编码及内容编码的优先级顺序。
-
Accept-Language
用来告知服务器用户代理能够处理的自然语言集(指中文或英文等),以及自然语言的相对优先级。
-
Authorization
用来告知服务器,用户代理的认证信息(证书值)。
-
Except
用来告知服务器,客户端期望出现的某种特定行为。
-
From
用来告知服务器使用用户代理的用户的电子邮件地址。
-
Host
告知服务器,请求的资源所处的互联网主机名和端口号。
-
If-Match
条件请求,服务器接收到附带条件的请求后,只有判断指定条件为真时,才会执行请求。
-
If-None-Match
条件请求,该字段实体标记(Etag)值与请求资源的Etag不一致时,才会执行请求。
-
If-Modified-Science
条件请求,告知服务器若该字段值早于资源的更新时间,则处理。否则返回304 Not Modified。
-
If-Unmodified-Since
条件请求,告知服务器只有在指定时间后未发生更新,才处理。否则返回412 Precondition Failed.
-
If-Range
条件请求,若字段值与资源Etag一致,则作为范围请求处理。反之,返回全体资源。
-
Max-Forwards
TRACE/OPTIONS方法字段:标明可经过服务器的最大数目。每转发一次减一,为0时直接返回响应。
-
Proxy-Authorization
接收代理服务器的认证咨询时,客户端发送该字段。告知服务器认证所需要的信息。
-
Range
告知服务器获取指定范围资源。服务器处理成功返回206 Parartial Content,无法处理返回200及全部资源。
-
Referer
告知服务器请求的原始资源URI
-
TE
指定传输编码及优先级,也可指定伴随trailer字段的分块传输编码方式。
-
User-Agent
将创建请求的浏览器和用户代理名称等信息传达给服务器。
3. 响应首部字段
响应首部字段是由服务器端向客户端返回响应报文中所使用的字段,用于补充响应的附加信息、服务器信息,以及对客户端的附加要求等信息。
-
Accept-Ranges
告知客户端是否能处理范围请求。可处理返回bytes,反之指定None.
-
Age
告知客户端源服务器在多久前创建了响应。字段值的单位为秒。
若为缓存服务器,则代表缓存后的响应再次发起认证到认证完成的时间。
代理创建响应必须加此字段。
-
ETag
可将资源以字符串形式做唯一性标识的方式。资源更新时ETag也更新。
-
Location
将响应接收方引至某个与请求位置URI不同的资源。配合3XX,返回重定向URI。
-
Proxy-Authenticate
将代理服务器所要求的认证信息发送给客户端。
-
Retry-After
告知客户端该多久后再次发送请求。配合503 3xx响应一起使用。
-
Server
告知客户端当前服务器上安装的HTTP服务器应用程序信息。
-
Vary
对缓存进行控制,源服务器会向代理服务器传达关于本地缓存使用方法的命令。
-
WWW-Authenticate
用于HTTP访问认证,告知客户端用于访问请求URI所指定资源的认证方案和带参数提示的质询。
4. 实体首部字段
实体首部字段是包含在请求报文和响应报文中的实体部分所使用的首部,用于补充内容的更新时间等与实体相关的信息。
-
Allow
用于通知客户端能够支持请求URI指定资源的所有方法。
-
Content-Encoding
告知客户端服务器对实体的主体部分选用的内容编码方式。(gzip\compress\deflate\identify)
-
Content-Language
告知客户端实体主体使用的自然语言。
-
Content-Length
表明实体主体部分的大小,单位是字节。
-
Content-Location
给出与报文主体部分相对应的URI。
-
Content-MD5
MD5值,用于检查报文主体在传输过程中是否保存完善,以及确认传输到达。
-
Content-Range
针对范围请求的响应。告知客户端实体的哪个部分符合范围请求。
-
Content-Type
说明了实体主体内对象的媒体类型。
-
Expires
会将资源失效的日期告知客户端。
-
Last-Modified
指明资源最终修改的时间。
5. 其他首部字段
HTTP首部字段是可以自行扩展的。所以在Web服务器和浏览器的应用上,会出现个中非标准的首部字段。
-
X-Frame-Options
属于响应首部,用于控制网站内容在其他Web网站的Frame标签内的显示问题。只要是为了防止点击劫持攻击。
DENY:拒绝
SAMEORIGIN:仅同源域名下的页面匹配时许可。
-
X=XSS-Protection
属于HTTP响应首部,是针对跨站脚本攻击(XSS)的一种对策,用于控制浏览器XSS防护机制的开关。
0:将XSS过滤设置成无效状态
1:将XSS过滤设置成有效状态
-
DNT
属于请求首部,是Do Not Track的简称。意为拒绝个人信息被收集,是表示拒绝精准广告追踪的一种方法。
0:同意被追踪
1:拒绝被追踪
-
P3P
属于响应首部,通过利用P3P技术,可以让Web网站上的个人隐私变成一种仅供程序可理解的形式,以达到保护用户隐私的目的。
要进行P3P的设定,需以下几个步骤
步骤一:创建P3P隐私。
步骤二:创建P3P隐私对照文件后,保存命名在/w3c/p3p.xml。
步骤三:从P3P隐私中新建Compact policies后,输出到HTTP响应中。
八. HTTPS
-
HTTP缺点
HTTP属于未加密协议,存在以下问题
- 通信使用明文(不加密),内容可能会被窃听。
- 不验证通信方的身份,因此有可能遭遇伪装
- 无法证明报文的完整性,所以有可能已遭篡改
拟定解决方案:Failed
内容加密:对报文主体进行加密解密。(仍存在篡改风险)
PGP数字签名及MD5和SHA-1校验方法(仍存在PGP及MD5本身被篡改)
HTTPS解决方案:HTTP+SSL+认证+完整性保护
通信加密:SSL(安全套接层)或TLS(安全层传输协议)的组合使用
使用SSL证书
-
SSL混合加密:公开密钥+共享秘钥
公开秘钥:仅公布加密钥匙、保留解密钥匙(安全、但速度慢)
共享秘钥:加密解密使用同一个秘钥(速度快但不安全)
SSL加密:
- 利用对方对应的公开秘钥加密共享秘钥
- 双方收到后用私有秘钥解密共享秘钥
- 双方开始用共享秘钥加密传输
-
证书
- 证明组织真实性的EV SSL证书
- 确认客户端的客户端证书
-
HTTPS安全通信机制
SSL第一次握手
1、客户端发送建立SSL信息
2、服务器返回建立SSL信息
3、服务器返回公开秘钥
4、服务器返回完成指令
SSL第一次握手结束
SSL第二次握手
5、客户端发送公开秘钥加密的共享秘钥
6、客户端发送更换加密方式为共享秘钥的指令
7、客户端发送完成指令
SSL第二次握手结束
SSL第三次握手
8、服务器发送更换加密方式为共享秘钥的指令
9、服务器发送完成指令
SSL三次握手结束、SSL连接建立完成
之后的通信开始进行应用层协议的通信,即HTTP请求