前面有几篇博文介绍了HTTP协议HTTP请求方法详解Javascript中Cookie的那些事儿HTTPS,今天我们来聊一聊关于HTTP首部的那些事儿

HTTP协议的请求和响应报文中肯定包含HTTP首部,首部为服务器和客户端分别处理请求和响应提供所需要的信息。而请求报文和响应报文在结构上又惊人的相似。下面以百度为例,我们来看二者之间有什么不同:

请求报文示例:

GET / HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
Cache-Control: max-age=
Upgrade-Insecure-Requests:
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2816.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: zh-CN,zh;q=0.8
Cookie: BIDUPSID=B1B714EF2E3D00D3499B04F5B4A65E24; BAIDUID=6AE2CCD65C9379FDDA3BF5EF8C6543BE:FG=1; PSTM=1461936802; BDUSS=ZPYmZBUFdZd3B4YTdFa01CbXdIUm1CNlVMZFZMcEFRMEJiR3dWZDRxamZYTnBYQVFBQUFBJCQAAAAAAAAAAAEAAACCmStVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN%7EPslffz7JXbz; H_PS_645EC=c5b77Gs2Dx4Ykavto%2Fo7JIb9zq21sqi9nUsFbwcZ%2FgO32YeRbaHyhCrPQXs8wpPFN8vl; BD_HOME=1; H_PS_PSSID=20048_1422_19036_18282_17947_21113_17001_21189_21161_20930; BD_UPN=12314353; sug=3; sugstore=0; ORIGIN=2; bdime=0

响应报文示例:

HTTP/1.1  OK
Server: bfe/1.0.8.18
Date: Thu, Sep :: GMT
Content-Type: text/html;charset=utf-
Transfer-Encoding: chunked
Connection: keep-alive
Cache-Control: private
Expires: Thu, Sep :: GMT
Content-Encoding: gzip
X-UA-Compatible: IE=Edge,chrome=
Strict-Transport-Security: max-age=
BDPAGETYPE:
BDQID: 0x8703882800005c3f
BDUSERID:
Set-Cookie: BDSVRTM=; path=/
Set-Cookie: BD_HOME=; path=/
Set-Cookie: H_PS_PSSID=20048_1422_19036_18282_17947_21113_17001_21189_21161_20930; path=/; domain=.baidu.com
Set-Cookie: __bsi=13807309971438994139_00_100_R_N_71_0303_C02F_N_I_I_0; expires=Thu, -Sep- :: GMT; domain=www.baidu.com; path=/

比较二者的区别:在响应报文的报文首部中,分别是响应首部字段、通用首部字段、实体首部字段,而在请求报文首部中,分别是请求首部字段、通用首部字段、实体首部字段。下面我们来依次介绍。

1.通用首部

  有些首部时客户端和服务端都能使用,且提供了与报文相关的最基本信息,叫做通用首部

通用信息首部
首部 描述
Connection 允许客户端和服务器指定与请求/响应连接有关的选项。
Date 提供日期和时间标志,说明报文是什么时间创建的。
MIME-Version 给出了发送短使用的 MINE 版本。
Trailer 如果报文采用了分块传输编码(chunked transfer encoding)方式,就可以用这个首部列出位于报文拖挂(trailer)部分的首部集合。
Transfer-Encoding 告知接收端为了保证报文的可靠传输,对报文采用了什么编码方式。
Update 给出了发送端可能想要"升级"使用的新版本或协议。
Via 显示报文经过的中间节点(代理、网关)。
通用缓存首部
首部 描述
Cache-Control 用于随报文传送缓存指示。控制缓存的行为。
Pragma 另一种随报文传送指示的方式,当并不专用于缓存。

2.请求首部

  请求首部是只在请求报文中有意义的首部。

请求的信息性首部
首部 描述
Client-IP 提供了运行客户端的机器的IP地址。
From 提供了客户端用户的 Email 地址。(使用RFC 822 E-mail地址格式)
Host 给出了接受请求的服务器的主机名和端口号。
Referer 提供了包含当前请求 URI 的文档的 URL。
UA-Color 提供了与客户端显示器的现实颜色有关的信息。
UA-CPU 提供了客户端 CPU 的类型和制造商。
UA-Disp 提供了与客户端显示器能力有关的信息。
UA-OS 给出了运行在客户端机器上的操作系统名称和版本。
UA-Pixels 提供了客户端显示器的色素信息。
User-Agent 将发起请求的应用程序名告知服务器。
Accept首部

Accept首部为客户端提供了一种将其喜好和能力告知服务器的方式。Accept首部会使连接的两端都受益。

首部 描述
Accept 告诉服务器能够发送哪些媒体类型。
Accept-Charset 告诉服务器能够发送哪些字符集。
Accept-Encoding 告诉服务器能够发送哪些编码方式。
Accept-Language 告诉服务器能够发送哪些语言。
TE 告诉服务器可以使用哪些扩咱传输编码。
条件请求首部

  有时客户端希望为请求加上某些限制。比如,客户端已经有了一份文档副本,就希望只在服务器上的文档与客户端拥有的副本有区别时,才请求服务器传输文档。通过条件请求首部,客户端就可以为请求加上这种限制,要求服务器在对请求进行响应之前,确保某个条件为真。

首部 描述
Expect 允许客户端列出请求所要求的服务器行为。
If-Match 如果实体标记与文档当前的实体标记相匹配,就获取这份文档。
If-Modified-Since 除非在某个指定的日期之后资源被修改过,否则就限制这个请求。
If-None-Match 如果提供的实体标记与当前文档的实体标记不相符,就获取文档。
If-Range 允许对文档的某个范围进行条件请求。
If-Unmodified-Since 除非在某个指定日期之后资源没有被修改过,否则限制这个请求。
Range 如果服务器支持范围请求,就请求资源的指定范围。
安全请求首部
首部 描述
Authorization 包含了提供给服务器来对客户端进行自身认证的数据。
Cookie 客户端用它向服务器传送一个令牌-----它并不是真正的安全首部,但却是隐含了安全功能。
Cookie2 用来说明请求端支持的cookie版本。
代理请求首部
首部 描述
Max-Forward 在通往源端服务器的路径上,将请求转发给其他代理或网管的最大次数----与 TRACE 方法一同使用。
Proxy-Authorization 与 Authorization 首部相同,但这个首部是在于代理进行认证时使用的。
Proxy-Connection 与 Connection 首部相同,但这个首部是在于代理建立连接时使用的。

3.响应首部

响应的信息性首部
首部 描述
Age (从最初创建开始)响应持续时间。
Public 服务器为其资源支持的请求方法列表。
Retry-After 如果资源不可用的话,在此日期或时间重试。
Server 服务器应用程序软件的名称和版本。
Title 对 HTML 文档来说,就是 HTML 文档的源端给出的标题。
Warning 比原因短语更详细一些的警告报文。
协商首部
首部 描述
Accept-Ranges 对此资源来说,服务器可接受的范围类型。
Vary 服务器查看的其他首部列表,可能会使响应发生变化;也就是说,这是一个首部列表,服务器会根据这些首部的内容挑选出最适合的资源版本发送给客户端。
安全响应首部
首部 描述
Proxy-Authenticate 来自代理的对客户端的质询列表。
Set-Cookie 不是真正的安全首部,但隐含安全功能;可以在客户端设置一个令牌,以便服务器对其客户端进行标识。
Set-Cookie2 与 Set-Cookie 类似,PFC 2965 Cookie定义。
WWW-Authenticate 来自服务器对客户端的质询列表。

4.实体首部

  实体首部提供了有关实体及其内容的大量信息,请求和响应报文中都可能包含实体部分,所以这两类报文都可能出现这些首部。总之,实体首部可以告知报文的接收者它在对什么进行处理。

实体的信息性首部
首部 描述
Allow 列出可以对此事提执行的请求方法。
Location 告知客户端实际上位于何处;用于将接收端定向到资源的(可能是新的)位置(URL)上去。
内容首部

  内容首部提供了与实体内容有关的特定信息,说明了其类型,尺寸以及处理它所需要的其它有用信息。

首部 描述
Content-Base 解释主体中的相对 URL 时使用的基础 URL
Content-Encoding 对主体执行的任意编码方式。
Content-Language 理解主体时最适宜使用的自然语言。
Content-Length 主体的长度或尺寸。
Content-Locaton 资源实际所处的位置。
Content-MD5 主体的 MD5 校验和。
Content-Range 在整个资源中此实体表示的字节范围。
Content-Type 在这个主体的对象类型。
实体缓存首部

  通用的缓存首部说明了如何或者什么时候进行缓存。实体的缓存首部提供了与被缓存实体有关的信息。

首部 描述
ETag 与此实体相关的实体标记。
Expires 实体不再有效,要从原始的源端再次获取此实体的日期和时间。
Last-Modified 这个实体最后一次被修改的日期和时间。

【相关文章】

  1、HTTP协议:http://www.cnblogs.com/foodoir/p/5905946.html

  2、HTTP请求方法详解:http://www.cnblogs.com/foodoir/p/5911099.html

  3、Javascript中关于Cookie的那些事儿:http://www.cnblogs.com/foodoir/p/5914631.html

  4、HTTPS:http://www.cnblogs.com/foodoir/p/5922272.html

HTTP首部的更多相关文章

  1. 前端学HTTP之报文首部

    前面的话 首部和方法配合工作,共同决定了客户端和服务器能做什么事情.在请求和响应报文中都可以用首部来提供信息,有些首部是某种报文专用的,有些首部则更通用一些.本文将详细介绍HTTP报文中的首部 结构 ...

  2. TCP服务和首部知识点小结

    服务 应用程序会被TCP分割成数据段,而UDP不分割. TCP有超时重传和确认 如果检验和出错将丢弃 IP数据包可能会失序或者重复,所以TCP会处理 滑动窗口来进行流量控制 对字节流的内容不做任何解释 ...

  3. TCP首部解析

    TCP首部: TCP数据被封装在一个IP数据报中,如下: TCP首部数据格式: 16位源都口号,16为目的端口号用于寻找发送端和接收端的应用进程,加上IP首部的源端IP及终端IP,唯一的确认一个TCP ...

  4. IP数据报首部解析

    IP数据报首部的格式,普通20字节. 4位版本号:当前4--IPv4. 4首部长度:首部长度 8位服务类型TOS: 3bits(优先权)+ 4bits(类型--最小延迟+最大吞吐量+最高可靠性+最小费 ...

  5. http协议进阶(三)补充:报文首部

    之前写的关于报文首部的传送门: 报文首部:http://www.cnblogs.com/imyalost/p/5708445.html 通用首部字段:http://www.cnblogs.com/im ...

  6. TCP协议学习笔记(一)首部以及TCP的三次握手连接四次挥手断开

    TCP协议是一种面向连接的.可靠的流协议. 流即不间断的数据结构.这样能够保证接收到数据顺序与发送相同.但是犹如数据间没有间隔,因此在TCP通信中,发送端应用可以在自己所要发送的消息中设置一个标示长度 ...

  7. IP首部校验和的计算

    ip抓包结果:0000: 00 e0 0f 7d 1e ba 00 13 8f 54 3b 70 08 00 45 00 0010: 00 2e be 55 00 00 7a 11 51 ac de ...

  8. 计算机网络(8)-----TCP报文段的首部格式

    TCP报文段的首部格式 概述 TCP报文段首部的前20个字节是固定的,因此TCP首部的最小长度是20字节. 源端口和目标端口 各占2个字节,分别写入源端口号和目的端口号. 序列号 占4个字节,表示本报 ...

  9. IP首部校验和计算

    根据RFC1071文档的计算方法,编写代码实现IP首部校验和的计算 计算步骤: 1.首先将IP首部中校验和字段置0 2.将IP首部每16bit进行相加,如果有进位产生,则将进位加到最低位. 3.将计算 ...

随机推荐

  1. 使用EntityFramework6连接MySql数据库(db first方式)

    准备工具: VS2013.MySQL For VisualStudio 1.1.4.Connector/Net 6.8.3(百度网盘里) 程序包管理器执行命令: Install-Package Ent ...

  2. 玩转Windows服务系列——命令行管理Windows服务

    说到Windows服务的管理就不得不说通过命令行的方式管理Windows服务,因为无论是系统管理员,还是通过编程的方式调用cmd命令,命令行都是非常方便以及强大的工具. 接下来就看一下如何通过cmd命 ...

  3. 由乱序播放说开了去-数组的打乱算法Fisher–Yates Shuffle

    之前用HTML5的Audio API写了个音乐频谱效果,再之后又加了个播放列表就成了个简单的播放器,其中弄了个功能是'Shuffle'也就是一般播放器都有的列表打乱功能,或者理解为随机播放. 但我觉得 ...

  4. 微信为什么发布 Mac 版?

    因为 Mac 就是好啊就是好啊,就是好…… 打完收工,谢谢,鼓掌 piapiapia……晚安! 这么写在京城行走会不会挨板砖呢?头像已经印到书上满世界的发出去了,虽然考虑到行走江湖求一个稳字,我还特意 ...

  5. 《Entity Framework 6 Recipes》中文翻译系列 (28) ------ 第五章 加载实体和导航属性之测试实体是否加载与显式加载关联实体

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 5-11  测试实体引用或实体集合是否加载 问题 你想测试关联实体或实体集合是否已经 ...

  6. 基础才是重中之重~Emit动态构建方法(参数和返回值)

    回到目录 对于Emit我们知道它的可以动态构建程序集,类型,方法,属性等,或者说只要手动使用C#创建的东西使用Emit也都可以动态创建它们,Emit由于它的特别之处,所以在很多领域得到了广泛的应用,像 ...

  7. Docker学习笔记

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何 ...

  8. Atitit 深入理解抽象类与接口 attilax总结

    Atitit 深入理解抽象类与接口 attilax总结 1.1. 主要区别接口侧重于动作抽象..抽象类是属性名词抽象..1 1.2. 抽象层次类>>抽象类>>接口1 1.3. ...

  9. SQL 2014 AlwaysOn 搭建

    AlwaysOn底层依然采用Windows 故障转移群集的机制进行监测和转移,因此也需要先建立Windows Cluster,只不过可用性组中的数据库不一定非要再存放在共享存储上了.可以是存储在本地磁 ...

  10. iOS-常见问题

    11.21常见问题 一storyboard连线问题 产生原因:将与storyboard关联的属性删除了,但是storyboard中还保持之前所关联的属性. 解决: 点击view controller ...