HTTP首部都有哪些字段?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HTTP首部都有哪些字段?相关的知识,希望对你有一定的参考价值。

参考技术A 一个完整的 HTTP消息格式分三部分:

报文首部被分为:请求行(或者状态行)和请求头和和其他(如Cookie),请求头又被分为请求首部字段、通用首部字段、实体首部字段和其他
请求报文和响应报文的报文首部由以下数据构成。

报文主体通常等于实体主体,只有当传输中进行编码操作时,实体主体的内容发生变化,才导致它和报文主体产出差异。(实体主体被gzip等编码之后,再放到HTTP报文主体中,报文主体就不等于实体主体)

发送数据时,必须指明要发送的数据的类型,这时要使用 Content-Type
Content-Type 字段指明实体的类型如: text/plain 、 application/pdf 、 text/html 等,如果有报文主体有多个类型或多个范围,则Content-Type的值要置为 mutipart/form-data 或者 multipart/byteranges ,《图解HTTP》把这个叫做“多部分对象集合”

若要发送“多部分对象集合”,还要使用boundary用来分隔这些不同类型的对象

在报文主体中, boundary 字段的取值不是固定的

发送请求且要获取数据时,可以使用 Range 字段指定要获取的范围
这里讲了 Range 字段的三种取值方式

针对范围请求,服务端在发回数据的时候会带上 Content-Type: multipart/byteranges ,且响应的状态码是 206 Partial Content .如果服务器无法响应范围请求则返回 200 OK

客户端请求资源之前,可能就响应的内容进行协商,返回客户端最适合的资源
内容协商的内容包括响应资源的语言、字符集、编码方式等
首部的字段包括

顺便说一下,内容协商技术有以下3种类型

不论请求或响应,每次经过代理服务器的时候,都会在首部追加一个 Via
如请求经过两个代理服务器 proxy1 、 proxy2 时,相应的Via为:

使用首部字段 Via 是为了跟踪客户端与服务端之间的请求和响应报文的传输路径。常常和 Trace 方法一起使用。

Cache-Control 是通信双方都会用到的首部,用来处理缓存, Cache-Control 有缓存请求指令和缓存响应指令之分。
请求指令一共八个,只讲下面几个

响应指令一共10个,只讲下面几个

Upgrade 用于检测 HTTP 协议以及其他协议是否可以用更高的版本进行通信,其参数值可以用来指定一个完全不同的通信协议
如: Upgrade :TLS/1.0

Connection 首部字段具备如下作用

首部字段 Authorization 是用来告诉服务器,用户的代理认证信息(证书值)。通常,想要通过服务器认证的用户代理会在接收到返回的4.1状态码响应后,把 Authorization 加入请求中。

Expect 告诉服务器,行为服务器做出的响应行为。若服务器无法理解客户端的期望做出回应而发生错误时,会返回 417 Expectation Failed
如: Expect: 100-continue

If-xxx 这样的请求被称为条件请求。只有条件为真的时候,才会执行请求
If-Match 对应 Etag (实体标记)字段,当客户端发送 If-Match 的时候,就是要和服务端保存的 Etag 作对比,一样才得到 true 并返回响应。如果不一样则返回 412 Precondition Failed 的响应

If-Modified-Since 的指令是一个日期时间,这个时间指令会和服务器端的资源最后修改时间作对比,若资源最后修改时间比这个时间指令晚,则得到true并返回响应

与 If-Match 相反

告知服务器指定的 If-Range 字段值(Etag值或者时间)和请求资源的 Etag 值或时间相一致时,则作为范围请求处理。反之,则返回全体资源。

这是个请求首部字段
会把由代理服务器所要求的认证信息发送给客户端。

ETag 是响应首部字段。
服务器会为每一份资源分配对应的Etag值。
ETag 被分为·强Etag`值和·弱Etag·值。

基本上该字段会配合 3xx 状态码表示重定向的地址

实体主体若进行了编码压缩,则要使用 Content-Encoding 告知客户端如何解码

Expires 字段值是资源失效的日期。在 HTTP/1.1 中, Cache-Control 的 max-age 优先于 Expires

Set-Cookie各个属性如下

Cookie 会告知服务器,当客户端想获得HTTP状态管理支持时,就会在请求中包含从服务器接收到的 Cookie 。接收到多个 Cookie 时,同样也可以以多个 Cookie 形式发送。

http 请求的请求与响应的报文分析

在HTTP连接中报文分为请求(request)和响应(response)两种。每种报文在HTTP首部都有不同的字段来标识不同的用途。

1. 请求报文:HTTP协议使用TCP协议进行传输,在应用层协议发起交互之前,首先是TCP的三次握手。完成了TCP三次握手后,客户端会向服务器发出一个请求报文。请求报文的格式如下图抓包所示:

技术图片

前三行为请求行,其余部分称为request-header。请求行中的method表示这次请求使用的是get方法。请求方法的种类比较多,如option,get,post,head,put,delete,trace等,常用的主要是get,pos。Get表示请求页面信息,返回页面实体;post是请求服务器将指定文档作为请求的url中的从属实体,简单说,我们常用的在网页中填写表单然后申请等动作就是使用了post方法,填写用户名密码登录站点就使用了post方法,如下图:

技术图片

 

方法之后是URI,表示请求的页面地址,图中的“/”表示服务器的根目录。之后是表示http的版本。

请求行之后是请求首部。首部常见的部分有如下几个:

l Accept:请求的对象类型。如果是“/”表示任意类型,如果是指定的类型,则会变成“type/”。

l Accept-Language:使用的语言种类。

l Accept-Encording:页面编码种类。

l Accept-Charset:页面字符集。说到这里,需要解释以下字符集和编码的区别。字符集通常对应着一种语言,将语言中的所有字符集合起来就可以视为一种字符集,这样我们可以看出,中文并非是一种字符集,因为中文无法使用一些字符来进行表示;而编码则是将字符转换为计算机所能识别的2进制数的一种方式,例如常说的unicode,UTF-8,ANSI等等,我们在访问一些国外网站会出现乱码的原因就是因为我们浏览器所使用的编码与页面所使用的编码不能互相识别。我们常说的BIG5和GB2312都是编码。

l User-Agent:提供了客户端浏览器的类型和版本。

l Host:连接的目标主机,如果连接的服务器是非标准端口,在这里会出现使用的非标准端口。

l Connection:对于HTTP连接的处理,keep-alive表示保持连接,如果是在响应报文中发送页面完毕就会关闭连接,状态变为close。

2. 响应报文:当收到get或post等方法发来的请求后,服务器就要对报文进行响应。同样,响应报文也分为两部分。

前两行称为状态行,状态行给出了服务器的http版本,以及一个响应代码。响应代码是服务器根据请求进行查找后得到的结果的一种反馈,共有5大类。分别以1、2、3、4、5开头。1**表示接收到请求,继续进程,在发送post后可以收到该应答。

技术图片

 

2**表示请求的操作成功,在发送get后返回。

3**表示重发,为了完成操作必须进一步动作。

4**表示客户端出现错误。

5**表示服务器出现错误。

其余部分称为应答实体。

 

其中的server表示服务器软件版本,date标注了当前服务器的时间,connection标明连接关闭,抓包可以发现在响应返回后服务器向客户端发出fin包单向关闭了连接。Expires表示在某个时间以前可以不用重新缓存该页面,而cache-control表示对页面是否进行缓存。Pragma的参数no-cache表示对页面不进行缓存。而content-type表示了应答请求后返回的内容类型。Content还有内容长度和内容语言以及内容编码三个项,其中内容长度只有在请求报文中的connection值为keep-alive时才会用到。

3. Cookie:cookie是一种类似缓存的机制,它保存在一个本地的文本文件中,其主要作用是在发送请求时将cookie放在请求首部中发送给服务器,服务器收到cookie后查找自己已有的cookie信息,确定客户端的身份,然后返回相应的页面,cookie的方便之处在于可以保持一种已登录的状态,例如:我们注册一个论坛,每次访问都需要进行填写用户名和密码然后登录。而使用了cookie后,如果cookie没有到达过期时间,那么我们只需在第一次登录时填写信息然后登录,以后的访问就可以省略这一步骤。

在HTTP协议中,cookie的交互过程是这样的:首先是三次握手建立TCP连接,然后客户端发出一个http request,这个request中不包含任何cookie信息。

技术图片

 

当服务器收到这个报文后,针对request method作出响应动作,在响应报文的实体部分,加入了set-cookie段,set-cookie段中给出了cookie的id,过期时间以及参数path,path是表示在哪个虚拟目录路径下的页面可以读取使用该cookie,将这些信息发回给客户端后,客户端在以后的http request中就会将自己的cookie段用这些信息填充。

技术图片

 

如果用户在连接中通过了服务器相应的认证程序,服务器会添加一个cdb_auth到set-cookie中,这个段表示了客户端的认证信息,而客户端以后在访问过程中也会将cdb_auth信息写入自己的cookie字段。服务器每次收到http request后读取cookie,然后根据cookie的信息返回不同的页面。例如,没有通过认证的客户端在request中不会有cdb_auth,因此服务器读取cookie后,不会将通过认证的客户端的页面返回给该客户端。

 

技术图片
技术图片

以上是关于HTTP首部都有哪些字段?的主要内容,如果未能解决你的问题,请参考以下文章

图解HTTP第六章:HTTP首部

HTTP协议图--HTTP 报文首部之首部字段(重点分析)

简述 HTTP 首部字段.

七《图解HTTP》- HTTP首部和HTTP协作服务器

(chap6 Http首部) 其他首部字段

HTTP 首部字段详细介绍