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