HTTP报文

HTTP报文格式

  • 请求报文
    请求行:包含请求方法,URI和http版本号
    请求头:包含请求的各种条件和属性的各类字段
    空行(CR+LF)
    请求体:应发送的内容
    eg:
1
2
3
4
5
6
7
8
9
10
11
GET wss://comet.zhihu.com/apilive HTTP/1.1
Host: comet.zhihu.com
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Origin: https://www.zhihu.com
Sec-WebSocket-Version: 13
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2957.0 Safari/537.36
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: zh-CN,zh;q=0.8
  • 响应报文
    响应行:包含状态码,原因短语和http版本号
    响应头:包含响应的各种条件和属性的各类字段
    空行(CR+LF)
    响应体:应发送的内容
    eg:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
HTTP/1.1 200 OK
Date: Mon, 13 Mar 2017 15:09:46 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
X-Powered-By: PHP/5.5.25
Content-Encoding: gzip
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'>
<meta http-equiv='X-UA-Compatible' content='IE=Edge'>
……

HTTP请求行&响应行字段

HTTP版本号

协议号 描述
HTTP/0.9 只支持html这种格式,只有GET方法
HTTP/1.0 引入了POST和HEAD方法,报文格式发生变化,首部字段大大丰富
HTTP/1.1 新增多种方法,支持持久连接和管道机制,分块传输
HTTP/2 支持多工通信,数据包设置编号可指定优先级,报文头部压缩,服务器主动推送

HTTP方法

方法 描述
GET 获得资源
POST 传输实体主体
HEAD 获得响应头
PUT 传输文件
DELETE 删除文件
CONNECT 要求用隧道协议连接代理
OPTIONS 询问支持的方法
TRACE 追踪路径
PATCH 文件局部更新

GET和POST的区别

根据RFC7231规范:
GET的语义是请求获取指定的资源。GET方法是安全、幂等、可缓存的(除非有 Cache-ControlHeader的约束),GET方法的报文主体没有任何语义。
POST的语义是根据请求负荷(报文主体)对指定的资源做出处理,具体的处理方式视资源类型而不同。POST不安全,不幂等,(大部分实现)不可缓存。
幂等:一个请求方法执行多次和仅执行一次的效果完全相同。
安全:一个方法的语义在本质上是「只读」的,那么这个方法就是安全的。

HTTP状态码

状态码 类别
1XX Informational(信息性状态码)
2XX Success(成功状态码)
3XX Redirection(重定向状态码)
4XX Client error(客户端错误状态码)
5XX Server error(服务端错误状态码)

eg:

状态码 原因
200 OK//客户端请求正常处理
301 Moved Permanently//永久性重定向
302 Found//临时性重定向
304 Not Modified//客户端发送附带条件,服务器不满足条件
403 Forbidden//服务器拒绝访问请求
404 Not Found//服务器不存在请求的资源
414 Request-URI Too Long//URI长度超过服务器能解释的长度
500 Internal Server Error//服务器遇上未曾意料的错误

URL

统一资源定位符(或称URL地址Uniform/Universal Resource Locator)相当于互联网上的地址,用户通过URL来定位资源在互联网上的位置,并访问他

标准格式:

1
2
3
4
5
6
7
8
scheme://host[:port#]/path/.../[;url-params][?query-string][#anchor]
scheme:协议
host:http服务器的域名或者IP地址
port:http服务器的端口号,使用默认地址80可省略。使用其他端口需申明
path:访问资源路径
url-params:所带参数
query-string:发送给HTTP服务器的数据
anchor:锚点定位

eg:https://www.google.com/search?q=%E9%98%AE%E4%B8%80%E5%B3%B0

URI

  • URI Universal Resource Identifier 统一资源标志符
  • URL Universal Resource Locator 统一资源定位符
  • URN Universal Resource Name 统一资源名称

URI可被视为定位符(URL),名称(URN)或两者兼备。统一资源名(URN)如同一个人的名称,而统一资源定位符(URL)代表一个人的住址。换言之,URN定义某事物的身份,而URL提供查找该事物的方法。

HTTP请求头&响应头字段

通用首部字段

首部字段名 说明
Cache-Control 控制缓存行为
Connection 逐跳首部、链接的管理
Date 创建报文的日期时间
Pragma 报文之类
Trailer 报文末端的首部一览
Transfer-Encoding 指定报文主题的传输编码方式
Upgrade 升级为其他协议
Via 代理服务器的相关信息
Warning 错误通知
  • Cache-Control字段,no-cache代表强制向源服务器再次验证,no-store代表不缓存请求和相应的任何内容
  • Connection字段,管理持久连接控制不在转发给代理首部字段,
  • Pragma字段,为了兼容http/1.1以下版本,只有Pragma:no-cache这种属性
  • Transfer-Encoding字段,http/1.1只对transfer-encoding:chunked有效
  • Upgrade字段,仅限于客户端和邻接服务器还需额外指定Connection:Upgrade
  • Via字段,不仅可以追踪报文的转发,还可避免请求回环的发生
  • Warning字段,告知用户有关缓存的警告

请求首部字段

首部字段名 说明
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客户端程序的信息
  • Accept字段,Accept-Charset,Accept-Encoding,Accept-Language可通过权重值q来设定优先级(范围0~1)
  • Host字段,虚拟主机可以让一个ip分配给不同的域名。因此在http/1.1中Host字段不可省略。
  • If-Range字段,若跟ETag值或更新的日期时间匹配一致,就作为范围请求处理;若不一致,则返回全部资源
  • Max-Forwards字段,诊断代理服务器通信情况
  • Proxy-Authorization字段,源服务器对客户端的认证信息请使用Authorization字段
  • Referer字段,正确拼写原本应该是Referrer,然而将错就错。
  • TE字段,TE对应传输编码,Accept-Encoding对应内容编码

响应首部字段

首部字段名 说明
Accept-Ranges 是否接受字节范围请求
Age 推算资源创建经过时间
ETag 资源的匹配信息
Location 令客户端重定向至指定URI
Proxy-Authenticate 代理服务器对客户端的认证信息
Retry-After 对再次发起请求的时机要求
Server HTTP服务器的安装信息
Vary 代理服务器缓存的管理信息
WWW-Authenticate 服务器对客户端的认证信息
  • Age字段,代理服务器创建响应必须加入Age字段,代表缓存后的响应再次发起认证到认证完成的时间值。若对象为源服务器则代表多久创建了响应
  • ETag字段,分为强ETag值和弱ETag值。弱ETag值只有资源发送根本变化才改变ETag的值。这时,会在字段值最开始出附加/w
  • Vary字段,Vary字段,同Accept-Language字段相匹配。若两个字段的值相同,直接从缓存返回响应,反之需要先从源服务器端获取资源后才能作为响应返回

实体首部字段

首部字段名 说明
Allow 资源可支持的HTTP方法
Content-Encoding 实体主体适用的编码方式
Content-Language 实体主体的自然语言
Content-Length 实体主体的大小(单位:字节)
Content-Location 替代对应资源的URI
Content-MD5 实体主体的报文摘要
Content-Range 实体主体的位置范围
Content-Type 实体主题的媒体类型
Expires 实体主体过期的日期时间
Last-Modified 资源的最后修改日期时间
  • Content-Location字段,同响应首部字段的Location不同。Location是重定向到一个新的地址,而Content-Location是报文主体返回资源对应的URI
  • Content-MD5字段,检查报文传输过程中是否保持完整
  • Expires字段,优先级低于Cache-Control的max-age值

其他首部字段

Cookie(复数形态Cookies),中文名称为“小型文本文件”或“小甜饼”,指某些网站为了辨别用户身份而储存在用户本地终端(Client Side)上的数据(通常经过加密)。定义于RFC2109。是网景公司的前雇员卢·蒙特利在1993年3月的发明。

首部字段名 说明 首部类型
Set-Cookie 开始状态管理所使用的Cookie信息 响应首部字段
Cookie 服务器接收到的Cookie信息 请求首部字段

Set-Cookie字段的属性值

属性 说明
NAME=VALUE 赋予Cookie的名称和其值(必需项)
Expires=DATE Cookie的有效期(若不明确指定则默认为浏览器关闭前为止)
path=PATH 将服务器上的文件目录作为Cookie的适用对象(若不指定则默认为文档所在的文件目录)
domain=域名 作为Cookie适用对象的域名(若不指定则默认为创建cookie的服务器的域名)
Secure 仅在HTTPS安全通信时才会发送Cookie
HttpOnly 加以限制,使Cookie不能被Javascript脚本访问

cookie,localStorage和sessionStorage区别

特性 Cookie LocalStorage SessionStorage
数据的生命期 可设置失效时间,默认是关闭浏览器后失效 除非被清除,否则永久保存 仅在当前会话下有效,关闭页面或浏览器后被清除
存放数据大小 4K左右 一般为5MB 一般为5MB
与服务器端通信 每次都会携带在HTTP头中,如果使用cookie保存过多数据会带来性能问题 仅在客户端(即浏览器)中保存,不参与和服务器的通信 仅在客户端(即浏览器)中保存,不参与和服务器的通信
易用性 需要程序员自己封装,源生的Cookie接口不友好 源生接口可以接受,亦可再次封装来对Object和Array有更好的支持 源生接口可以接受,亦可再次封装来对Object和Array有更好的支持

cookie和session

特性 Cookie Session
存取方式 只能存取 ASCII字符串 能够存取任何类型的数据
隐私策略 客户端(有泄漏风险) 服务器
数据有效期 可设置失效时间,默认是关闭浏览器后失效 仅在当前会话下有效,关闭页面或浏览器后被清除
服务器压力 不占用服务器资源 并发访问用户过多,消耗大量内存
跨域支持 支持 不支持
  • 补充:

    MIME类型

    互联网媒体类型(Internet media type,也称为MIME类型(MIME type)或内容类型(content type))是给互联网上传输的内容赋予的分类类型。一份内容的互联网媒体类型是由其文件格式与内容决定的。互联网媒体类型与文件拓展名相对应,因此计算机系统常常通过拓展名来确定一个文件的媒体类型并决定与其相关联的软件。互联网媒体类型的分类标准由互联网号码分配局(IANA)发布。

命名格式:

1
2
3
类型名 / 子类型名 [ ; 可选参数 ]
类型名:application、audio、example、image、message、model、multipart、text,以及video。chemical是一个非官方的常用类型名。
子类型名:子类型名通常是一个媒体形式被冠以的名称,不过子类型名中也会有其它信息,包括厂商信息、产品信息、分类信息(子类型会被归进一个树状的分类结构中)、后缀等等。

eg:

1
2
3
4
text/css
text/html
application/javascript(<script>标签的type的属性是可省略的,
因为所有的浏览器即使在HTML5以前都一直默认使用JavaScript。)

HTTP压缩

HTTP压缩是一种内置到网页服务器和网页客户端中以改进传输速度和带宽利用率的方式。
HTTP数据在从服务器发送前就已压缩:兼容的浏览器将在下载所需的格式前宣告支持何种方法给服务器;不支持压缩方法的浏览器将下载未经压缩的数据。最常见的压缩方案包括gzip和Deflate,但可用方案的完整列表由IANA维护。此外,第三方可能开发新的方法并纳入到其自身的产品,例如Google的面向HTTP共享字典压缩(SDCH)方案就实现在Google Chrome浏览器和使用在Google的服务器上。
在HTTP中有两种不同的方式可以完成压缩。在较低层级,Transfer-Encoding头可以指示HTTP消息的有效载荷被压缩。在较高层级,Content-Encoding头可以指示一个被转码、缓存或引用的资源已压缩。使用Content-Encoding的压缩比Transfer-Encoding有更广泛的支持,并且某些浏览器不宣告Transfer-Encoding压缩以避免触发服务器的缺陷。

分块传输编码

分块传输编码(Chunked transfer encoding)是超文本传输协议(HTTP)中的一种数据传输机制,允许HTTP由网页服务器发送给客户端应用( 通常是网页浏览器)的数据可以分成多个部分。分块传输编码只在HTTP协议1.1版本(HTTP/1.1)中提供。
通常,HTTP应答消息中发送的数据是整个发送的,Content-Length消息头字段表示数据的长度。数据的长度很重要,因为客户端需要知道哪里是应答消息的结束,以及后续应答消息的开始。然而,使用分块传输编码,数据分解成一系列数据块,并以一个或多个块发送,这样服务器可以发送数据而不需要预先知道发送内容的总大小。通常数据块的大小是一致的,但也不总是这种情况。

原理:
HTTP 1.1引入分块传输编码提供了以下几点好处:
HTTP分块传输编码允许服务器为动态生成的内容维持HTTP持久链接。通常,持久链接需要服务器在开始发送消息体前发送Content-Length消息头字段,但是对于动态生成的内容来说,在内容创建完之前是不可知的。
分块传输编码允许服务器在最后发送消息头字段。对于那些头字段值在内容被生成之前无法知道的情形非常重要,例如消息的内容要使用散列进行签名,散列的结果通过HTTP消息头字段进行传输。没有分块传输编码时,服务器必须缓冲内容直到完成后计算头字段的值并在发送内容前发送这些头字段的值。
HTTP服务器有时使用压缩 (gzip或deflate)以缩短传输花费的时间。分块传输编码可以用来分隔压缩对象的多个部分。在这种情况下,块不是分别压缩的,而是整个负载进行压缩,压缩的输出使用本文描述的方案进行分块传输。在压缩的情形中,分块编码有利于一边进行压缩一边发送数据,而不是先完成压缩过程以得知压缩后数据的大小。

格式:
每一个非空的块都以该块包含数据的字节数(字节数以十六进制表示)开始,跟随一个CRLF (回车及换行),然后是数据本身,最后块CRLF结束。在一些实现中,块大小和CRLF之间填充有白空格(0x20)。
最后一块是单行,由块大小(0),一些可选的填充白空格,以及CRLF。最后一块不再包含任何数据,但是可以发送可选的尾部,包括消息头字段。
消息最后以CRLF结尾。
eg:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
HTTP/1.1 200 OK
Content-Type: text/plain
Transfer-Encoding: chunked
1C
and this is the second one
3
con
8
sequence
0

缓存代理

  • 端到端首部(End-to-end Header)
    分在此类别中的首部会转发给请求/响应对应的最终接受目标,且必须保存在由缓存生成的响应中,另外规定它必须被转发。

  • 逐跳首部(Hop-by-hop Header)
    分在此类别中的首部只对单次转发有效,会因通过缓存或代理而不在转发。http/1.1和之后版本中,如果要使用hop-by-hop首部,需提供connection首部字段。
    归属于逐跳首部的字段有一下几个:Connection,Keep-Alive,Proxy-Authenticate,Proxy-Authorization,Trailer,TE,Transfer-Encoding,Upgrade。其他都属于端对端首部。