美文网首页
HTTP首部

HTTP首部

作者: 愤怒的灰机 | 来源:发表于2018-11-07 15:57 被阅读0次

    首先整个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<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,他有以下属性:

    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首部

          本文链接:https://www.haomeiwen.com/subject/nwlttqtx.html