《图解HTTP》大纲

基础

HTTP:HyperText Transfer Protocol

URI 和 URL

URI(Uniform Resource Identifier) 统一资源标识符;URL(Uniform Resource Locator) 统一资源定位符。

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

URI 的实例:

长连接短连接

TCP 连接三次握手

  • 客户端先发送一个带 SYN(synchronize) 标志的数据包
  • 服务端返回一个带有 SYN/ACK 标志的数据包给客户端
  • 最后客户端再回传一个带 ACK(acknowledgement) 标志的数据包

初期 HTTP 请求一次后,就断开了 TCP 连接。后来请求的资源越来越多,每次请求都要重新建立连接,三次握手,增加了开销。

HTTP/1.1 默认都是长连接,一来降低了服务器的负载,二来省去重复建立连接的时间,响应速度更快。因为持久连接,所以多个请求可以并行发送,不需要一个等一个,再次提高了速度。

无状态协议和 Cookie

HTTP 是一种不保存状态的协议,不对请求和响应内容做持久化处理。减少了服务器 CPU 和内存的消耗,可以更快地处理大量事务,确保协议的可伸缩性。

比如登陆后想一直保留这个登陆状态,引入 Cookie 技术

  • 如果服务端响应报文中有 Set-Cookie 字段,通知客户端保持 Cookie,那么下次客户端再往服务端发送请求时,就会在请求报文中加入 Cookie 值再发送出去。
  • 服务端收到 Cookie 后,会去检查室哪一个客户端发过来的请求,然后对比服务器,得到之前的状态信息

请求方法

  1. GET
    • 请求已被 URI 识别的资源
    • 指定的资源经服务端解析后返回响应内容。
  2. POST
    • 用来传输实体的主体,和 GET 有类似的地方
    • 主要目的不是为了获取响应的主体内容,
    • 相当于 GET 是要从服务器获取某个东西,而 POST 是要告诉服务器某个东西
  3. PUT
    • 主要用来传输文件
    • 请求报文的主体包含文件内容,然后保存到请求 URI 指定的位置
    • HTTP/1.1 的 PUT 自身不带验证机制,任何人都可以上传文件,存在安全性问题,因此一般不用此方法。
  4. HEAD
    • 获取报文的响应首部
    • 与 GET 方法一样,只是不返回报文主体内容
    • 用于确认 URI 的有效性及资源更新的日期时间等
  5. DELETE
    • 删除文件,与 PUT 相反。
    • 请求删除 URI 指定的资源,原因和 PUT 一样,也不安全
  6. OPTIONS
    • 查询针对请求 URI 指定的资源支持的方法
    • 比如响应报文为 Allow: GET, POST, HEAD, OPTIONS
  7. TRACE
    • 让服务器将之前的请求内容再告诉客户端
    • 与 Max-Forwards 请求头一起使用,填入一个数字,每经过一个服务端值会减 1,直到为 0,返回响应
    • 可以查询发出去的请求通过代理中转过程中是怎样被加工修改的
    • 本身不常用,且易引起跨站追踪攻击
  8. CONNECT
    • 要求与代理服务器通信时建立隧道,实现用隧道协议进行 TCP 通信。
    • 主要使用 SSL(Secure Sockets Layer)和 TLS(Transfer Layer Security)协议把通信内容加密后经网络隧道传输

报文

报文分请求报文和响应报文,含有报文首部和报文主体,报文主体并不一定存在,若存在,两者由最初出现的空行(CL+LF)来划分。

报文示例(来自HTTP请求报文和HTTP响应报文

  • 请求报文
POST /search HTTP/1.1   
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-silverlight, application/x-shockwave-flash  
Referer: <a href="http://www.google.cn/">http://www.google.cn/</a>   
Accept-Language: zh-cn   
Accept-Encoding: gzip, deflate   
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld)   
Host: <a href="http://www.google.cn">www.google.cn</a>   
Connection: Keep-Alive   
Cookie: PREF=ID=80a06da87be9ae3c:U=f7167333e2c3b714:NW=1:TM=1261551909:LM=1261551917:S=ybYcq2wpfefs4V9g; NID=31=ojj8d-IygaEtSxLgaJmqSjVhCspkviJrB6omjamNrSm8lZhKy_yMfO2M4QMRKcH1g0iQv9u-2hfBW7bUFwVh7pGaRUb0RnHcJU37y- FxlRugatx63JLv7CWMD6UB_O_r   

hl=zh-CN&source=hp&q=domety
  • 响应报文
HTTP/1.1 200 OK 
Date: Sat, 31 Dec 2005 23:59:59 GMT 
Content-Type: text/html;charset=ISO-8859-1 
Content-Length: 122 

<html> 
<head> 
<title>Wrox Homepage</title> 
</head> 
<body> 
<!-- body goes here --> 
</body> 
</html>

编码

有时为了传输速率,需要对传输的内容进行编码。一般情况下,报文主体等于实体主体,但在编码的情况下,最初的内容叫做实体主体,编码后的内容是作为报文主体传输。传输大量数据时,可以将实体分块传输,每块用十六进制标记块大小,最后一块用”0(CR+LF)“标记。客户端收到后解码,若在浏览器页面,就可以逐步显示页面。

发送多种数据的对象集合

指定请求头 Content-Type 为 multipart/form-data(Web表单) 或 multipart/byteranges

Content-Type:multipart/form-data; boundary=ZnGpDtePMx0KrHh_G0X99Yef9r8JZsRJSXC
Host: w.sohu.com
 
--ZnGpDtePMx0KrHh_G0X99Yef9r8JZsRJSXC
Content-Disposition: form-data;name="desc"
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
 
[......][......][......][......]...........................
--ZnGpDtePMx0KrHh_G0X99Yef9r8JZsRJSXC
Content-Disposition: form-data;name="pic"; filename="photo.jpg"
Content-Type: application/octet-stream
Content-Transfer-Encoding: binary
 
[图片二进制数据]
--ZnGpDtePMx0KrHh_G0X99Yef9r8JZsRJSXC--
  • multipart/byteranges
Content-Type : multipart/byteranges;boundary=THIS_STRING    

     --THIS_STRING
     Content-Type:application/pdf
     Content-Range:bytes 500-999/8000

     (500-999范围指定的数据)
 --THIS_STRING
  Content-Type:image/jpeg
  Content-Range:bytes 100-300/2000
  --THIS_STRING--

boundary 来划分各部分实体,在各个实体的起始“--”标记,如(--ZnGpDtePMx0KrHh_G0X99Yef9r8JZsRJSXC,--THIS_STRING)

内容协商返回最佳页面

比如同一个 URI 的网页,需要浏览器是英文显示英文网页,浏览器是中文显示中文网页。 内容协商(Content Negotiation)指客户端和服务端就响应的资源内容进行交涉,然后提供给客户端适合的资源。用于判断的一些字段:Accept、Accept-Charset、Accept-Encoding、Accept-Language、Content-Language。有三种类型

  • 服务器驱动协商 以请求的首部字段作为参考,在服务端自动处理。比如 Google Play Store,连着哪国的 VPN,就认为是在哪个国家,虽然语言都是中文。
  • 客户端驱动协商 比如 UC 浏览器的页面转码,自己可以选择浏览 PC 版还是转码后的
  • 透明协商 服务器和客户端一起协商

响应码

  • 1XX Informational(信息性状态码),表示接收的请求正在处理
  • 2XX Success(成功状态码),表示请求正常处理完毕
    • 200 OK 表示从客户端发来的请求在服务端被正常处理了
    • 204 No Content 表示服务器接收的请求已成功处理,但在返回的响应报文中不含实体的主体部分,也不允许返回任何实体的主体。一般在只需要从客户端往服务器发送信息,而对客户端不需要发送新信息内容的情况下使用
    • 206 Partial Content 表示客户端进行了范围请求,而服务器成功执行了这部分的 GET 请求,响应报文中包含由 Content-Range 指定范围的实体内容。
  • 3XX Redirection(重定向状态码),表示需要进行附加操作以完成请求
    • 301 Moved Permanently 永久性重定向。表示请求的资源已被分配了新的 URI,以后都应该使用重定向后的新的 URI。比如如果请求 http://example.com/sample 将会被重定向为 http://example.com/smaple/,就会产生 301 状态码。
    • 302 Found 临时性重定向。表示请求的资源已被分配了新的 URI,本次能使用新的 URI 访问。
    • 303 See Other 表示请求的资源存在着另一个 URI,应使用 GET 方法定向获取请求的资源。 303 与 302 类似,但 303 明确表示客户端应当采用 GET 方法获取资源。比如,用 POST 方法访问 CGI 程序,执行后返回 303,希望客户端能以 GET 方法重定向到另一个 URI 上。
    • 304 Not Modified GET 请求,且有 If-Match,If-Modified-Since,If-None-Match,If-Range,If-Unmodified-Since 中的任一首部。服务端允许请求访问资源,但没满足那些条件,就返回 304 虽然被划分到 3XX,但和重定向没有关系
    • 307 Temporary Redirect 临时重定向,与 302 意思一样,301,302 标准时禁止将 POST 方法改为 GET 的,但实际使用大家都会将 POST 改为 GET,307 会遵照标准,不会把 POST 变成 GET
  • 4XX Client Error(客户端错误状态码),表示服务器无法处理请求
    • 400 Bad Request 请求报文存在语法错误,当错误发生时,需修改请求的内容后再次发送请求,浏览器会像 200 OK 一样对待该状态码
    • 401 Unauthorized 表示发送的请求需要有通过 HTTP 认证(BASIC 认证、DIGEST 认证)的认证信息。若之前已进行过 1 次请求,则表示用户认证失败。 返回含有 401 的响应必须包含一个适用于被请求资源的 WWW-Authenticate 首部用以质询用户信息,当浏览器初次接收到 401 响应,会弹出认证用的对话窗口。
    • 403 Forbidden 表示对请求资源的访问被服务器拒绝了,服务器没有必要给出拒绝的详细理由,但如果想作说明的话,可以在实体的主体部分对原因进行描述。
    • 404 Not Found 服务器上无法找到请求的资源,可以在服务器拒绝请求且不想说明理由时使用。
  • 5XX Server Error(服务器错误状态码),表示服务器处理请求出错
    • 500 Internal Server Error 服务器在执行请求时发生了错误。也可能是 Web 应用存在 bug 或某些临时故障
    • 503 Service Unavailable 服务器暂时出于超负载或正在进行停机维护,现在无法处理请求。如果事先得知解除以上状况需要的时间,最好写入 Retry-After 首部字段再返回给客户端。

Web服务器

  • 代理 转发时需要附加 Via 首部字段以标记出经过的主机信息。 可分为缓存代理,即预先将资源的副本缓存在代理服务器上,当代理再次接收到相同资源的请求时,直接将缓存资源作为响应返回和非缓存代理;也可以分为透明代理,即不对报文做任何加工和非透明代理
  • 网关 与代理类似,但它能使通信线路上的服务器提供非 HTTP 服务。能提高通信安全性,在客户端和网关之间进行加密,例如在 Web 购物网站进行信用卡结算时,通过网关和信用卡系统联动。
  • 隧道 建立起一条与服务器的通信线路,使用 SSL 等加密手段进行通信。目的是确保客户端和服务端建立安全的通信,本身不解析 HTTP 请求。隧道在通信双方断开连接时结束。
  • 缓存 缓存服务器,即代理服务器,转发服务器的响应时,会进行缓存,会因为客户端的请求,缓存有效期等因素,向源服务器确认缓存资源的有效性,若缓存失效,重新从源服务器获取。 客户端浏览器也可以缓存,若缓存有效,直接从本地磁盘读取,若失效,则再次请求

HTTP 首部

通用首部字段

  • Cache-Control 控制缓存的行为
    • 缓存请求和响应通用指令
      • no-cache 请求表示强制向源服务器再次验证;响应表示缓存前必须先确认其有效性,可省略,是默认值 目的是为了防止从缓存中返回过期的资源。如果是请求,返回服务器必须把客户端请求转发给源服务器;如果是响应,缓存服务器不能对资源进行缓存。源服务器以后也不再对缓存服务器请求中提出的资源有效性进行确认,且禁止其对响应资源进行缓存操作。 若响应报文中,对 no-cache 指定了具体的参数值,比如 Cache-Control: no-cache=Location,表示客户端在接收到这个被指定参数值的首部字段对应的报文后,不使用缓存,无参数值的首部字段仍然可以使用缓存。
      • no-store 不缓存请求或响应的任何内容
      • no-cache 是不缓存过期的资源 缓存会向源服务器进行有效期确认后处理资源;no-store 才是真正地不进行缓存。
      • no-transform 代理不可更改媒体类型 无论是请求还是响应,缓存都不能改变实体主体的媒体类型。用于防止缓存或代理压缩图片等类似操作。
      • max-age = [秒] 响应的最大 Age 值 请求中含有该字段,如果判定缓存资源的缓存时间数值比该字段指定数值更小,那么客户端就接收缓存的资源。如果 max-age 值为 0,那么缓存服务器将请求转发给源服务器。 响应中含有该字段,缓存服务器不对资源有效性再作确认,max-age 值代表资源保存为缓存的最长时间。 Expires 表示存在时间,允许客户端在这个时间之前不去检查(发请求),例如 Expires: Thu, 01 Dec 1994 16:00:00 GMT,等同 max-age 的效果。但是如果同时存在,HTTP/1.1 中处理 max-age,而忽略 Expires。
      • cache-extension 新指令标记(token) 可以扩展 Cache-Control 首部字段内的指令,如 Cache-Control: private, community="UCI",添加了一个全新的指令 community。 如果缓存服务器不能理解 community 这个新指令,会直接忽略。 仅对能理解它的缓存服务器来说是有意义的。
    • 缓存请求指令
      • max-stale = ([秒]) 接收已过期的响应,参数可省略 指示缓存资源,即使过期也正常接收,如果该指令未指定数值,那么无论过多久,客户端都会接收响应;如果指定了数值,即使过期,只要仍处于 max-stale 指定的时间内,仍旧会被客户端接收。
      • min-fresh = [秒] 期望在指定时间内的响应仍有效 缓存服务器返回至少还未过指定时间的缓存资源。比如,当值为 60 秒,那么过了 60 秒的资源都无法作为响应返回。
      • only-if-cached 从缓存获取资源 要求缓存服务器不重新加载响应,也不会再次确认资源有效性,若发生请求缓存服务器的本地缓存无响应,则返回状态码 504 Gateway Timeout。
    • 缓存响应指令
      • public 可向任意方提供响应的缓存 明确表明其他用户也可利用缓存
      • private 仅向特定用户返回响应,可省略,即默认值 缓存服务器会对该特定用户提供资源缓存的服务,对于其他用户发送过来的请求,代理服务器不会返回缓存。
      • must-revalidate 可缓存但必须再向源服务器进行确认 代理会向源服务器再次验证即将返回的响应缓存目前是否仍然有效,若代理无法连通源服务器再次获取有效资源的话,缓存必须给客户端一条 504 状态码。该指令会忽略请求的 max-stale。
      • proxy-revalidate 要求中间缓存服务器对缓存的响应有效性再进行确认 要求所有的缓存服务器在接收到客户端带有该指令的请求返回响应之前,必须再次验证缓存的有效性。
      • s-maxage = [秒] 公共缓存服务器响应的最大 Age 值 功能和 max-age 一样,区别在于 s-maxage 只适用于供多位用户使用的公共缓存服务器(一般指代理),对于同一用户重复返回响应的服务器来说,这个指令无任何作用。当使用这个字段时,忽略对 Expires 首部字段及 max-age 指令的处理。
  • Connection 逐跳首部、连接的管理 控制不再转发给代理的首部字段 GET / HTTP/1.1 Upgrade: HTTP/1.1 Connection: Upgrade 如上面的请求,在经过代理服务器后,会将 Upgrade 删除后再转发给源服务器。 也用于管理持久连接
    • Connection: close。HTTP/1.1 默认连接都是持久连接,当服务器想明确断开连接时,则指定其为 close
    • Connection: Keep-Alive。HTTP/1.1 之前的默认连接都是非持久连接,如果想在旧版本 HTTP 协议上维持持久连接,则指定其值为 Keep-Alive
  • Data 创建报文的日期时间 使用 RFC1123 中规定的日期时间格式,Date: Tue, 03 Jul 2012 04:40:59 GMT。 旧版本 HTTP 使用 RFC859 定义的格式,Date: Tue, 03-Jul-12 04:40:59 GMT,另一种格式 Date: Tue Jul 03 04:40:59 2012。
  • Pragma 报文指令 HTTP/1.1 之前版本的历史遗留字段,仅作为与 HTTP/1.0 的向后兼容而定义。只有一种形式 Pragma: no-cache,表示客户端会要求所有的中间服务器不返回缓存的资源。 若中间服务器都能以 HTTP/1.1 为基准,直接用 Cache-Control: no-cache 即可,但实际上不能掌握所有中间服务器的协议版本,所以要同时包含这两个。 Cache-Control: no-cache Pragma: no-cache
  • Trailer 报文末端的首部一览 会事先说明在报文主体后记录了哪些首部字段。可应用在 HTTP/1.1 分块传输编码时。 Trailer: Expires ... 报文主体 ... 0 Expires: Sta, 28 Nov 2015 23:00:00 GMT 指定了 Trailer 值为 Expires,在报文主体之后(分块长度 0 之后)出现首部字段 Expires。
  • Transfer-Encoding 指定报文主体的传输编码方式 仅对分块传输编码有效
  • Upgrade 升级为其他协议 用于检测 HTTP 协议及其它协议是否可使用更高的版本进行通信,参数值可以用来指定一个完全不同的通信协议。使用 Upgrade 时,还需要指定 Connection: Upgrade。 Upgrade: TLS/1.0, HTTP/1.1 Connection:Upgrade Upgrade 对象仅限于客户端和邻接服务器之间,服务器可用 101 Switching Protocols 状态码作为响应返回。
  • Via 代理服务器的相关信息 追踪客户端和服务端之间的请求和响应报文的传输路径,还可避免请求回环的发生,所以必须在经过代理时添加该字段。经过一个代理服务器时,加了一条信息,1.0 表示代理服务器使用的是 HTTP/1.0,又经过一台代理服务器时,又加了一条信息。 GET HTTP/1.1 Via: 1.0 xx.xx.com(Squid/3.1), 1.1 yy.yy.com(Squid/2.7)
  • Warning 错误通知 通常会告知用户一些与缓存相关的问题和警告,格式如下。最后的日期时间部分可省略: Warning: [警告码] [警告的主机 : 端口号] "[警告内容]" ([日期时间]) 警告码
    • 110 Response is stale(响应已过期),表示代理返回已过期的资源
    • 111 Revalidation failed(再验证失败),表示代理再验证资源有效性失败(服务器无法到达等原因)
    • 112 Disconnection opreation(断开连接操作),表示代理与互联网连接被故意切断
    • 113 Heuristic expiration(试探性过期),表示响应的使用期超过 24 小时(有效资源的设定时间大于 24 小时的情况下)
    • 199 Miscellaneous warning(杂项警告),表示任意的警告内容
    • 214 Transformation applied(使用了转换),表示代理对内容编码或媒体类型等执行了某些处理时
    • 299 Miscellaneous persistent warning 任意的警告内容

请求首部字段

  • Accept 用户代理可处理的媒体类型 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 通知服务器用户代理能够处理的媒体类型及相对优先级,可使用 type/subtype,一次指定多种媒体类型。若要设置优先级,使用 q= 来额外表示权重值,用 ; 分隔。范围 0-1(可精确到小数点后 3 位),1 为最大,不指定时,默认值为 q=1.0
  • Accept-Charset 优先的字符集 Accept-Charset: iso-8859-5, unicode-1-1;q=0.8 通知服务器用户代理支持的字符集及相对优先顺序。通过 q= 来表示优先级。
  • Accept-Encoding 优先的内容编码 Accept-Encoding: gzip, deflate 通知服务器用户代理支持的内容编码及优先级。通过 q= 来表示优先级。 编码主要由以下几种
    • gzip:由 GNU zip 程序生成的编码格式
    • compress:由 UNIX 文件压缩程序 compress 生成的编码格式
    • deflate:组合适用 zlib 及由 deflate 压缩算法生成的编码格式
    • identity:不执行压缩或不会变化的默认编码格式
  • Accept-Language 优先的语言 Accepte-Language: zh-cn,zh;q=0.7,en-us,en;q=0.3 通知服务器用户代理能够处理的自然语言集及优先级。通过 q= 来表示优先级。
  • Authorization Web 认证信息 通知服务器用户代理的认证信息。通常,想要通过服务器认证的用户代理会在接收到返回的 401 状态码响应后,把首部字段 Authorization 加入请求。共用缓存在接收到含有 Authorization 首部字段的请求时的操作处理会略有差异
  • Expect 期待服务器的特定行为 告知服务器期望出现的某种行为,服务器无法理解客户端的期望作出回应而发生错误时,返回 417 Expectation Failed。 客户端可利用该字段写明期望的扩展。 HTTP/1.1 规范只定义了 100-continue,等待状态码 100 的这个响应的客户端在请求时,需要指定 Expect: 100-continue
  • From 用户的电子邮箱地址 From: xx@163.com 目的是为了显示搜索引擎等用户代理的负责人的电子邮件,使用代理时,应尽可能包含该字段。
  • Host 请求资源所在服务器 告知服务器请求的资源所在互联网主机名和端口号。在 HTTP/1.1 规范内,该字段是唯一一个必须被包含在请求内的首部字段。单台服务器分配多个域名的虚拟主机时,服务器会先将域名转成 IP,但相同的 IP 下部署运行着多个域名,因此需要通过 Host 来明确请求的主机名,若未设定主机名,直接发送空值,即 Host:
  • Max-Forwards 最大传输逐跳数 通过 TRACE 或 OPTIONS 方法,发送包含 Max-Forwards 的请求时,该字段以十进制整数形式指定可经过的服务器最大数目。 服务器在往下一个服务器转发请求前,会将 Max-Forwards 值减 1 后重新赋值,当服务器收到 Max-Forwards 为 0 的请求时,则不再转发,直接返回响应。 有时代理服务器因为某些原因请求失败,客户端就无法收到响应,灵活使用该字段,当值为 0 时,服务器会立刻返回响应。
  • Proxy-Authorization 代理服务器要求客户端的认证信息 Proxy-Authorization: Basic dG1wOjkpNLAGfFY5 接收到从代理服务器发来的认证质询时,客户端会发送包含该字段的请求,以告知服务器认证所需要的信息。 这是用于客户端和代理之间的认证,客户端和服务端的认证通过 Authorization 字段。
  • Range 实体的字节范围请求 服务器处理请求后,返回 206 Partial Content。如果无法处理范围请求,返回 200 OK 的响应及全部资源。
  • Referer 对请求中 URI 的原始获取方 Referer: http://w3school.com.cn/html/index.asp 告知服务器请求的原始资源的 URI。 客户端一般会发送该字段给服务器,但在浏览器地址栏输入 URI,出于安全性考虑,也可以不发送,因为原始 URI 的查询字符串可能含有 ID 和密码等保密信息,写进 Referer 转发给其他服务器,可能导致保密信息的泄露。
  • TE 传输编码的优先级 TE: gzip, deflate;q=0.5 告知服务器客户端能够处理响应的编码方式即优先级。 和 Accepte-Encoding 功能相似,但是用于传输编码,还可以指定伴随 trailer 字段的分块传输编码的方式,要这样使用时,只需把 trailers 赋值给该字段,即 TE: trailers
  • User-Agent HTTP 客户端程序的信息 将创建请求的浏览器和用户代理名称等信息传给服务器,网络爬虫发起请求时,可能在该字段内添加爬虫作者的电子邮件地址。此外经过代理,中间也可能被添加上代理服务器的名称。

条件请求

形如 If-xxx 的请求字段,都可称为条件请求,服务器收到条件请求后,判断指定条件为真时,才会执行请求。

  • If-Match 比较实体标记(ETag) 实体标记 ETag 是与特定资源关联的确定值,资源更新后 ETag 也会随之更新。服务器会比对 If-Match 字段值和资源的 ETag 值,仅当两者一致时,才会执行请求。反之,则返回状态码 412 Precondition Failed 的响应。 可以使用 * 指定 If-Match 值,相当于不匹配,服务器会忽略 ETag 值,只要资源存在就处理请求。
  • If-Modified-Since 比较资源的更新时间 告知服务器若该字段值早于资源的更新时间,则处理请求,否则返回 304 Not Modified。
  • If-None-Match 比较实体标记(与 If-Match 相反) 字段值和资源的 ETag 值不一致时,处理该请求。在 GET 或 HEAD 方法使用该字段可以获取更新的资源,与使用 If-Modified-Since 有些类似。
  • If-Range 资源未更新时发送实体 Byte 的范围请求 If-Range: "123456" Range: bytes=5001-10000 告知服务器指定的 If-Range 字段值(ETag 或时间)和请求资源的 ETag 或时间一致时,则作为范围请求处理。反之返回全部资源。如果服务器资源 ETag 为 “123456”,则返回 5001-10000 范围内的资源,反之忽略这个范围,返回全部资源。
  • If-Unmodified-Since 比较资源的更新时间(与 If-Modified-Since 相反) 告知服务器,未发生更新时处理请求,如果指定日期后更新了,则返回 412 Precondition Failed。

响应首部字段

  • Accept-Ranges 是否接受字节范围请求 Accept-Ranges: bytes 告知客户端服务器是否能处理范围请求,以指定获取服务器某个部分的资源,有两种字段值,可处理范围请求为 bytes,反之为 none。
  • Age 推算资源创建经过时间 Age: 600 告知客户端源服务器在多久前创建了响应,单位为秒,若创建该响应的服务器是缓存服务器,Age 指缓存后的响应再次发起认证到认证完成的时间值。代理创建响应必须加上 Age。
  • ETag 资源的匹配信息 告知客户端实体标识,是一种可将资源以字符串形式做唯一性标识的方式,服务器会为每份资源分配对应的 ETag 值,资源更新时,ETag 值也更新,生成 ETag 值,没有统一的算法规则,仅仅由服务器来分配。 资源 URI 相同,但中文版和英文版对应的资源不同,若下载过程中连接中断,再连接时,会照 ETag 值来指定资源
    • 强 ETag 值 不论实体发生多么细微的变化都会改变其值,如 ETag: "usagi-1234"
    • 弱 ETag 值 只用于提示资源是否相同,只有资源发生了根本改变,产生差异时才会改变 ETag,此时,会在字段值开始处附加 W/,如 ETag: W/"usagi-1234"
  • Location 令客户端重定向至指定 URI Location: http://www.baidu.com/xxx.html 将响应接收方引导至某个与请求 URI 位置不同的资源,基本上,会配合 3xx : Redirection 的响应,提供重定向的 URI,浏览器在收到含有 Location 的响应后,会强制性尝试对已提示的重定向资源的访问。
  • Proxy-Authenticate 代理服务器对客户端的认证信息 把由代理服务器所要求的认证信息发送给客户端,这是客户度和代理服务器之间的,客户端和服务器之间的认证是 WWW-Authenticate
  • Retry-After 对再次发起请求的时机要求 Retry-After: 120 告知客户端应该在多久之后再次发送请求,配合状态码 503 Service Unavailable 或 3xx Redirect 一起使用。字段值可以指定为具体的时间日期,也可以是创建响应后的秒数
  • Server HTTP 服务器的安装信息 Server: Apache/2.2.6 (Unix) PHP/5.2.5 告知客户端当前服务器上安装的 HTTP 服务器应用程序的信息,除了服务器上软件应用名称,还可能包含版本号和安装时启用的可选项
  • Vary 代理服务器缓存的管理信息 对缓存进行控制,源服务器会向代理服务器传达关于本地缓存使用方法的命令,从代理服务器接收到源服务器返回包含 Vary 指定项的响应之后,若再要进行缓存,仅对请求中含有相同 Vary 指定首部字段的请求返回缓存,对相同资源发起请求,由于 Vary 指定的首部字段不同,因此必须要从源服务器重新获取资源。 Vary: Accept-Language,当代理服务器收到带有 Vary 首部字段指定获取资源的请求时,如果使用的 Accept-Language 字段的值相同,那么就直接从缓存返回响应,反之则需要先从源服务器获取资源后才能作为响应返回。
  • WWW-Authenticate 服务器对客户端的认证信息 用于 HTTP 访问认证,告知客户端适用于访问请求 URI 所指定资源的认证方案和带参数提示的质询。401 Unauthorized 的响应中,肯定带有首部字段 WWW-Authenticate。

总结:端到端首部和逐跳首部

  • 端到端首部(End-to-end Header) 此类别的首部会转发给请求/响应对应的最终接收目标,必须保存在由缓存生成的响应中,必须被转发。
  • 逐跳首部(Hop-by-hop Header) 此类别的首部只对单次转发有效,会因通过缓存或代理而不再转发。HTTP/1.1 和之后版本中,如果适用逐跳首部,需提供 Connection 首部字段。

除了下面的 8 个属于逐跳首部,其余都属于端到端首部

  • Connection
  • Keep-Alive
  • Proxy-Authenticate
  • Proxy-Authorization
  • Trailer
  • TE
  • Transfer-Encoding
  • Upgrade

其它首部字段

  • 实体首部字段 针对请求报文和响应报文的实体部分使用的首部。补充了资源更新时间等与实体有关的信息
    • Allow 资源可支持的 HTTP 方法 Allow: GET, HEAD 通知客户端能够支持 Request-URI 指定资源的所有 HTTP 方式,当服务器收到不支持的 HTTP 方法时,会返回状态码 405 Method Not Allowed。与此同时,还会把所有能支持的 HTTP 方法写入首部字段 Allow 后返回。
    • Content-Encoding 实体主体适用的编码方式 Content-Encoding: gzip 告知客户端服务器对实体的主体部分选用的内容编码方式,主要采用 gzip,compress,deflate,identity。
    • Content-Language 实体主体的自然语言 Content-Language: zh-CN 告知客户端,实体主体使用的自然语言。
    • Content-Length 实体主体的大小(单位:字节) 表明实体主体部分的大小,对实体主体进行编码传输时,不能再使用 Content-Length 首部字段。
    • Content-Location 替代对应资源的 URI 给出与报文主体部分对应的 URI,和首部字段 Location 不同,Content-Location 表示的是报文主体返回资源对应的 URI。
    • Content-MD5 实体主体的报文摘要 目的在于检查报文主体在传输过程中是否保持完整,以及确认传输到达。 对报文主体执行 MD5 算法获得 128 位二进制数,由于 HTTP 首部无法记录二进制值,所以再用 Base64 编码后将结果写入 Content-MD5 字段值。 为确保报文的有效性,作为接收方的客户端会对报文主体再执行一次相同的 MD5 算法。计算出的值与字段值作比较后,即可判断出报文主体的准确性。 这种方法对内容上的偶发性改变是无从查证的,也无法检测出恶意篡改。
    • Content-Range 实体主体的位置范围 告知客户端作为响应返回的实体的哪个部分符合范围请求。
    • Content-Type 实体主体的媒体类型 和首部字段 Accept 一样,字段值用 type/subtype 形式复制。
    • Expires 实体主体过期的日期时间 首部字段 Expires 会将资源失效的日期告知客户端,缓存服务器在接收到含有首部字段 Expires 的响应后,会以缓存来应答请求,在 Expires 字段指定的时间之前,响应的副本会一直被保存。当超过指定的时间后,缓存服务器在请求发送过来时,会转向源服务器请求资源。源服务器不希望缓存服务器对资源缓存时,最好在 Expires 字段内写入与首部字段 Date 相同的时间值。 当首部字段 Cache-Control 有指定的 max-age 指令时,比起首部字段 Expires,会优先处理 max-age 指令
    • Last-Modified 资源的最后修改日期时间 指明资源最终被修改的时间。一般来说,这个值就是 Request-URI 指定资源被修改的时间。但类似使用 CGI 脚本进行动态数据处理时,该值有可能会变成数据最终修改时的时间。
  • 为 Cookie 服务的首部字段
    • Set-Cookie
      • NAME=VALUE 赋予 Cookie 的名称和值(必需项)
      • expires=DATE 指定浏览器可发送 Cookie 的有效期,若省略此属性,其有效期仅限于维持浏览器会话时间段内,通常限于浏览器应用被关闭之前。 一旦 Cookie 被发送到客户端,服务器端就无法显式删除 Cookie,但可以通过覆盖已过期的 Cookie,实现对客户端 Cookie 的删除。
      • path=PATH 将服务器上的文件目录作为 Cookie 的适用对象(若不指定则默认为文档所在的文件目录)。
      • domain=域名 作为 Cookie 适用对象的域名(若不指定则默认为创建 Cookie 的服务器的域名),比如 domain 指定为 example.com,除 example.com 外,www.example.comwww2.example.com 等都可以发送 Cookie。
      • Secure Set-Cookie: name=value; secure 仅在 HTTPS 安全通信时才会发送 Cookie,当省略 secure 时,不论 HTTP 还是 HTTPS,都会对 Cookie 进行回收。
      • HttpOnly Set-Cookie: name=value; HttpOnly 加以限制,使 Cookie 不能被 JavaScript 脚本访问,目的是为了防止跨站脚本攻击对 Cookie 的信息获取。
    • Cookie 会告知服务器,当客户端想获得 HTTP 状态管理支持时,就会在请求中包含从服务器接收到的 Cookie,接收到多个 Cookie 时,会同时以多个 Cookie 形式发送。
  • 其它首部字段
    • X-Frame-Options X-Frame-Options: DENY 属于响应首部字段,控制网站内容在其他 Web 网站的 Frame 标签内的显示问题。主要目的是为了防止点击劫持攻击,两个指定值:
      • DENY:拒绝
      • SAMEORIGIN:仅同源域名下的页面匹配时许可
    • X-XSS-Protection X-XSS-Protection: 1 属于响应首部字段,是针对跨站脚本攻击(XSS)的一种对策,用于控制浏览器 XSS 防护机制的开关,两个指定值:
      • 0:将 XSS 过滤设置成无效状态
      • 1:将 XSS 过滤设置成有效状态
    • DNT 属于请求首部字段,即 Do Not Track,拒绝个人信息被收集,两个指定值:
      • 0:同意被追踪
      • 1:拒绝被追踪
    • P3P 属于响应请求首部,可以利用 P3P(the Platform for Privacy Preferences)技术,让 Web 网站上的个人隐私变成一种仅供程序可理解的形式,以达到保护用户隐私的目的。

机密认证

HTTPS

HTTPS = HTTP + SSL,SSL 的功能是加密、认证、完整性保护。HTTP 先与 SSL 通信,然后由 SSL 和 TCP 通信。

加密

公开密钥加密方式:一对非对称密钥,一把私有密钥,一把公开密钥。

共享密钥加密方式:对称密钥。

HTTPS 使用混合加密机制,即共享密钥加密和公开密钥加密两者并用。交换密钥环节使用公开密钥加密方式,之后建立通信交换报文阶段用共享密钥加密方式。

证书

  • CA 为了证明公开密钥的正确性,使用数字证书认证机构(CA,Certificate Authority)和其它相关机构颁发的公开密钥证书
  • EV SSL 证书的一个作用是用来证明作为通信一方的服务器是否规范,另外一个作用是可确认对方服务器背后运营的企业是否真实存在,而拥有这种特性的证书就是 EV SSL 证书。 拥有该证书的网站的浏览器地址背景色是绿色

SSL 和 TLS

SSL 除了要和 TCP 连接,HTTP 请求和响应,还必须和 SSL 通信,所以通信慢;因为要加密,消耗 CPU 和内存,所以处理也慢。

TLS 以 SSL 为原型开发

认证

  • BASIC
    • 过程 客户端发送请求,服务端返回 401 Authorization Required,返回带 WWW-Authenticate 首部字段,该字段包含认证方式(BASIC)及 Request-URI 安全域字符串(realm),客户端收到 401 状态码,将 ID 和密码以冒号连接,再 Base64 编码,作为 Authorization 字段内容发给服务端,服务端对客户端 Authorization 字段内容进行认证。
    • 特点 HTTP/1.0 时代就有了;采用的 Base64 编码并不是加密,可以直接解码得到 ID 和密码,在非加密通信线路上不安全,再进行一次 BASIC 认证,一般浏览器无法实现认证注销操作;不够便捷灵活,不常用。
  • DIGEST
    • 过程 客户端发送请求,服务端返回 401 Authorization Required,返回带 WWW-Authenticate 首部字段,该字段包含 realm 和 nonce,nonce 是任意随机字符串,是认证所需的临时质询码,客户端收到 401 状态码,发送含有认证信息的 Authorization 信息。 必须包含 username,realm,nonce,uri 和 response
      • realm=“DIGEST”
      • nonce 是服务端发过来的
      • username 是 realm 限定范围内进行认证的用户名
      • uri 是 Request-URI 的值
      • response 是 MD5 运算后的密码字符串,形成响应码

      服务端收到后进行认证

    • 特点 安全性高于 BASIC,但比起 HTTPS 客户端认证仍然很弱,防止密码被窃听,但不防止用户伪装;不便捷灵活,使用范围有限。
  • SSL 客户端认证
    • 过程 服务端收到需要认证资源的请求,发送 Certificate Request 报文,要求客户端提供证书,用户选择将要发送的证书,客户端以 Client Certificate 报文方式发送给服务器,服务端验证后领取证书内客户端的公开密钥,然后进行 HTTPS 通信。多数情况,SSL 客户端还会要求表单认证组合形成一种双因素认证。
  • 表单认证 一般是让用户输入用户名和密码,一般使用 Cookie 来管理 Session。

PS:为了完成日更任务,一篇旧文

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏前端萌媛的成长之路

一波webpack

1924
来自专栏北京马哥教育

面试被问http协议?这篇文章足够覆盖所有相关问题!

? HTTP超文本传输协议 http使用面向连接的TCP作为传输层协议。http本身无连接。 请求报文 CRLF是回车换行 ? 方法为GET的请求报...

3147
来自专栏向治洪

认识Kubernates(K8S)

在后端开发中,在介绍Jenkins的可伸缩部署方式上,主要有两种方式:一种是基于Docker(或者docker-swarm 集群)的部署方式,另外一种是基于ku...

8048
来自专栏龙首琴剑庐

基于复杂方案OWSAP CsrfGuard的CSRF安全解决方案(适配nginx + DWR)

1、什么是CSRF? 已经有很多博文讲解其过程和攻击手段,在此就不重复了。 O(∩_∩)O 不清楚的同学,请自行搜索或按链接去了解: http://blog...

5047
来自专栏软件

经验分享 Burpsuite插件的使用

Burp插件的使用 使用准备 Burpsuite可以使用三种语言编写的扩展插件,Java、Python和Ruby。除Java外,其它两种需要的扩展插件需要配置运...

4767
来自专栏Brian

Linux 系统优化

概述 在Linux 学习笔记一大体介绍了一些简单的Linux知识和一些简单的优化。下面我们来学习一下Linux和Linux一些安全知识(Linux是基于内核为...

4736
来自专栏知识分享

轻松使用8266

今天算是做好了板子啦!做了一块直接用串口配置8266的板子,,也可以无线配置,配置完一次,上电自动运行...这篇文章也是写给一个朋友看的,朋友的项目做了很长时间...

3619
来自专栏菩提树下的杨过

Spring Security笔记:Remember Me(下次自动登录)

前一节学习了如何限制登录尝试次数,今天在这个基础上再增加一点新功能:Remember Me. 很多网站,比如博客园,在登录页面就有这个选项,勾选“下次自动登录”...

4566
来自专栏小白安全

Burpsuite插件的使用

Burp插件的使用 使用准备 Burpsuite可以使用三种语言编写的扩展插件,Java、Python和Ruby。除Java外,其它两种需要的扩展...

3034
来自专栏运维小白

12.22 php-fpm慢执行日志

php-fpm慢执行日志目录概要 vim /usr/local/php-fpm/etc/php-fpm.d/www.conf//加入如下内容 request_s...

4037

扫码关注云+社区

领取腾讯云代金券