《图解HTTP》笔记
web网络基础
概述
- Web是建立在HTTP(超文本传输协议)上通信的
 - 通常使用的网络(包括互联网)是在TCP/IP基础上运作的,HTTP属于它的内部子集
 
TCP/IP协议
协议族
- 计算机与网络设备要相互通信,需要基于一套通信规则,这种规则被称为协议(protocol)
 - 协议族包括:IP,TCP,FTP,UDP,HTTP,SNMP,ICMP,PPPoE等等
 - TCP/IP是互联网相关各类协议族的总称
 
分层管理
应用层
- 向用户提供应用服务
 - FTP,DNS和HTTP属于该层
 
传输层
- 提供处于网络连接中的两台计算机之间的数据传输
 - TCP和UDP属于该层
 
网络层(网络互连层)
- 处理网络上的流动数据包
 - 数据包——网络传输的最小数据单位
 
链路层(数据链路层)
- 处理连接网络的硬件部分
 - 硬件设备(控制操作系统、设备驱动、网卡等)属于该层
 
通信传输流

- 利用TCP/IP协议族进行网络通信时,会通过分层顺序与对方通信
 - 发送端,从应用层往下走;接收端,则从链路层往上走
 - 发送端,在层传输时会打上所属层的首部信息;接收端,则会将每层的首部消息消去
 - HTTP请求示例
- 客户端(游览器)在应用层(HTTP协议)发送Web页面的HTTP请求
 - 传输层(TCP协议)把从应用层收到的数据(HTTP请求报文)进行分割,并在各个报文上打上标记序号及端口号后转发给网络层
 - 网络层(IP协议)增加作为通信目的地的MAC地址,然后转发给链路层
 - 接收端(服务器)在链路层接收到数据,按序往上层发送,一直到应用层(才算接收成功)
 
 
DNS
- 职责
- 域名解析
 
 - 位置
- 应用层
 
 - 作用
- 提供域名到IP地址之间的解析服务
 
 - 过程
 

TCP
- 职责
- 确保可靠性
 
 - 位置
- 传输层
 
 - 作用
- 提供可靠的字节流服务(将大块数据分割成以报文段为单位)
 - 确保数据能到达目标
 
 - 可靠性保证
- 三次握手
 
 

IP
- 职责
- 负责传输
 
 - 位置
- 网络层
 
 - 作用
- 把各种数据包传送给对方——涉及寻址,路由选择,网络转发
 - 负责分割和重编在传输层被分割的数据包
 
 - 传输保证
- 必须满足各类条件(其中突出的有IP地址和MAC地址)
 
 - IP地址/MAC地址
- IP地址指明了节点被分配到的地址,MAC地址是指网卡所属的固定地址
 - IP地址可以和MAC地址进行配对
 - IP间的通信依赖MAC地址
 
 - 过程
 

URI/URL
URI——统一资源标识符
- 用字符串标识某一互联网资源
 - 协议方案:http,ftp和tel等
 - 表示指定URI,需要涵盖全部必要信息的绝对URI、绝对URL和相对URL
 

URL——统一资源定位符
- 互联网资源的地点
 
过程

web服务器
概述
- 一台Web服务器可搭建多个独立域名的Web网站
 - 可作为通信路径上的中转服务器提升传输效率
 
实现多域名
- 单台虚拟主机可以实现多个域名
 - 即使物理层面只有一台服务器,但只要使用虚拟主机的功能,则可以假想已具有多台服务器
 - 域名解析出的ip一致时,发送HTTP请求时,须在Host首部内完整指定主机名或域名的URI
 
通信数据转发
- HTTP通信时,除客户端和服务器以外,还有一些用于通信数据转发的应用程序——代理、网关和隧道,它们配合服务器工作
 - 它们可以将请求转发给下一站服务器,并能接收服务器的响应转发给客户端
 
代理
- 转发功能的应用程序——负责转发请求给服务器,转发响应给客户端
 - 代理不改变请求URI,会直接发送给前方持有资源的目标服务器
 - 每次通过代理服务器转发请求或响应时,会追加写入Via首部信息
 - 在HTTP通信过程中,代理服务器是多台级联的
 

- 通过设置组织内部的代理服务器,可以针对特定URL做访问控制
 

- 代理有两种基准分类:是否使用缓存,是否会修改报文
 - 缓存代理
- 代理转发响应时,会预先将资源副本保存在代理服务器上
 - 当再次接收到对相同资源请求时,就直接将之前的缓存资源作为响应返回
 
 - 透明代理
- 转发请求或响应时,不对报文做任何加工
 - 反之,则被称为非透明代理
 
 
网关

- 网关是转发其他服务器通信数据的服务器,接收客户端请求时,它就像源服务器一样处理请求
 - 网关的工作机制和代理十分相似
 - 网关能使通信线路上的服务器提供非HTTP协议服务
 - 网关能提高通信的安全性
 
隧道

- 隧道可按要求建立起一条与其他服务器的通信线路,届时使用SSL等加密手段进行通信
 - 隧道本身不会去解析HTTP请求,而是原样中转给服务器
 - 隧道本身是透明的,客户端不用在意隧道的存在
 
保存资源的缓存
类型
- 缓存服务器(代理服务器的一种)对响应资源的缓存
 - 客户端对响应资源的缓存(本地磁盘上)
 
有效期
- 若浏览器判断缓存失效,则会再次向服务器请求新资源
 - 即使缓存服务器存在缓存,因为客户端的要求、缓存的有效期等因素,还是会向源服务器确认,及时请求,更新资源
 
HTTP协议/信息
概述
- 应用HTTP协议时,必定是一端担任客户端角色,另一端担任服务器端角色
 - HTTP协议,用于客户端和服务器端之间的通信,两者通过请求和响应的交换达成通信
 - HTTP协议,自身不对请求和响应之间的通信状态进行保存,cookie用于满足这个需求
 - HTTP协议,使用URI(统一资源标识符)让客户端定位互联网上的资源
 
URI定位资源

请求URI的方式

内容编码
- HTTP协议中有一种内容编码功能,负责对实体信息进行原样压缩
 - 内容编码,指明了应用在实体内容上的编码格式
 - 内容编码后的实体,由客户端接收并负责解码
 - 常用的内容编码——gzip,compress,deflate,identity(不进行编码)
 - 对于大的实体主体会进行分块传输编码
 
多部分对象集合
- HTTP协议采纳多部分对象集合机制(MIME),用于容纳多份(发送多种)不同类型的数据
 - 包含对象
- multipart/form-data——Web表单文件上传时使用
 - multipart/byteranges——包含多个范围的内容时使用
 
 
范围请求
- 获取部分内容的请求被称为范围请求,也就是继续未完成内容的一种请求形式
 - 执行范围请求时,会用到首部字段Range来指定资源的byte范围
 - 如果服务器端无法响应范围请求,则会直接返回200和完整实体内容
 
内容协商机制
- 指客户端和服务器端就响应资源内容进行交涉,然后提供给客户端最为适合的资源
 - 内容协商会以响应资源的语言、字符集、编码方式等作为判断的基准
 - 包含在请求报文中的某些首部字段就是判断的基准
- Accept
 - Accept-Charset
 - Accept-Encoding
 - Accept-Language
 - Content-Language
 
 - 内容协商技术
- 服务器驱动协商(Server-driven Negotiation)
- 以请求的首部字段为参考,在服务器端自动处理
 
 - 客户端驱动协商(Agent-driven Negotiation)
- 用户从浏览器显示的可选项列表中手动选择
 - 开发者利用js脚本在页面上自行选择
 
 - 透明协商(Transparent Negotiation)
- 由服务器端和客户端各自进行内容协商
 
 
 - 服务器驱动协商(Server-driven Negotiation)
 
HTTP状态/方法
类别
| 类别 | 原因短语 | |
|---|---|---|
| 1XX | Informational(信息性状态码) | 接收的请求正在处理 | 
| 2XX | Success(成功状态码) | 请求正常处理完毕 | 
| 3XX | Redirection(重定向状态码) | 需要进行附加操作以完成请求 | 
| 4XX | Client Error(客户端错误状态码) | 服务器无法处理请求 | 
| 5XX | Server Error(服务器错误状态码) | 服务器处理请求出错 | 
2xxx(成功)
| 状态码 | 描述 | 补充 | 
|---|---|---|
| 200 | 请求被正常处理 | 返回的信息会因method不同而有所改变 | 
| 204 | 请求处理成功,但无资源返回 | 不允许返回任何实体的主体 | 
| 206 | 成功处理了范围请求 | 响应报文中返回由Content-Range指定范围的内容 | 
3xxx(重定向)
| 状态码 | 描述 | 补充 | 
|---|---|---|
| 301 | 永久性重定向 | 表示请求的资源已被分配了新的URI | 
| 302 | 临时性重定向 | 已移动的资源对应的URI将来还会发生改变 | 
| 303 | 临时性建议重定向 | 请求资源存在另一个URI,应使用GET方法定向获取 | 
| 304 | 没有修改 | 资源已找到,但未符合条件请求 | 
| 307 | 临时重定向 | 遵照浏览器标准,不会从POST变成GET,302则不会 | 
4xxx(客户端错误)
| 状态码 | 描述 | 补充 | 
|---|---|---|
| 400 | 服务器不理解请求 | 表示请求报文中存在语法错误 | 
| 401 | 需要HTTP认证信息 | 1.响应必须包含一个WWW-Authenticate首部用以质询用户信息  2.当浏览器初次接收到401响应,会弹出认证用的对话窗口  | 
| 403 | 服务器拒绝请求 | 服务器端对于拒绝理由可附在实体主体部分 | 
| 404 | 未找到资源 | 也可在服务器端拒绝请求且不想说明理由时使用 | 
5xxx(服务器错误)
| 状态码 | 描述 | 补充 | 
|---|---|---|
| 500 | 服务器内部错误 | 服务端处理请求发生错误,或Web应用存在bug或临时故障 | 
| 502 | 错误网关 | 服务器作为网关或代理,从上游服务器收到无效响应 | 
| 503 | 服务器暂停服务 | - | 
| 504 | 网关超时 | 服务器作为网关或代理,但是没有及时从上游服务器收到请求 | 
方法
| 方法 | 说明 | 详细 | 
|---|---|---|
| GET | 获取资源 | - | 
| POST | 传输实体主体 | - | 
| PUT | 传输文件 | 1.在HTTP/1.1中不带验证机制,存在安全性问题  2.配合web应用验证机制和REST标准可以使用 3.较少使用  | 
| DELETE | 删除文件 | 同上 | 
| HEAD | 获得报文首部 | 1.和GET一样,只是不返回报文主体  2.用于确认URI的有效性及资源更新的日期时间等  | 
| OPTIONS | 询问支持的HTTP方法 | - | 
| TRACE | 追踪路径 | 1.让Web服务端将之前的请求通信环回给客户端  2.容易引发XST(跨站追踪)攻击  | 
| CONNECT | 要求用隧道协议连接代理 | 1.要求与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信  2.主要使用SSL(安全套接层)和TLS(传输层安全)协议,把通信内容加密后,经网络隧道传输  | 
HTTP报文
概述
- 用于HTTP协议交互的信息被称为HTTP报文
 - 客户端的报文叫请求报文,服务器端的报文叫响应报文
 - 大致分为报文首部和报文主体两块
 
报文结构


请求报文
- 由方法、URI、HTTP协议版本、请求首部字段和内容实体构成
 

响应报文
- 由HTTP协议版本、状态码,状态码原因短语、响应首部字段和响应主体构成
 

报文主体和实体主体
- 报文——HTTP通信中的基本单位,由8位组字节流组成
 - 实体——作为请求/响应的有效载荷数据被传输,由实体首部和实体主体组成
 - 报文主体,用于传输请求或响应的实体主体
 - 通常来说,报文主体等于实体主体
 - 只有当传输中进行编码操作时,实体主体的内容发生变化,才导致它和报文主体产生差异
 
HTTP首部
- 因HTTP版本或扩展规范的变化,首部字段可支持的字段内容略有不同,这里主要涉及HTTP/1.1 及常用的首部字段
 - HTTP 首部字段是可以自行扩展的。所以在Web服务器和浏览器的应用上,存在各种非标准的首部字段
 
HTTP首部字段
通用分类
| 类型 | 描述 | 补充 | 
|---|---|---|
| 通用首部字段 | 请求和响应都会用到的首部 | - | 
| 请求首部字段 | 客户端向服务器端发送请求报文时使用的首部 | 补充了请求的附加内容、客户端信息、响应内容相关优先级等信息 | 
| 响应首部字段 | 客户端向服务器端发送请求报文时使用的首部 | 补充了响应的附加内容,也会要求客户端附加额外的内容信息 | 
| 实体首部字段 | 客户端向服务器端发送请求报文时使用的首部 | 补充了资源内容更新时间等与实体有关的信息 | 
按缓存代理分类
HTTP首部字段将定义成缓存代理和非缓存代理的行为,分成2种类型
逐跳首部(Hop-by-hop)
- 只对单次转发有效
 - 会因通过缓存或代理而不再转发
 - HTTP/1.1+版本开始,逐跳首部首部的使用,需提供Connection首部字段
 - 包含的首部:Connection,Keep-Alive,Proxy-Authenticate,Proxy-Authorization,Trailer,TE,Transfer-Encoding,Upgrade
 
端到端首部(End-to-end)
- 必须被转发
 - 会转发给请求/响应对应的最终接收目标
 - 必须保存在由缓存生成的响应中
 - 包含的首部:其他所有
 
通用首部字段

Connection
- 控制不再转发给代理的首部字段
- 在客户端发送请求和服务器返回响应内,可控制不再转发给代理的首部字段
 - Connection: 不再转发的首部字段名
 
 - 管理持久连接
- HTTP/1.1版本的默认连接都是持久连接,当服务器端想明确断开连接时,则指定Connection首部字段的值为Close
 - HTTP/1.1之前的HTTP版本的默认连接都是非持久连接,想维持持续连接,则需要指定Connection首部字段的值为Keep-Alive
 
 
- 控制不再转发给代理的首部字段
 Date
- 表明创建HTTP报文的日期和时间
 
Pragma
- Pragma是HTTP/1.1之前版本的历史遗留字段,仅作为与HTTP/1.0的向后兼容而定义
 - 规范定义的形式唯一Pragma: no-cache,并且只用在客户端发送的请求中
 - 为了http版本的整体兼顾,通常会同时含有Cache-Control: no-cache和Pragma: no-cache
 
Trailer
- 表明在报文主体后记录了哪些首部字段
 - 应用在HTTP/1.1版本分块传输编码时
 
Transfer-Encoding
- 规定了传输报文主体时采用的编码方式
 - HTTP/1.1的传输编码方式,仅对分块传输编码有效
 
Upgrade
- 用于检测HTTP协议及其他协议是否可使用更高的版本进行通信
 - 参数值可以用来指定一个完全不同的通信协议
 - 对于附有首部字段Upgrade的请求,服务器可用101 Switching Protocols状态码作为响应
 
Via
- 用于追踪客户端与服务器之间的请求和响应报文的传输路径
 - 报文经过代理或网关时,会先在首部字段Via中附加该服务器的信息,然后再进行转发
 - Via不仅用于追踪报文的转发,还可避免请求回环的发生,因此必须在经过代理时附加该首部字段内容
 

- Warning
- 告知用户一些与缓存相关的问题的警告
 - 格式:Warning: [警告码][警告的主机:端口号]“[警告内容]”([日期时间])
 - 警告码具备扩展性,今后有可能追加新的警告码
 - HTTP/1.1中定义了7种警告
 
 

请求首部字段

Accept
- 告知服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级
 - 可使用type/subtype这种形式,一次指定多种媒体类型
 - 若想要给显示的媒体类型增加优先级,则使用q=来额外表示权重值,用分号(;)进行分隔,权重值q的范围是0~1,不指定权重q值时,默认权重为q=1.0
 
Accept-Charset
- 告知服务器,用户代理支持的字符集及字符集的相对优先顺序
 - 可一次性指定多种字符集
 - 与首部字段Accept相同的是,按权重值q来表示相对优先级
 
Accept-Encoding
- 告知服务器,用户代理支持的内容编码及内容编码的优先级顺序
 - 可一次性指定多种内容编码
 - 与首部字段Accept相同的是,按权重值q来表示相对优先级
 - 可使用星号(*)作为通配符,指定任意的编码格式
 
Accept-Language
- 告知服务器,用户代理能够处理的自然语言集及自然语言集的相对优先级
 - 可一次指定多种自然语言集
 - 与首部字段Accept相同的是,按权重值q来表示相对优先级
 
Authorization
- 告知服务器,用户代理的认证信息(证书值)
 - 通常,想要通过服务器认证的用户代理会在接收到返回的401状态码响应后,把首部字段Authorization加入请求中
 - 共用缓存在接收到含有Authorization首部字段的请求时的操作处理会略有差异
 
Expect
- 告知服务器,期望出现的某种特定行为
 - 因服务器无法理解客户端的期望作出回应而发生错误时,会返回状态码417 Expectation Failed
 
From
- 告知服务器,使用用户代理的用户的电子邮件地址
 - 通常其使用目的就是为了显示搜索引擎等用户代理的负责人的电子邮件联系方式
 - 使用代理时,应尽可能包 From首部字段(但可能会因代理不同,将电子邮件地址记录在User-Agent首部字段内)
 
Host
- 告知服务器,请求的资源所处的互联网主机名和端口号
 - Host首部字段在HTTP/1.1规范内是唯一一个必须被包含在请求内的首部字段
 - 由于相同IP地址下可能部署运行着多个域名,可通过host字段来理解域名对应的请求
 
If-Match
- 形如If-xxx这种样式的请求首部字段,都可称为条件请求
 - 服务器接收到附带条件的请求后,只有判断指定条件为真时,才会执行请求
 - 服务器会比对If-Match的字段值和资源的ETag值,仅当两者一致时,才会执行请求
 - 可以使用星号(*)指定If-Match的字段值,服务器将会忽略ETag的值,只要资源存在就处理请求
 
If-None-Match
- 与If-Match首部字段的作用相反
 - 只有在If-None-Match字段值与ETag值不一致时,才告知服务器处理该请求
 - 在GET或HEAD方法中使用首部字段If-None-Match可获取最新的资源
 
If-Modified-Since
- 该字段指定的日期时间后,如果资源发生了更新,服务器会接受请求;反之,则返回304响应
 - 用于确认代理或客户端拥有的本地资源的有效性
 - 获取资源的更新日期时间,可通过确认首部字段Last-Modified来确定
 
If-Unmodified-Since
- 与If-Modified-Since的作用相反
 - 告知服务器,指定的请求资源只有在字段值内指定的日期时间之后,未发生更新的情况下,才能处理请求
 - 如果在指定日期时间后发生了更新,则以状态码412 Precondition Failed作为响应
返回 
Range
- 可告知服务器资源的指定范围,用于获取部分资源的范围请求
 - 接收到附带Range首部字段请求的服务器,会在处理请求之后返回状态码为206 Partial Content的响应;
 - 服务器无法处理范围请求时,则返回全部
 
If-Range
- 告知服务器若If-Range字段值(ETag值或时间)和请求资源的ETag值或时间相一
致时,则作为范围请求处理。反之,则返回全体资源 - 服务器端的资源如果更新,那客户端持有资源中的一部分也会随之无效,服务器会要求客户端重新请求,以返回全部最新的资源。这种情况下,客户端需要2次请求才能更新资源
 
- 告知服务器若If-Range字段值(ETag值或时间)和请求资源的ETag值或时间相一
 Max-Forwards
- 该字段以十进制整数形式指定可经过的服务器最大数目
 - 没转发一次请求,该字段值减1,当值为0是,不再转发,直接响应
 - 可以一定程度掌握传输路径的通信状况
 
Proxy-Authorization
- 接收到从代理服务器发来的认证质询时,客户端会发送包含首部字段
Proxy-Authorization的请求,以告知服务器认证所需要的信息 - 与客户端和服务器之间的HTTP访问认证相类似,不同之处在于,认证行为发生在客户端与代理之间
 
- 接收到从代理服务器发来的认证质询时,客户端会发送包含首部字段
 Referer
- 告知服务器,请求的原始资源的URI
 
TE
- 告知服务器,客户端能够处理响应的传输编码方式及相对优先级
 - 和首部字段Accept-Encoding的功能很相像,但是用于传输编码
 - 还可以指定伴随trailer字段的分块传输编码的方式
 
User-Agent
- 用于传达浏览器的种类
 - 会将创建请求的浏览器和用户代理名称等信息传达给服务器
 
响应首部字段

Accept-Ranges
- 告知客户端,服务器是否能处理范围请求
 - 可指定的字段值有两种,可处理范围请求时指定其为bytes,反之则为none
 
Age
- 告知客户端,源服务器在多久前响应过
 - 字段值的单位为秒
 - 若创建该响应的服务器是缓存服务器,Age值是指缓存后的响应再次发起认证到认证完成的时间值
 - 代理创建响应时必须加上首部字段Age
 
ETag
- 告知客户端,实体标识——1种可将资源以字符串形式做唯一性标识的方式
 - 服务器会为每份资源分配对应的ETag值
 - 当资源更新时,ETag值也需要更新
 - 资源被缓存时,就会被分配唯一性标识
 - ETag中有强ETag值和弱ETag值之分
- 强ETag值,不论实体发生多么细微的变化都会改变其值
 - 弱ETag值,只用于提示资源是否相同。只有资源发生了根本改变,产生差异时才会改变ETag值
 
 
Location
- 将响应接收方引导至某个与请求URI位置不同的资源(重定向)
 - 几乎所有的浏览器在接收到包含首部字段Location的响应后,都会强制性地尝试对已提示的重定向资源的访问
 
Proxy-Authenticate
+
实体首部字段

Cache-Control首部字段
概述
- 通过使用首部字段Cache-Control能够控制缓存的行为,用于请求和响应时
 - Cache-Control指令的参数是可选的,多个指令之间通过“,”分隔
 
    Cache-Control: private, max-age=0, no-cache
Cache-Control指令一览


表示是否能缓存的指令
- public
- 表明其他用户也可利用缓存
 
 - private
- 只对特定用户提供资源缓存服务
 
 - no-cache
- 防止从缓存中返回过期的资源
 - 由客户端发出,强制向源服务器验证,不接收缓存服务器的缓存响应
 - 由服务器返回,源服务器不再向缓存服务器确认资源有效性,缓存服务器不能对资源进行缓存
 - 如果服务器对no-cache设置参数值,则客户端被禁止使用缓存
 
 
控制可执行缓存的对象的指令
- no-store
- 该指令规定,缓存不能在本地存储请求或响应的任一部分
 - 使用no-store指令,暗示请求或响应中包含机密信息
 - no-cache代表不缓存过期的资源,no-store才是真正地不进行缓存
 
 
指定缓存期限和认证的指令
- s-maxage
- 只适用于供多位用户使用的公共缓存服务器
 - 使用s-maxage指令后,会忽略对Expires首部字段及max-age指令处理
 
 - max-age
- 由客户端发出,判定缓存资源的缓存时间数值小于指定时间,客户端就接收缓存资源
 - 由服务器返回,缓存服务器将不对资源的有效性再作确认
 
 - min-fresh
- 要求缓存服务器返回至少还未过指定时间的缓存资源
 
 - max-stale
- 指示缓存资源,即使过期也照常接收
 - 如果指令未指定参数值,那么无论经过多久,客户端都会接收响应
 - 如果指令中指定参数值,那么即使过期,只要仍处于max-stale的指定时间内,仍旧会被客户端接收
 
 - only-if-cached
- 表示客户端仅在缓存服务器本地缓存目标资源的情况下才会要求其返回
 - 该指令要求缓存服务器不重新加载响应,也不会再次确认资源有效性
 - 若发生请求缓存服务器的本地缓存无响应,则返回状态码504 Gateway Timeout
 
 - must-revalidate
- 代理会向源服务器再次验证即将返回的响应缓存目前是否仍然有效
 - 若代理无法连通源服务器再次获取有效资源的话,缓存必须给客户端一条504状态码
 - 使用must-revalidate指令会忽略请求的max-stale指令
 
 - proxy-revalidate
- 要求所有缓存服务器在接收到客户端带有该指令的请求返回响应之前,必须再次验证缓存的有效性
 
 - no-transform
- 无论是在请求还是响应中,缓存都不能改变实体主体的媒体类型
 - 可防止缓存或代理压缩图片等类似操作
 
 
Cookie相关首部字段
- Set-Cookie
- 多字段属性使用
 - 字段属性列表如下
 
 
| 属性 | 说明 | 
|---|---|
| NAME=VALUE | 赋予 Cookie的名称和其值(必需项) | 
| expires=DATE | Cookie的有效期(若不明确指定则默认为浏览器关闭前为止) | 
| path=PATH | 将服务器上的文件目录作为Cookie的适用对象(若不指定则默认为文档所在的文件目录 | 
| domain=域名 | 作为Cookie适用对象的域名 (若不指定则默认为创建Cookie的服务器的域名) | 
| Secure | 仅在HTTPS安全通信时才会发送Cookie | 
| HttpOnly | 加以限制,使Cookie不能被JavaScript脚本访问 | 
- Cookie
- 接收到多个Cookie时,同样可以以多个Cookie形式发送
 
 
其他首部字段
X-Frame-Options
- 属于HTTP响应首部
 - 主要用于防止点击劫持攻击
 - 控制网站内容在其他Web网站的Frame标签内的显示问题
 - 可指定2个字段值
- DENY:拒绝
 - SAMEORIGIN:仅同源域名下的页面
 
 
X-XSS-Protection
- 属于HTTP响应首部
 - 主要用于防止跨站脚本攻击(XSS)
 - 用于控制浏览器XSS防护机制的开关
 - 可指定2个字段值
- 0:将 XSS 过滤设置成无效状态
 - 1:将 XSS 过滤设置成有效状态
 
 
DNT
- 属于HTTP请求首部
 - 意为拒绝个人信息被收集
 - 表示拒绝被精准广告追踪的一种方法
 - 可指定2个字段值
- 0:同意被追踪
 - 1:拒绝被追踪
 
 
P3P
- 属于HTTP响应首部
 - 主要用于保护用户隐私
 - 利用P3P技术让个人隐私变得仅供程序理解
 - 实现步骤
- 步骤 1:创建P3P隐私
 - 步骤 2:创建P3P隐私对照文件后,保存命名在/w3c/p3p.xml
 - 步骤 3:从P3P隐私中新建Compact policies后,输出到HTTP响应中
 
 
HTTPS
- 解决通信安全问题
 
HTTP缺点
通信使用明文,内容可能会被窃听
解决办法
HTTP通信加密 => 使用SSL建立安全通信线路
报文内容加密 => 客户端和服务端统一套内容的加密/解密机制
不验证通信方的身份,因此有可能遭遇伪装
解决办法
- 加入SSL层,验证来源证书
 
无法证明报文的完整性,所以有可能已遭篡改
解决办法
MD5和SHA-1等散列值校验
数字签名方法
何为HTTPS
HTTP + SSL = HTTPS
HTTP + ( 加密 + 认证 + 完整性保护 ) = HTTPS
身披SSL协议外壳的HTTP,即是HTTPS

TSL也是以SSL为原型开发的协议,有时会统一称该协议为SSL
HTTPS采用混合加密机制 ( 共享密钥加密 + 公开密钥加密 )
HTTPS运用到的密匙需要数字证书认证机构通过
HTTPS缺点
基于SSL的HTTPS的通信速度比HTTP要慢2~100倍
通信慢 => SSL协议通信增加了整体上处理通信量
处理速度慢 => SSL涉及加密处理,服务器/客户端都要进行加密/解密运算,导致负载增强
解决办法 => SSL加速器(专用服务器)硬件能一定程序上提高通信速度
免费的证书不多,会有证书购买的费用
HTTP认证
- 解决身份认证问题
 
认证方式
BASIC 认证(基本认证)
DIGEST 认证(摘要认证)
SSL 客户端认证
FormBase 认证(基于表单认证)
Keberos 认证
NTLM 认证
BASIC认证
使用上不够便捷灵活
直接发送明文,安全性等级不够,不太常用


DIGEST认证
使用质询/响应的方式
一定程度上提高了安全性
提供了防止密码被窃听的保护机制,但并不存在防止用户伪装的保护机制
使用上仍然局限,因此适用范围也有所受限


SSL客户端认证
SSL客户端认证是借由HTTPS的客户端证书完成认证的方式
搭建时需要先将客户端证书分发给客户端,且客户端必须安装此证书
采用双因素认证(与表单认证组合使用)
因为用到证书,会产生一定的证书费用
表单认证
该方法并属于在HTTP协议中定义的,以客户端向服务器发送登录信息的结果认证
根据Web应用程序的实际安装,提供的用户界面及认证方式也各不相同
由于使用上的便利性及安全性问题,认证多半为基于表单认证
基于表单认证的标准规范尚未有定论,一般会使用Cookie来管理Session,实现认证

HTTP追加协议
- 解决协议不足的问题(拓展协议的能力)
 
HTTP瓶颈
一条连接上只可发送一个请求
请求只能从客户端开始(客户端不可以接收除响应以外的指令)
请求/响应首部未经压缩就发送(首部信息越多延迟越大)
发送冗长的首部(每次互相发送相同的首部造成的浪费较多)
可任意选择数据压缩格式(非强制压缩发送)

- Ajax的解决办法
 

- Comet的解决办法
 

- Ajax和Comet提高了易用性,却没根本上解决HTTP协议本身的限制
 
SPDY
没有完全改写HTTP协议,而是在应用层与运输层之间新加会话层来运作
考虑到安全性问题,SPDY规定通信中必须使用SSL

SPDY对HTTP的功能拓展
多路复用 => 单一TCP连接,可以无限制处理多个HTTP请求
请求优先级 => 可以给请求逐个分配优先级顺序
HTTP首部压缩 => 数据包数量和发送字节数减少了
推送功能 => 支持服务器主动向客户端推送数据
服务器提示 => 服务器可以主动提示客户端请求所需的资源
SPDY技术应用进展不佳
- 只是单域名通信的多路复用,当1个Web站上使用多个域名资源,改善效果就会受限
 
WebSocket
建立在HTTP基础上的协议,属于浏览器与服务器之间的全双工通信标准
协议由IETF定为标准,WebSocket API由W3C定为标准
一旦建立起WebSocket通信连接,之后会一直保持连接状态
不论服务器还是客户端,任意一方都可直接向对方发送报文
协议的功能特点
推送功能 => 支持服务器主动向客户端推送数据
减少通信量 => 由于WebSocket首部信息很小,通信量也相应减少了
在HTTP连接建立之后,需要完成一次“握手”的步骤

HTTP2.0
可以说是SPDY的升级版,其实原本也是基于SPDY设计的
与HTTP1.x相比
新的二进制格式
多路复用
HTTP首部压缩
服务端推送
更安全的SSL
WebDAV
作为HTTP/1.1协议的扩展定义在RFC4918
一个可对Web服务器上的内容直接进行文件复制、编辑等操作的分布式文件系统
除了创建、删除文件等基本功能,还具备文件加锁,对文件内容修改的版本控制功能

WebDAV扩展概念
集合
资源
属性
锁
WebDAV新增方法
PROPFIND :获取属性
PROPPATCH :修改属性
MKCOL :创建集合
COPY :复制资源及属性
MOVE :移动资源
LOCK :资源加锁
UNLOCK :资源解锁
WebDAV状态码
102:可正常处理请求,但目前是处理中状态
207:存在多种状态
422:格式正确,内容有误
423:资源已被加锁
424:处理与某请求关联的请求失败,因此不再维持依赖关系
507:保存空间不足
WebDAV通信示例


《图解HTTP》笔记的更多相关文章
- HTML+CSS笔记 CSS笔记集合
		
HTML+CSS笔记 表格,超链接,图片,表单 涉及内容:表格,超链接,图片,表单 HTML+CSS笔记 CSS入门 涉及内容:简介,优势,语法说明,代码注释,CSS样式位置,不同样式优先级,选择器, ...
 - CSS笔记--选择器
		
CSS笔记--选择器 mate的使用 <meta charset="UTF-8"> <title>Document</title> <me ...
 - HTML+CSS笔记 CSS中级 一些小技巧
		
水平居中 行内元素的水平居中 </a></li> <li><a href="#">2</a></li> &l ...
 - HTML+CSS笔记 CSS中级 颜色&长度值
		
颜色值 在网页中的颜色设置是非常重要,有字体颜色(color).背景颜色(background-color).边框颜色(border)等,设置颜色的方法也有很多种: 1.英文命令颜色 语法: p{co ...
 - HTML+CSS笔记 CSS中级 缩写入门
		
盒子模型代码简写 回忆盒模型时外边距(margin).内边距(padding)和边框(border)设置上下左右四个方向的边距是按照顺时针方向设置的:上右下左. 语法: margin:10px 15p ...
 - HTML+CSS笔记 CSS进阶再续
		
CSS的布局模型 清楚了CSS 盒模型的基本概念. 盒模型类型, 我们就可以深入探讨网页布局的基本模型了.布局模型与盒模型一样都是 CSS 最基本. 最核心的概念. 但布局模型是建立在盒模型基础之上, ...
 - HTML+CSS笔记 CSS进阶续集
		
元素分类 在CSS中,html中的标签元素大体被分为三种不同的类型:块状元素.内联元素(又叫行内元素)和内联块状元素. 常用的块状元素有: <div>.<p>.<h1&g ...
 - HTML+CSS笔记 CSS进阶
		
文字排版 字体 我们可以使用css样式为网页中的文字设置字体.字号.颜色等样式属性. 语法: body{font-family:"宋体";} 这里注意不要设置不常用的字体,因为如果 ...
 - HTML+CSS笔记 CSS入门续集
		
继承 CSS的某些样式是具有继承性的,那么什么是继承呢?继承是一种规则,它允许样式不仅应用于某个特定html标签元素,而且应用于其后代(标签). 语法: p{color:red;} <p> ...
 - HTML+CSS笔记 CSS入门
		
简介: </span>年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的<span>脚本解释程序</span>,作为ABC语言的一种继承. & ...
 
随机推荐
- python随用随学20200220-异步IO
			
啥是异步IO 众所周知,CPU速度太快,磁盘,网络等IO跟不上. 而程序一旦遇到IO的时候,就需要等IO完成才能进行才能进行下一步的操作. 严重拖累了程序速度. 因为一个IO操作就阻塞了当前线程,导致 ...
 - C# 利用委托事件进行窗体间的传值(新手必看)
			
引言: 窗体间传值是每个学习WinForm新手的常见问题,最初级的方法就是 在窗体中先获取到要接受值窗体.然后通过.得到某个空间或者属性,直接赋值,这个需要接收放的窗体属性或者空间必须是public ...
 - java设计模式1——单例模式
			
java设计模式1--单例模式 1.单例模式介绍 1.1.核心作用:保证一个类只有一个实例,并且提供一个访问该实例的全局访问点 1.2.常见场景 1.3.单例模式的优点 1.4.常见的五种单例模式实现 ...
 - Cesium案例解析(六)——3DTilesInspector监视器
			
目录 1. 概述 2. 案例 1. 概述 3D Tiles作为传输和渲染大规模3D地理空间数据的格式,应对的都是大规模数据的场景,Cesium提供了一个监视3D Tiles数据的监视器,可以通过这个监 ...
 - Spring Boot从入门到精通(一)搭建第一个Spring Boot程序
			
Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.通过 ...
 - system.run
			
客户端开启了remotecommand后可以在server调用该命令在agent上执行一些命令 命令中有逗号 zabbix_get -s xxx.xxx.xxx.xxx -k "system ...
 - PMP-番外篇-PMP工具与技术目录
			
########################################################### 这里先总结所有工具和技术,让大家有一个整体的概念. 也可以当作一个工具和技术查询 ...
 - NB-Iot和GPRS信号通信模式的对比
			
NB-Iot和GPRS信号通信模式的对比
 - Java 【Math】
			
一.Math类的使用方法 public class demo{ public static void main(String[] args){ double pi = Math.PI; //Math函 ...
 - RocketMQ幂等性问题
			
什么是幂等性: 在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同. 当出现消费者对某条消息重复消费的情况时,重复消费的结果与消费一次的结果是相同的,并且多次消费并未对业务系 ...