HTTP首部

首先整个HTTP的报文结构如下图所示,我们这里主要专注于报文首部。

HTTP报文结构

一. 请求报文首部

1. 请求报文首部结构:

(1)必须的:方法 | URI(发送方地址) | 协议版本
例如:

post | www.tom.org/form/entry | HTTP/1.1

(2)(请求首部字段(可选))
例如:
HOST:hack.jp(域名或IP地址)
Coonnection : keep-alive
Content-Type:application/x-www-form

2. HTTP方法

请求报文的第一项就是HTTP方法,常见的HTTP方法有:
(1)POST:传输实体主体
用来传送较多的数据并需要服务器端对其处理,通常会修改数据。
(2)GET:获取资源
用来请求访问URI指定的资源,通常资源经过服务器端解析后返回响应主体。
POST和GET的区别:

  • GET是幂等的,POST不是,所谓幂等是指请求多次和请求一次结果是相同的,原因是GET通常只读数据,而不会写数据(前提是多次请求之间数据本身没有修改)。但POST可以通过别的辅助方式实现幂等,比如为每个请求加个唯一的id或版本号等。
  • GET请求会被浏览器主动缓存,POST不会
  • GET请求的参数只能通过URL传递,但是POST可以放在request body中(即可以通过报文主体传递);而且URL的长度通常都是有限的,但是POST就没有这个限制;另外因为GET的参数暴露在URL上,所以没有POST安全。
  • GET产生一个数据包,POST产生两个,GET:首部+实体数据 -> 返回 200 OK;POST:首部-> 返回100 continue,实体数据 -> 200 OK。
    -但要注意GET和POST本质上都是TCP链接,并无差别,只是由于HTTP标准(RFC)的规定和服务器/浏览器的限制导致他们在应用过程中体现出了一些不同。

(3)PUT:传输文件
PUT用来传输文件,需要在请求报文的主体中包含文件内容,但由于存在安全问题,一般网站不使用该方法(或配合其他验证使用)

(4)HEAD:获得报文首部
HEAD方法和GET类似,只是不返回报文主体,用来确认URI的有效性及资源更新时间等。

(5)DELETE:删除文件
用来按请求URI删除指定的资源,与PUT相反,但同样因为安全问题,如果不配合Web应用程序的验证或遵守REST标准,一般很少单独使用。

(6)OPTIONS:询问支持的方法
咨询针对指定(URI)资源支持的方法(如POST,GET)

(7)TRACE:追踪路径
让服务器将之前的请求通信环回给客户端,因为请求过程中可能会经过中转,代理等的转发以及修改,这个方法就是用来确认连接过程中发生的一系列操作,但不常用,而且容易引发XST(跨站追踪)攻击。

(8)CONNECT:要求用隧道协议连接代理
即:在于代理服务器通信时建立隧道,用协议(TLS和SSL)把内容加密后用隧道传输。

二. 响应报文首部

1. 响应报文首部结构:

响应报文首部的结构如下图中例子所示:


响应报文首部结构

主要由响应行和响应首部字段组成。

2. HTTP状态码

状态码 类别 原因短语
1xx Informational(信息性状态码) 接受的请求正在处理
2xx Success(成功状态码) 请求正常处理完毕
3xx Redirection(重定向状态码) 需要进行附加操作以完成请求
4xx Client Error(客户端错误) 服务器无法处理请求
5xx Server Error(服务器错误状态码) 服务器处理请求出错

下面是一些常见的状态码:
(1)100 Continue 请求正在处理
(2)2xx 成功

  • 200 OK : 成功
  • 204 No Content : 成功但无内容
  • 206 Partial Content : 成功响应部分请求
    (3)3xx 重定向
  • 301 Moved Permanently : 永久性重定向,应把地址改为新的URI
  • 302 Found : 临时性重定向
  • 303 See Other : 和302类似,但要求用FET方法重发
  • 304 Not Modified : 资源已找到,但未符合客户端的附带条件
  • 305 Use Proxy : 必须通过代理访问资源,代理的地址在Response的Location中
  • 307 Temporary Redirect : 临时重定向,与302类似

三. 首部字段

首部字段主要以键值对的形式给通信对象(浏览器或服务器)传递信息,如报文大小,语言等,是HTTP首部中很重要的一部分,其结构为:“首部字段名:字段值”;
HTTP首部字段分为请求首部,响应首部,通用首部和实体首部,下面将分别介绍。

1. 请求首部字段

  • Accept:通知服务器用户代理能处理的媒体类型及相对优先级(当不止一个时),优先级可用“q=?”来表示,0
  • Accept-Charset:通知服务器支持的字符集及相对优先级
  • Accept-Encoding:支持的内容编码及优先级
  • Accept-Language:能处理的自然语言及优先级
  • Authorization:用来告诉服务器用户代理的认证信息
  • Expect:告知服务器期望出现的某种特定行为
  • From:用户的电子邮件地址
  • Host:请求资源所处的主机名和端口号,唯一一个必须首部字段
  • If-Match:当If-Match的值和ETag(实体标记)值匹配时,服务器才会接受请求
  • If-Modified-Since:表示只接受这个时间以后更新的资源,太旧的不要
  • If-None-Match:表示如果ETag值不匹配就采用这个值,与If-Match相反
  • if-Range:表示如果资源与字段值(ETag或时间)匹配就返回范围请求的内容,否则返回全部
  • If-Unmodified-Since:表示如果资源在该事件之后发生过改变则不可以
  • Max-Forwards:转发的最大次数,每经过一次转发就减一,当减为0时,停止转发并相应
  • Proxy-Authorization:给代理服务器发送认证质询
  • Range:范围请求中指定资源的范围,206表示成功响应范围请求,200表示全部返回
  • Referer:告知服务器请求的原始资源的URI
  • TE:能处理响应的传输编码方式及相对优先级
  • User-Agent:创建请求的浏览器和用户代理名称等信息

2. 响应首部字段

  • Accept-Ranges:none(无法处理范围请求)/bytes(可处理范围请求)
  • Age:告知客户端源服务器在多久前建立了响应
  • Etag:每份资源的唯一标识,分为两种:强ETag(任何细微变化都会改变其值)/弱ETag(仅资源发生根本改变才会变,附加“w/”)
  • Location:新资源的位置
  • Proxy-Authenticate:把代理服务器需要的信息发送给客户端
  • Retry-After:告知客户端多久后再次尝试,通常与503或3xx一起,可以是秒数,也可以是具体时间
  • Server:服务器上安装的HTTP服务器应用程序信息
  • Vary:源服务器发送给代理服务器需要验证的字段值,若字段符合要求则从代理返回缓存,否则从源请求返回。
  • WWW-Authenticate:用于HTTP访问认证,告知客户端适用于访问请求URI指定资源的认证方案

3. 通用首部字段

  • Cache-Control:操作缓存的工作机制
  • Connection:1.控制不再转发的首部字段;2.管理持久连接(比如,Connection:Upgrade表示删除Upgrade字段后再转发)
  • Date:表示报文创建时间
  • Pragma:HTTP/1.0遗留,与Cache-Control:no-cache类似,表示不再接受缓存
  • Trailer:事先说明在报文主体之后记录了哪些首部字段
  • Trans-Encoding:规定传输报文主体时采用的编码方式
  • Upgrade:检测HTTP或其他协议是否可使用更高版本,或指定一个完全不同的通信协议,
  • Via:通过附加经过的代理或网关的信息来追踪传输路径和避免请求回环。
  • Warning:告知用户一些与缓存相关问题的警告,格式为:[警告码][警告主机:端口号][内容][时间(可选)]

4. 实体首部字段

  • Allow:告知客户端可使用的HTTP方法
  • Content-Encoding:告知客户端实体主体部分的编码方式(gzip,compress,deflate,identity)
  • Content-Language:实体主体的自然语言
  • Content-Length:实体主体部分的大小
  • Content-Location:报文主体的URI(有时为了符合要求,返回的资源并非请求的资源)
  • Content-MD5:经过MD5算法加密后的主体的加密码,用来验证报文主体的完整性(但无法防止恶意修改)
  • Content-Range:告知客户端发送的报文内容的范围(范围请求)
  • Content-Type:实体主体的媒体类型,编码方式等
  • Expires:缓存资源的失效日期(如果超过这个日期,就需要重新请求)。
  • Last-Modified:告知客户端,资源的最后修改时间

5. 其他首部字段

(1)为Cookie服务的首部字段
当前广泛使用的Cookie是在网景公司制定的标准上进行扩展的产物,其作用是用户识别和状态管理,即保存用户的身份信息,登录时间等信息,为Cookie服务的首部字段是Set-Cookie,他有以下属性:

  1. Name:Cookie的名称和值,必须
  2. expires:Cookie有效期
  3. path:服务器上适用Cookie的文件目录
  4. domin:Cookie适用域名(默认为创建的服务器的域名)
  5. Secure:仅在HTTP安全通信时才发送Cookie
  6. HTTPOnly:使Cookie不能被JavaScript访问
    (2)其他首部字段
  • X-Frame-Options:属于响应首部,用于控制网站内容在其他Web网站的Frame标签中的显示问题,主要是为了防止点击劫持攻击,其值有:DENY:拒绝;SAMEORIGIN:仅同源域名下的页面允许被加载。
  • X-XSS-Protextion:属于响应首部字段,用于控制浏览器XSS(跨站脚本攻击)防护机制的开关,"1"表示开启。
  • DNT:属于请求首部,表示拒绝个人信息被收集,拒绝被精准广告追踪的一种方法,1表示开启,需要服务器支持
  • P3P:属于响应首部,通过利用P3P可以让个人信息变成一种仅供程序理解的形式,以达到保护用户隐私的目的,但有很多辅助工作需要做。

参考:
《图解HTTP》

你可能感兴趣的:(HTTP首部)