一 . HTTP协议及网络基础
1.http协议是什么?
*`超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。
1960年美国人Ted Nelson构思了一种通过计算机处理文本信息的方法,并称之为超文本(hypertext),这成为了HTTP超文本传输协议标准架构的发展根基。
Ted Nelson组织协调万维网协会(World Wide Web Consortium)和互联网工程工作小组(Internet Engineering Task Force )共同合作研究,最终发布了一系列的RFC,其中著名的RFC 2616定义了HTTP1.1。`*
–《百度百科》
2.OSI (开放系统互联(Open System Interconnection))
OSI是Open System Interconnection的缩写,意为开放式系统互联。国际标准化组织(ISO)制定了OSI模型,该模型定义了不同计算机互联的标准,是设计和描述计算机网络通信的基本框架。OSI模型把网络通信的工作分为7层,分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。
- 物理层: 建立、维护、断开物理连接。将数据转换为可通过物理介质传送的电子信号,相当于邮局中的搬运工人。
- 数据链路层: 决定访问网络介质的方式。在此层将数据分帧,并处理流控制。本层指定拓扑结构并提供硬件寻址,相当于邮局中的装拆箱工人。建立逻辑连接、进行硬件地址寻址、差错校验等功能。将比特组合成字节进而组合成帧,用MAC地址访问介质,错误发现但不能纠正。
- 网络层: 使用权数据路由经过大型网络 ,当于邮局中的排序工人。进行逻辑地址寻址,实现不同网络之间的路径选择。
协议有:ICMP IGMP IP(IPV4 IPV6) ARP RARP - 传输层: 提供终端到终端的可靠连接 相当于公司中跑邮局的送信职员。定义传输数据的协议端口号,以及流控和差错校验。
协议有:TCP UDP,数据包一旦离开网卡即进入网络传输层 - 会话层: 允许用户使用简单易记的名称建立连接 相当于公司中收寄信、写信封与拆信封的秘书。建立、管理、终止会话。(在五层模型里面已经合并到了应用层)对应主机进程,指本地主机与远程主机正在进行的会话
- 表示层: 协商数据交换格式 相当公司中简报老板、替老板写信的助理。数据的表示、安全、压缩。(在五层模型里面已经合并到了应用层)
格式有,JPEG、ASCll、DECOIC、加密格式等 - 应用层: 用户的应用程序和网络之间的接口老板。网络服务与最终用户的一个接口。
协议有:HTTP FTP TFTP SMTP SNMP DNS TELNET HTTPS POP3 DHCP
3.与HTTP关系密切的协议
IP地址和IP协议
IP地址:互联网协议地址,是IP Address的缩写,是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。
IP协议:负责传输的协议,位于网络层(Internet Proctor)几乎所有的网络系统都会使用到IP协议。
IP地址和IP协议的联系
IP地址与IP协议是不同的传输过程中需要的两个重要条件。一个是IP地址,一个为MAC地址,IP地址指明了节点被分配的地址,MAC地址是指网卡所属的固定地址;IP地址和MAC地址可以相互匹配,IP地址可以改变,但MAC地址一般保持不变,IP间的通信依赖于MAC地址。
在网络中,一般传输时,双方不处于同一局域网内,所以这时我们需要经过多台计算机转发才可以达到目的地,而在中转时会利用下一站中转设备的MAC地址来搜索下一个中转目标,这时,会采用ARP协议(Address Resolution Protocol),ARP是一个地址解析协议,根据通信方的IP地址就可以反查处对应的MAC地址。因为网络世界很大,我们无法完全掌握,所以在传输中不能准确的选择发送到目标,所以我们采用路由选择机制,这种机制和快递很像。
TCP协议
确保可靠性的协议,为了能够无误地将数据送达到目标,TCP协议采用了三次握手策略。用TCP协议把数据包发送出去后,TCP不会对传递后的情况置之不理,而是等待向对方确认是否成功发送。在此过程中使用了TCP的标志(flag)-SYN(synchronize)和ACK(acknowledgment)。
DNS服务
和HTTP服务一样位于应用层,提供域名到IP地址之间的解析服务
URI和URL
- URI:统一资源标识符
URI是Uniform Resource Identifier 的缩写。
Uniform(统一的,制服):规定统一的格式可方便的处理多种不同类型的资源,而不用根据上下文环境来识别资源指定的访问方式。另外,加入新增的协议方案(如:HTTP:或FTP:)也更容易
Resource(资源,财力):资源的定义是“可标识的任何东西”。除了文档文件、图像或服务(例如当天的天气预报)等能够区别于其他类型的,全都可作为资源。另外,资源不仅可以是单一的,也可以是多数的集合体
Identifier(标识符,认同者):表示可标识的对象。也称作标识符。
- URL:统一资源定位符
统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它
二. 协议返回状态码
HTTP状态码负责表示客户端HTTP请求的返回结果、标记服务器端的处理是否正常、通知出现的错误等工作。当然可以自定义状态码.
类别 | 信息 | 原因短语 |
---|---|---|
1XX | Informational(信息性状态码) | 接收的请求正在处理 |
2XX | Success(成功状态码) | 请求正常处理完毕 |
3XX | Redirection(重定向状态码) | 需要进行附加操作已完成请求 |
4XX | Client Error(客户端错误状态码) | 服务器无法处理请求 |
5XX | Server Error(服务端错误状态码) | 服务器处理请求出错 |
1. 1xx继续
状态码 | 信息 | 表示 |
---|---|---|
100 | continue | 用户应该继续发送请求 |
101 | Switching Protocols | 服务器已经理解了客户端的请求,并将通过Upgrade 消息头通知客户端采用不同的协议来完成这个请求 |
102 | Processing | 由WebDAV(RFC 2518)扩展的状态码,代表处理将被继续执行 |
2. 2xx成功
状态码 | 信息 | 表示 |
---|---|---|
200 | OK | 从客户端发来的请求在服务端被正常处理 |
201 | Created | 已经创建。成功请求并创建了新的资源 |
202 | Accept | 已接收。已经接受请求,但未处理完成 |
203 | Non-Authoritative | 非授权信息,请求成功,但返回的meta信息不在原始的服务器,而是一个副本 |
204 | No Content | 服务端接收的请求已成功处理,但在返回的响应报文中不含实体的主体部分,另外也不允许返回任何实体的主体 |
205 | Reset Content | 重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域 |
206 | Partial Content | 客户端进行了范围请求, 而服务器成功执行了这部分请求,响应报文中包含由Content—Range 指定的范围的实体内容 |
3. 3xx重定向
状态码 | 信息 | 表示 |
---|---|---|
301 | Moved Permanently | 永久性重定向 |
302 | Found | 临时性重定向 |
303 | See Others | 由于对应的资源存在着另一个URI,应使用GET方法定向获取请求的资源 |
304 | Not Modified | 客户端发送附带条件的请求,也就是资源找到了,但是没有符合条件请求 |
305 | Use Proxy | 使用代理。所请求的资源必须通过代理访问 |
307 | Tempoeary Redirectt | 临时重定向,和302很相似,但是会根据游览器不同导致出现不同问题 |
注意:当301、302、303响应状态码返回时,几乎所有的游览器都会把POST改为GET,并删除请求报文内的主体,之后请求会自动再次发送。
301、302标准是禁止将POST改为GET方法,但实际使用时都会改变
304的请求附加条件是指采用GET方法的请求报文中包含If-Match、If-Modified-Since、IF-None-Match、IF-Range、If-Unmodified-Since中的任一首部
4. 4xx客户端错误
状态码 | 信息 | 表示 |
---|---|---|
400 | Bad Request | 请求报文中存在语法错误:游览器会像200 OK 一样对待改状态码 |
401 | Unauthorized | 发送的请求需要通过http认证(BASIC认证、DIGEST认证)的认证信息,如果前面已经请求过一次,证明认证失败 |
403 | Forbidden | 请求资源的访问被服务器拒绝 |
404 | Not Found | 服务器无法找到请求的资源 |
405 | Method Not Allowed | 客户端请求中的方法被禁止 |
406 | Not Acceptable | 务器无法根据客户端请求的内容特性完成请求 |
407 | Proxy Authentication Required | 请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权 |
408 | Request Time-out | 服务器等待客户端发送的请求时间过长,超时 |
409 | Conflict | 服务器完成客户端的PUT请求是可能返回此代码,服务器处理请求时发生了冲突 |
410 | Gone | 客户端请求的资源已经不存在。410不同于404,如果资源以前有现在被永久删除了可使用410代码,网站设计人员可通过301代码指定资源的新位置 |
411 | Length Required | 服务器无法处理客户端发送的不带Content-Length的请求信息 |
412 | Precondition Failed | 客户端请求信息的先决条件错误 |
413 | Request Entity Too Large | 于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息 |
414 | Request-URI Too Large | Too Large 请求的URI过长(URI通常为网址),服务器无法处理 |
415 | Unsupported Media Type | 服务器无法处理请求附带的媒体格式 |
416 | Requested range not satisfiable | 客户端请求的范围无效 |
417 | Expectation Failed | 服务器无法满足Expect的请求头信息 |
5. 5xx服务端错误
状态码 | 信息 | 表示 |
---|---|---|
500 | Internal Server Error | 服务器内部错误,无法完成请求 |
501 | Not Implemented | 服务器不支持请求的功能,无法完成请求 |
502 | Bad Gateway | 作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应 |
503 | Service Unavailable | 由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中 |
504 | Gateway Time-out | 充当网关或代理的服务器,未及时从远端服务器获取请求 |
505 | HTTP Version not supported | 服务器不支持请求的HTTP协议的版本,无法完成处理 |
三. 请求相应过程
1. 域名解析:
把域名指向网站IP,让人们通过注册的域名可以方便的访问到网站的一种服务。
在浏览器输入网址后,会先去本机的hosts文件中查看有没有配置,如果有配置则访问该项目,否则再去DNS中配置的服务器中查找,如果仍然没有,则会作为搜索条件,在百度中显示出来。
2.三次握手建立连接
即对每次发送的数据量是怎么跟踪协商使数据段的发送和接收同步,根据所接收到的数据量而确定的数据确认及数据发送,接收完毕后何时撤销联系,并建立虚连接。
3.四次挥手
别名连接终止协议。其性质为终止协议。
4.请求结构
4.1请求行
4.1.1 请求方法
方法 | 详细 |
---|---|
GET | 请求获取服务器资源,返回报文主体(获取信息) |
HEAD | 用于确认URI的有效性及资源更新的日期时间等,和GET一样,只不过不返回主体(只返回响应头) |
POST | 向指定资源提交数据进行处理请求。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改(提交表单或者上传文件) |
PUT | 从客户端向服务器传送的数据取代指定的文档的内容(更新) |
DELETE | 请求服务器删除指定的页面(删除) |
CONNECT | HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。要求使用隧道协议连接代理(代理) |
OPTIONS | 允许客户端查看服务器的性能,询问支持的方法(跨域) |
TRACE | 回显服务器收到的请求,主要用于测试或诊断。追踪路径(调试) |
4.1.2 协议版本
HTTP/0.9 已过时。只接受 GET 一种请求方法,没有在通讯中指定版本号,且不支持请求头。由于该版本不支持 POST 方法,所以客户端无法向服务器传递太多信息。
HTTP/1.0 这是第一个在通讯中指定版本号的HTTP 协议版本,至今仍被广泛采用,特别是在代理服务器中。
HTTP/1.1 当前版本。持久连接被默认采用,并能很好地配合代理服务器工作。还支持以管道方式同时发送多个请求,以便降低线路负载,提高传输速度。
4.2 请求头部
4.2.1 常用请求头
首部字段名 | 说明 |
---|---|
Accept | 用户代理可处理的媒体类型 |
Accept-Charset | 优先的字符集 |
Accept-Encoding | 优先的内容编码 |
Accept-Language | 优先的语言(自然语言) |
Authorization | Web认证信息 |
Expect | 期待服务器的特定行为 |
From | 用户的电子邮箱地址 |
Host | 请求资源所在服务器 |
If-Match | 比较实体标记(ETag) |
If-Modified-Since | 比较资源的更新时间 |
If-None-Match | 比较实体标记(与 If-Match 相反) |
If-Range | 资源未更新时发送实体 Byte 的范围请求 |
If-Unmodified-Since | 比较资源的更新时间(与 If-Modified-Since 相反) |
Max-Forwards | 最大传输逐跳数 |
Proxy-Authorization | 代理服务器要求客户端的认证信息 |
Range | 实体的节点范围请求 |
Referer | 对请求中 URI 的原始获取方 |
TE | 传输编码的优先级 |
User-Agent | HTTP 客户端程序的信息 |
1. 内容协商
-
(1)
Accept
首部字段可通知服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级。可使用 type/subtype 这种形式,一次指定多种媒体类型。若想要给显示的媒体类型增加优先级,则使用 q= 来额外表示权重值,用分号(;)进行分隔。权重值q
的范围是0-1
(可精确到小数点后3位),且1为最大值。不指定权重 q 值时,默认权重为q=1.0
。Accept: text/html , application/xhtml+xml , application/xml ; q=0.9 ,*/* ; q=0.8
当服务器提供多种内容时,将会首先返回权重值最高的媒体类型。
以下是常用的媒体类型
a.文本文件类型
text/html
text/plain
text/css
appllication/xhtml+xml
application/xml
…b.图片文件类型
image/jpeg
image/gif
image/png
…c.视频文件类型
video/mpeg
video/quicktime
…d.应用程序使用的二进制文件
application/octet-strea
application/zip -
(2)
Accept-charset
首部字段可用来通知服务器用户代理支持的字符集及字符集的相对优先顺序。另外,可一次性指定多种字符集。与首部字段Accept
相同的是可用权重q
值来表示相对优先级。Accept-Charset: utf-8, iso-8859-1;q=0.5
-
(3)
Accept-Language
用来告知服务器用户代理能够处理的自然语言集(指中文或者英文等),以及自然语言集的相对优先级。可一次指定多种自然语言集,采用权重q
来进行表示相对优先级,与首部字段Accept
相同,在下述例子中,客户端在服务器有中文版资源的情况下,会请求其返回中文版对象的响应,没有中文版时,则请求返回英文版响应。Accept-Language: zh-cn, zh; q=0.7, en-us,en; q=0.3
-
(4)
Accept-Encoding
首部字段用来告知服务器用户代理支持的内容编码及内容编码的优先级顺序。可一次性指定多种内容编码。采用权重 q 来进行表示相对优先级,与首部字段 Accept 相同,另外,也可以使用星号(*)作为通配符,指定任意的编码格式。Accept-Encoding: gzip, deflate
下面列举一些内容编码
a. gzip
由文件压缩程序 gzip(GUN zip)生成的编码格式(RFC1952),采用 Lempel-Ziv 算法(LZ77)及32位循环冗余校验(Cyclic Redundancy Check,通称 CRC)
b. compress
由 UNIX 文件压缩程序 compress 生成的编码格式,采用 Lempel-Ziv-Welch 算法(LZW)。
c. deflate
组合使用 zlib 格式(RFC1950)及由 deflate 压缩算法(RFC1951)生成的编码格式。
d.identity
不执行压缩或不会变化的默认编码格式。
2. 缓存控制
形如 If-xxx 这样的请求首部字段,都可以称为条件请求。服务器接收到附带条件的请求后,只有判断指定条件为真时,才会执行请求。
-
(1)
If-Match
属附带条件之一,它会告知服务器匹配资源所用的实体标记(ETge
)值。这时的服务器无法使用弱ETge
值。服务器会对比If-Match
的字段值和资源的ETge
值,仅当两者一致时,才会执行请求。。反之,则返回状态412 Precondition Failed
的响应。If-Match: "123456"
还可以使用星号(
*
)指定If-Match
的字段值。针对这种情况,服务器将会忽略ETge
的值,只有资源存在就处理请求 -
(2)
If-None-Match
属于附带条件之一。它和首部字段If-Match
作用相反。用于指定If-None-Match
字段值的实体标记(ETge
)值与请求资源的ETge
不一致时,它就会告知服务器处理该请求。在GET
和HEAD
方法中使用首部字段If-None-Match
可获取最新的资源。因此,这与使用首部字段If-Modified-Since
时有些类似。 -
(3)
If-Modified-Since
字段指定的日期时间后,资源发生了更新,服务器会接受请求,而在指定 If-Modified-Since 字段值的日期时间之后,如果请求的资源都没有过更新,则返回状态码 304 Not ModifiedIf-Modified-Since: Thu, 15 Apr 2018 00:00:00 GMT
If-Modified-Since
用于确认代理或客户端拥有本地资源的有效性。获取资源的更新日期时间,可通过确认首部字段Last-Modified
来确定. -
(4) If-Unmodified-Since 和 If-Modified-Since 的作用相反。它的作用就是告知服务器,指定的请求资源只有在字段值内定的日期时间之后,未发生更新的情况下,才能处理请求。如果在指定日期时间后发生了更新,则以状态码 412 Precondition Failed 作为响应返回。
If-Unmodified-Since: Thu, 03 Jul 2018 00:00:00 GMT
-
(5)
If-Range
属于附带条件之一。它告知服务器若指定If-Range
字段值(与ETge
值或者时间)和请求资源的ETge
值或时间相一致时,则作为范围请求处理。反之,则返回全体资源。如果不使用 If-Range 时,则需要进行两次请求
服务器端的资源如果更新,那客户端持有资源中的一部分也会随之无效,当然,范围请求作为前提也是无效的。这时,服务器会暂且以状态码 412 Precondition Failed 作为响应返回,其目的是催促客户端再次发送请求。这样一来,与使用首部字段 If-Range 比起来,就需要花费两倍功夫。
3. 其他请求头
-
(1)
User-Agent
会将创建请求的游览器和用户代理名称等信息传达给服务器。由网络爬虫发起请求时,有可能会在字段内添加爬虫的电子邮件地址。此外,如果经过代理,那么中间也很可能被添加上代理服务器的名称。User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36
-
(2) Referer`记录发送请求的 URI 是从哪个 Web 页面发起的.
Referer: http://www.example.com/index.html
-
(3)
Expect
是客户端用来告知服务器,期望出现的某种特定行为。因服务器无法理解客户端的期望作出回应而发生错误时,会返回状态码417 Expectation Failed
。Expect: 100-continue
客户端可以利用该首部字段,写明所期望的扩展。虽然 HTTP/1.1 规范只定义了 100-continue(状态码 100 Continue 之意)。等待状态码 100 响应的客户端在发生请求时,需要指定 Expect: 100-continue 。
-
(4)
Host
和以单台服务器分配多个域名的虚拟主机的工作及制有密切的关联,这是首部字段Host
必须存在的意义。请求被发送至服务器时,请求中的主机名会用 IP 地址直接替换解决。Host: www.example.com
但如果这时,相同的 IP 地址下部署运行着多个域名时,那么服务器就会无法理解究竟是哪个域名对应的请求。因此,就需要使用首部字段 Host 来明确指出请求的主机名。若服务器未设定主机名,那直接发送一个空值即可。
Host 是用来告知服务器,请求的资源所处的互联网主机名和端口号。
Host 首部字段是 HTTP/1.1 规范内是唯一一个必须被包含在请求内的首部字段。 -
(5)
Authorization
是用来告知服务器,用户代理的认证信息(证书值)。通常,想要通过服务器认证的用户代理会在接受到返回的401
状态码响应后,把首部字段Authorization
加入请求中。公众缓存在接受到含有Authorization
首部字段的请求时的操作处理会略有差异。``` Authorization: Basic dWVub3N1bjpwYXHzd29yZA== ```
-
(6)
Proxy-Authorization
接受到从代理服务器发来的认证质询时,客户端会发送包含首部字段Proxy-Authorization
的请求,以告知服务器认证所需要的信息。Proxy-Authorization: Basic YWRtaW4lM0FhZG1pbg==
这个行为是与客户端和服务器之间的HTTP访问认证相类似的,不同之处在于,认证行为发生在客户端与代理之间。客户端与服务器之间的认证,使用首部字段 Authorization 可起到相同作用。
-
(7)
From
是用来告知服务器使用用户代理的用户的电子邮件地址。From: info@example.com
通常,其使用目的就是为了显示搜索引擎等用户代理的负责人的电子邮件联系方式。使用代理时,应尽可能包含
From
首部字段(但可能会因代理不同,将电子邮件地址记录在User-Agent
首部字段中)。 -
(8)
Max-Forwards
,通过 TRACE 方法或 OPTIONS 方法,发送含有首部字段 Max-Forwards 的请求时,该字段以十进制整数形式指定可经过的服务器最大数目。服务器在往下一个服务器转发请求之前,会将 Max-Forwards 的值减一后重新赋值。当服务器接收到 Max-Forwards 值为 0 的请求时,则不再进行转发。而是直接返回响应。Max-Forwards: 2
使用 HTTP协议通信时,请求可能会经过代理等多台服务器。途中,如果代理服务器由于某些原因导致请求转发失败,客户端也就等不到服务器返回的响应了。对此,我们无从可知。
可以灵活使用首部字段 Max-Forwards 字段值为 0 ,服务器就会立即返回响应,由此我们至少可以对以那台服务器为终点的传输路径的通信状况有所把握 -
(9)
Range
对于只需获资源的范围请求,包含首部字段 Range 即可告知服务器资源的指定范围。下面的示例表示请求获取从第 5001 字节到第 10000 字节的资源。Range: bytes=5001-10000
接收到附带
Range
首部字段请求的服务器,会在处理请求之后返回状态码为206 Partial Content
的响应。无法处理该范围请求时,则会返回状态码200 OK
的响应及全部资源。 -
(10) TE
会告知服务器客户端能够处理响应的传输编码方式及相对优先级。它和首部字段
Accept-Encoding` 的功能很像,但是用于传输编码。TE: gzip, deflate; q=0.5
首部字段
TE
除指定传输编码之外,还可以指定伴随trailer
字段的分块传输编码的方式。应用后者时,只需把trailer
赋值给该字段值。TE: trailers
4.3请求体(请求数据)
-
(1)
application/json
: 作为Content-Type
作为响应头用来告诉服务端消息主体是序列化后的JSON
字符串 -
(2)
text/xml
:使用HTTP
作为传输协议,XML
作为编码方式的远程调用规范。 -
(3)
Query String:application/x-www-form-urlencoded
:最常见的 POST 提交数据的方式了。浏览器的原生 表单,如果不设置enctype
属性,那么最终就会以application/x-www-form-urlencoded
方式提交数据。注意:多个键值对之间用&连接,键与值之前用=连接,且只能用ASCII字符,非ASCII字符需使用UrlEncode编码。大部分服务端语言都对这种方式有很好的支持。例如 PHP 中,
$_POST['title']
可以获取到 title 的值,$_POST['sub']
可以得到 sub 数组。 -
(4)
multipart/form-data
:,文件上传时会被使用,这种格式最先应该是被用于邮件传输中,每个字段/文件都被boundary(Content-Type中指定)分成单独的段.
5.响应结构
5.1 状态行
状态行中所存在的东西,在上文中已经介绍过,这里不再重复介绍。
5.2 响应头
-
(1)
Accept-Ranges
是用来告知客户端服务器是否能处理范围请求,以指定获取服务器某个部分资源。
可指定的字段值有两种,可处理范围请求时指定其为bytes
,反之则指定为none
。Accept-Ranges: bytes
Accept-Ranges: none
-
(2)
Age
告知客户端,源服务器在多久前创建了响应。字段值单位为秒。若创建该响应的服务器是缓存服务器,Age
值是指缓存后的响应再次发起认证到认证完成的时间值。代理创建响应时必须加上首部字段Age
。Age: 600
-
(3)
ETge
能够告知客户端实体标识。它是一种可将资源以字符串形式做唯一标识的方式。服务器会为每份资源分配对于的ETge
值,另外,当资源更新时,ETge
值也需要更新。生成ETge
值时,并没有统一的算法规则,而是仅仅由服务器来分配。
资源被缓存时,就会被分配唯一性标识。例如,当使用中文版的浏览器访问 http://www.google.com 时,就会返回中文版对于的资源,当时有英文版版时,返回的就是英文版资源,两者的 URI 是相同的,所以仅凭 URI 指定缓存的资源是相当困难的。若在下载过程中出现连续中断/再连接的情况,都会依照ETge
值来指定资源。强 ETge 值,不论实体发生多少细微的变化都会改变其值。
ETge: "usagi-1234"
弱 ETge 值只用于提示资源是否相同。只有资源发生了根本改变,产生差异时才会改变 ETge 值。这时,会在字段值最开始处附加 W/ 。
ETge: W/"usagi-1234"
-
(4)
Location
可以将响应接受方引导至某个与请求URI
位置不同的资源。基本上,该字段会配合 3xx : Redirection 的响应,提供重定向的 URI。几乎所有的游览器在接受到包含首部字段 Location 的响应后,都会强制性地尝试对已提示的重定向资源的访问。Location: http://www.example.com
-
(5)
Proxy-Authenticate
会把由代理服务器所要求的认证信息发送给客户端。
它与客户端和服务器之间的 HTTP 访问认证的行为相似,不同之处在于其认证行为是在客户端与代理之间进行的。而客户端与服务器之间进行认证时,首部字段WWW-Authorization
有着相同的作用.Proxy-Authenticate: Basic realm="Usagidesign Auth"
-
(6)
Retry-After
告知客户端应该在多久之后再次发送请求。主要配合状态码503 Service Unavailable
响应,或3xx Redirect
响应一起使用。字段值可以指定为具体时间(Wed, 04 Jul 2012 06: 34: 23 GMT 等格式),也可以是创建响应后的秒数。Retry-After : 120
-
(7)
Server
告知客户端当前服务器上安装的HTTP
服务器应用程序的信息。不单单会标出服务器上的软件应用名称,还有可能包含版本号和安装时启用的可选项。Server: Apache/2.26 (Unix) PHP/5.2.5
注意:一旦自己服务器使用的为旧版本,并且漏洞已经被放出来的,最好在隐藏此字段或者自己随意改个名称,以防有人使用已知漏洞攻击服务器.
-
(8)
Vary
可对缓存进行控制。源服务器会向代理服务器传达关于本地缓存使用方法的指令。从代理服务器接受到源服务器返回包含Vary
指定项的响应之后,若再要进行缓存,仅对请求中含有相同Vary
指定首部字段的请求返回缓存。即使对相同资源发起请求,但由于Vary
指定的首部字段不相同,因此必须要从源服务器重新获取资源。Vary: Accept-Language
-
(9)
WWW-Authenticate
用于HTTP
访问认证。它会告知客户端适用于访问请求URI
所指定资源的认证方案(Basic
或是Digest
)和带参数提示的质询(challenge
)。状态码401 Unauthorized
响应中,肯定带有首部字段WWW-Authenticate
。WWW-Authenticate: Basic realm="Usagidesign Auth"
上述示例中,realm 字段的字符串是为了辨别请求 URI 指定资源所受到的保护策略。
6.实体头字段
首部字段名 | 说明 |
---|---|
Allow | 服务器支持的HTTP请求方法 |
Content-Encoding | 编码方式 |
Content-Language | 实体主体使用的自然语言 |
Content-Length | 实体部分大小 |
Content-Location | 返回资源的URI |
Content-MD5 | 主题执行md5算法 |
Content-Range | 范围请求 |
Content-type | 媒体类型 |
Expires | 资源到期时间 |
Last-Modified | 最终修改时间 |
-
(1)
Allow
用于通知客户端能够支持Request-URI
指定资源的所有HTTP
方法。 当服务器接收到不支持的HTTP
方法时,会以状态码405 Method Not Allowed
作为响应返回。与此同时,还会把所有能支持的HTTP
方法写入首部字段Allow
后返回。Allow : GET,HEAD
-
(2)
Content-Encoding
会告知客户端服务器对实体的主体部分选用的内容编码方式(gzip | compress | deflate | identity)。内容编码是指在不丢失实体信息的前提下所进行的压缩。Content-Encoding: gzip
-
(3)
Content-Language
会告知客户端,实体主体使用的自然语言(指中文或英文等语言)Content-Language: zh-CN
-
(4)
Content-Length
表明了实体主体部分的大小(单位是字节)。对实体主体进行内容编码传输时,不能再使用Content-Length
首部字段。由于实体主体大小的计算方式略微有些复杂,所以在此不再展开。若想一探究竟,可参考 RFC2616 的 4.4Content-Length: 15000
-
(5)
Content-Location
给出与报文主题部分相对应的URI
。和首部字段Location
不同,Content-Location
表示的是报文主体返回资源对应的URI
。
比如,对于使用首部字段Accept-Language
的服务器驱动型请求,当返回的页面内容与实际请求的对象不同时,首部字段Content-Location
内会写明URI
。(访问http://www.example.com/
返回的对象却是http://www.example.com/index.html
等类似情况)。Content-Location: httpo://www.example.com/index.html
-
(6)
Content-MD5
是一串由MD5
算法生成的值,其目的在于检查报文主体在传输过程中是否保持完整,以及确认传输到达。对报文主体执行MD5
算法获得218位二进制数,再通过Base64
编码后将结果写入Content-MD5
字段值。由于HTTP
首部无法记录二进制值,所以要通过Base64
编码处理。为确保报文有效性,作为接受方的客户端会对报文主体在执行一次相同的MD5
算法。计算出的值与字段值作比较候鸟,即可判断出报文主体的准确性。Content-MD5: ZTEwYWRjMzk0OWJhNTlhYmJlNTZlMDU3ZjIwZjg4M2U=
采用这种方法,对内容上的偶发生性改变是无从查证的,也无法检测出恶意篡改。其中一个原因在于,内容如果能够被篡改,那么同时意味着
Content-MD5
也可重新计算然后被篡改。所以处在接受阶段的客户端是无法意识到报文主体以及首部字段Content-MD5
是已经被篡改过的。 -
(7)
Content-Range
告知客户端作为响应返回的实体哪个部分符合范围请求。字段值以字节为单位,表示当前发送部分及整个实体大小。Content-Type: text/html; charset=utf-8
-
(8)
Content-Type
说明实体主体内对象的媒体类型。和首部字段Accept
一样,字段值用type/subtype
形式赋值Last-Modified: wed, 25 May 2018 09:11:40 GMT
-
(9)
Expires
会将资源失效日期告知客户端。缓存服务器在接收到含有首部字段Expires
的响应后,会以缓存来应答请求,在Expires
字段值指定的时间之前,响应的副本会一直被保存。当超过指定的时间后,缓存服务器在请求发送过来时,会转向源服务器请求资源。
源服务器不希望缓存服务器对资源缓存时,最好在Expires
字段内写入与首部字段Date
相同的时间值。
但是,当首部字段Cache-Control
有指定max-age
指令时,比起首部字段Expires
,会优先处理max-age
指令Expires: Wed, 04 Jul 2012 08:26:05 GMT
-
(10)
Last-Modified
指明资源最终修改时间。一般来说,这个值就是Request-URI
指定资源被修改的时间。但类似使用CGI
脚本进行动态数据处理时,该值有可能会变成数据最终修改时的时间。Last-Modified: wed, 25 May 2018 09:11:40 GMT
7.Cookie相关和其他的首部字段
第一节 为 Cookie 服务的首部字段
管理服务器与客户端之间状态的 Cookie ,虽然没有被编入标准化 HTTP/1.1 的 RFC2616 中,但在 Web 网站方面得到广泛的应用。
Cookie 的工作机制是用户识别及状态管理。web 网站为了管理用户的状态会通过 web 游览器,把一些数据临时写入用户的计算机内。接着当用户访问该 web 网站时,可通过通信方式取回之前存放的 Cookie 。
调用 Cookie 时,由于可校验 Cookie 的有效期,以及发送方的域、路径、协议等信息,所以正规发布的
Cookie 内的数据不会因来自其他 web 站点和攻击者的攻击而泄露。
在目前使用最广泛的 Cookie 标准却不是 RFC 中定义的任何一个。而是在网景公司指定的标准上进行扩展后的产物。
下面是与 Cookie 有关的首部字段
首部字段名 | 说明 | 首部类型 |
---|---|---|
Set-Cookie | 开始状态管理所使用的 Cookie 信息 | 响应首部字段 |
Cookie | 服务器接收到的 Cookie 信息 | 请求首部字段 |
Set-Cookie
当服务器准备开始管理客户端的状态时,会事先告知各种信息
Set-Cookie: status-enable; expires=Tue, 05 Jul 2018 02:01:22 GMT; path=/; domain=.example.com;
属性 | 说明 |
---|---|
NAME=VALUE | 赋予 Cookie 的名称和其值(必须项) |
expires=DATE | Cookie 的有效期(若不明确指定则默认为游览器关闭前为止) |
path=PATH | 将服务器上的文件目录作为 Cookie 的适用对象(若不指定则默认文档所在的文件目录) |
domain=域名 | 作为 Cookie 适用对象的域名(若不指定则默认为创建 Cookie 的服务器域名) |
Secure | 仅在 HTTPS 安全通信时才会发送 Cookie |
HttpOnly | 加以限制,使 Cookie 不能被 JavaScript 脚本访问 |
-
(1)
expires
属性
Cookie
的expires
属性指定游览器可发送Cookie
的有效期。
当省略expires
属性时,其有效期仅限于维持游览器会话(Session)时间段内。这通常限于游览器应用程序被关闭之前。
另外,一旦Cookie
从服务器端发送至客户端,服务器端就不存在可以显示删除Cookie
的方法。但可以通过覆盖已过期的Cookie
,实现对客户端Cookie
的实质性删除操作。 -
(2)
path
属性
Cookie
的path
属性可用于限制指定Cookie
的发送范围的文件目录。不过另有办法避开这项限制,看来对其作为安全机制的效果不能报有期待。 -
(3)
domain
属性
通过Cookie
的domain
属性指定的域名可做到与结尾匹配一致。比如,当指定example.com
后,除example.com
以外,www.example.com
或www2.example.com
等都可以发送Cookie
。
因此,除了针对具体指定的多个域发送Cookie
之外,不指定domain
属性显得更安全。 -
(4)
secure
属性
Cookie
的secure
属性用于限制web
页面仅在HTTPS
安全连接时,才可以发送Cookie
。
发送Cookie
时,指定secure
属性的方法如下所示。Set-Cokkie: name=VALUE; secure
以上例子仅当在 https://www…(HTTPS)安全连接的情况下才会进行 Cookie 的回收,也就是说,即使域名相同,http://www…(HTTP)也不会发生 Cookie 的回收行为。
当省略 secure 属性时,不论 HTTP 还是 HTTPS ,都会对 Cookie 进行回收。 -
(5)
HttpOnly
属性
Cookie
的HttpOnly
属性是Cookie
的扩展功能,它使JavaScript
脚本无法获得Cookie
。其主要目的为防止跨站脚本攻击(Cross-sitescripting
,XSS
)对Cookie
的信息窃取。发送指定
HttpOnly
属性的Cookie
的方法如下所示。Set-Cookie: name=value; HttpOnly
通过上述设置,通常从
web
页面内还可以对Cookie
进行读取操作。但使用JavaScript
的document.cookie
就无法读取附加HttpOnly
属性后的Cookie
的内容了。因此,也就无法在XSS
中利用JavaScript
劫持Cookie
了。
虽然是独立的扩展功能,但Internet Explorer 6 SP1
以上版本等当下的主流游览器都已经支持该扩展了。另外顺带一提,该扩展并非是为了防止XSS
而开发的。
Cookie
Cookie: status=enable
Cookie
会告知服务器,当客户端想获得 HTTP
状态管理支持时,就会在请求中包含从服务器接受到的 Cookie
。接受到多个 Cookie
时,同样可以以多个 Cookie
形式发送。
其他首部字段
HTTP 首部字段是可以自行扩展的。所以在 Web 服务器和游览器的应用上,会出现各种非标准的首部字段。
下面是一些比较常用的首部字段/
X-Frame-Options
X-XSS-Protection
DNT
P3P
X-Frame-Options 字段
属于 HTTP 响应首部,用于控制网站内容在其他 web 网站的 Frame 标签内显示问题。其主要目的是为了防止点击劫持(clickjacking)攻击。
X-Frame-Options: DENY
X-Frame-Options 有以下两个可指定的字段值。
DENY
拒绝SAMEORIGIN
仅同源域名下的页面(Top-level-browsing-context)匹配时许可。
支持该首部字段的游览器有:Internet Explorer 8、Firefox 3.6.9+、Chrome 4.1.249.1042+、Safari 4+ 和 Opera 10.50+ 等。现在主流的游览器都已经支持。
能在所有的 web 服务端预先设定好 X-Frame-Options 字段值是最理想的状态。
当然版本不支持的以及其不放心时可以参考这篇文章
X-XSS-Protection
属于 HTTP 响应首部,它是针对跨站脚本攻击(XSS)的一种对策,用于控制游览器 XSS 防护机制的开关。
X-XSS-Protection: 1
X-XSS-Protection
可指定的字段值如下:
- 0:将 XSS 过滤设置成无效状态
- 1:将 XSS 过滤设置成有效状态
DNT
DNT 属于HTTP 请求首部,其中 DNT 是 Do Not Track 的简称,意为拒绝个人信息被手机,是表示拒绝被精准广告追踪的一种方法。
DNT: 1
DNT 可指定的字段值如下。
- 0:同意被追踪
- 1:拒绝被追踪
由于首部字段 DNT 的功能具备有效性,所以 web 服务器需要对 DNT 做出对应的支持。
P3P字段
P3P 属于HTTP响应首部,通过利用P3P ( The Platform
for Privacy Preferences,在线隐私偏好平台)技术,可以让Web网站上
的个人隐私变成种仅供程序可理解的形式, 以达到保护用户隐私的
目的。
P3P: CP="CAO DSP LAW CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa OUR BUS IND UNI COM NAV INT"
要进行 P3P的设定,需按以下步骤进行。
- 步骤一:创建 P3P 隐私
- 步骤二:创建 P3P 隐私对照文件后,保存命名在 /w3c/p3p.xml
- 步骤三:从 P3P 隐私中新建 Compact policies 后,输出到 HTTP 响应中
关于 P3P 的详细规范请点击
8.HTTP通用首部字段
本文主要参考链接
四 .http2协议
主要特点
- 二进制传输,消息的解析效率更高
- 头部数据压缩,传输效率更高
- 多路复用,可以让请求并发执行
- 服务器推送,可以主动推送数据到浏览器