HTTP简介
HTTP协议(HyperText Transfer Protocol,超文本传输协议)是一个用于web的客户端与服务器之间的交互协议。其在TCP/IP协议栈中处于应用层,与其相关的还有DNS(域名与IP之间的转换协议)、TCP(传输层协议)、IP(网络层协议)。目前主流的版本是HTTP/1.1,同时HTTP/2.0也在推广。
HTTP协议
HTTP协议的最大特点是无状态,也就是说其自身不会请求和相应之间的通信状态进行保存(无持久化机制),无状态机制的优点在于HTTP可以快速的处理大量的请求,并立刻响应,而缺点在于其不能保存客户端的信息,无法知道请求的报文是否是同一个客户端发来的。但是Cookie技术也弥补了无状态的缺点。(在后面会介绍Cookie技术)
同时,HTTP还有协议有Keep-alive选项进行持久连接,持久连接意思是建立一次TCP连接后,可以发送多个HTTP报文,这样的好处在于可以提高传输效率,不需要多次重复TCP的建立与断开。在HTTP/1.1中所有的连接都是默认持久化的。
HTTP报文
HTTP报文就是HTTP协议传输过程中的数据组织格式。客户端发给服务器的叫做请求报文,服务器返回给客户端的称为相应报文。
HTTP请求报文格式
请求报文格式如下图所示。主要包括报文首部,空行,报文主体三个部分。其中报文首部又包括请求行,首部字段等内容。
利用curl -v可以看到发送给www.baidu.com的请求报文格式如下。
请求行
请求行包括HTTP请求方法、请求URL和HTTP版本号三个部分。HTTP请求方法主要包括下面几种。
请求方法 | 说明 |
---|---|
GET | 用于获取资源 |
POST | 传输实体的主体 |
PUT | 传输文件 |
HEAD | 获取首部报文 |
DELETE | 删除文件 |
OPTIONS | 询问服务器支持的方法 |
TRACE | 追寻路径 |
CONNECT | 要求用隧道协议连接代理(即与代理服务器建立通信隧道) |
HTTP响应报文格式
响应报文格式如下图所示。和请求报文格式基本相同,区别在于报文首部中第一行是状态行,然后首部字段中有响应的字段。
利用curl命令及其参数可以看到www.baidu.com返回的HTTP响应报文。可以看到,状态行中主要包括状态码,原因短语和HTTP版本号。
状态码
这里是HTTP协议的一个重点,HTTP状态码负责表示客户端请求的HTTP报文的返回结果状态,可以通过其观察到服务器是否正常工作,请求的数据是否找到等信息。状态码可以分成五种类别,如下表格所示。
类别 | 说明 | 具体 | |
---|---|---|---|
1XX | 信息状态码 | 接收的请求正在处理 | 无 |
2XX | 成功状态码 | 请求正常处理完毕 | 200 OK(客户端发来的请求被服务器正常处理) 204 No Content(请求被处理,但响应报文无主体部分) 206 Partical Content(客户端的请求是范围请求) |
3XX | 重定向状态码 | 需要进行附加操作以完成请求 | 301 Moved Permanetly(永久性重定向,资源已经被分配新URL) 302 Found(临时性重定向,POST改成GET) 303 See Other(请求的对应资源在另一个URI中,应该使用GET方法进行请求) 304 Not Modified (请求报文中部分条件为满足) 307 Temporary Redirect (临时重定向,不需要从POST改成GET) |
4XX | 客户端错误状态码 | 服务器无法处理请求 | 400 Bad Request(请求报文中存在语法错误) 401 Unauthorized(表示请求的HTTP请求需要有认证) 403 Forbidden(请求资源的访问被服务器权限拒绝) 404 Not Found(服务器没有找到对应资源) |
5XX | 服务器错误状态码 | 服务器处理请求错误 | 500 Internal Server Error(服务器端在执行请求时候出现错误) 503 Service Unavailable (服务器正处于超负载或停机维护无法服务客户端) |
HTTP首部字段
通用首部字段, 指的是请求报文和响应报文都可以使用的首部字段。
字段名称 | 字段说明 |
---|---|
Cache-Control | 控制缓存行为 |
Connection | 控制不再转发给代理的字段,持久连接的管理 |
Date | 报文的日期时间 |
Trailer | 报文末端的首部一览 |
Transfer-Encoding | 传输报文主体时候的编码方式 |
Upgrade | 升级为其他协议 |
Warning | 错误通知 |
Via | 代理服务器相关信息 |
请求首部字段,指的是只有请求报文可以使用的首部字段。
字段名称 | 字段说明 |
---|---|
Accept | 用户可处理的媒体类型(文本、图片、视频文件等)及优先级 |
Accept-Charset | 用户可处理的字符集 |
Accept-Encoding | 用户的编码方式 |
Accept-Language | 用户的语言 |
Authorization | Web认证信息 |
Expect | 期待的特定行为 |
From | 用户电子邮箱 |
Host | 请求的资源所在互联网主机名和端口号 |
Range | 在只需要获取部分信心的范围请求中用于指定请求资源范围 |
Proxy-Authorization | 代理服务器的客户验证 |
User-Agent | 创建请求的浏览器和用户代理等信息传给服务器 |
响应首部字段,指的是相应报文中使用的首部字段
字段名称 | 字段说明 |
---|---|
Accept-Ranges | 是否接收字节范围请求 |
Age | 资源创建经过的时间 |
ETag | 资源匹配信息 |
Location | 让客户端重定向的新URI |
Server | 服务器的信息 |
实体首部字段,请求报文和响应报文中实体部分所用的首部,用于补充内容更新时间和实体相关信息。
字段名称 | 字段说明 |
---|---|
Allow | 资源可支持的HTTP方法 |
Content-Encoding | 主体编码方法 |
Content-Language | 主体语言 |
Content-Length | 主体长度 |
Content-Location | 主体对应URI |
Content-Range | 主体位置范围 |
Content-Type | 主体资源类型 |
Expired | 过期时间 |
Last-Modified | 最后一次修改时间 |
HTTPS
HTTP协议的用处非常广,但是其也有很多缺点,主要的不足就是安全性太低,HTTP缺点如下:
- 通信使用明文,内容易被盗取。最简单的解决方式就是通信加密或者内容加密。
- 不验证通信双方身份,易被伪装攻击,可以用数字证书的方式对客户端进行身份验证。
- 无法保证明文的完整性,内容易被篡改,可以用数字签名的方式。
因为上述原因,提出HTTPS来弥补HTTP安全方面的考虑。HTTPS = HTTP + SSL,同时也可以说HTTPS = HTTP + 加密 + 认证 + 完整性保护,其主要思想就是通过加密的手法保证数据的安全性。HTTPS通过非对称加密方法(分成公钥和私钥,比如A要传数据给B,先用B的公钥加密,然后传给B,B就可以用B的私钥进行解密)交换密钥,然后在客户端和服务器都有密钥的时候,通过对称加密方式(只有一个密钥用于加解密)交换报文信息。同时会使用数字证书进行身份验证,数字证书是第三方机构颁发证书,用于证明通信双方的可靠性。
HTTPS协议也有缺点,由于SSL的以下缺点,使得其主要用于安全需求较高的地方:
- 传输速度较慢,由于安全性考虑,会使得通信过程变复杂,速度较慢
- 开销较大,因为有加解密的过程,需要消耗系统性能来进行处理。
Cookie和Session
Cookie机制主要用于客户端保持与服务器连接的状态。首先HTTP是无状态协议,也就是说服务器只会处理传来的请求并生成反馈,不会去保存连接的上下文信息,当连接断开以后,下次同样的客户端进行请求就会重新处理。而Cookie机制就是客户端保持连接信息的机制,Session是服务器端保持连接信息的机制。
Cookie的流程如下:
- 当第一次客户端与服务器进行交互的时候,服务器生成一个Cookie信息(or Session),同时设定Cookie类型和保存时间。
- 将Cookie的信息随着响应报文传回给客户端,客户端将其存储。
- 当客户端与服务器端再次通信的时候,服务器端就可以根据Cookie信息找到相应的客户端数据
Session机制是服务器端保存客户端信息的方法,可以通过Cookie实现,也可以通过URL地址重写的方法。因为Cookie机制是客户端可以禁止的,URL地址重写的原理是将该用户Session的id信息重写到URL地址中,服务器能够解析重写后的URL获取Session的id,这样即使客户端不支持Cookie,也可以使用Session来记录用户状态。
HTTP 1.0 与 HTTP 1.1区别
- 持久连接,HTTP1.0每个请求与响应都是一个新连接,HTTP1.1在一个TCP连接中可以同时传递多个HTTP请求与响应(keepalive机制),Connection请求头的值为Keep-Alive时,客户端通知服务器返回本次请求结果后保持连接;Connection请求头的值为close时,客户端通知服务器返回本次请求结果后关闭连接。
- 新增请求方法,HTTP1.1增加了OPTIONS,PUT, DELETE, TRACE, CONNECT这些请求方法
HTTP 2.0
HTTP2.0相比于HTTP1.x有了一些改进地方,其主要是基于Google开发的SPDY协议,主要改进如下:
- 新的二进制格式,HTTP1.x的解析是基于文本。基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认0和1的组合。基于这种考虑HTTP2.0的协议解析决定采用二进制格式,实现方便且健壮。
- 多路复用有效降低延迟,即连接共享,即每一个request都是是用作连接共享机制的。一个request对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的 id将request再归属到各自不同的服务端请求里面。
- header压缩,HTTP1.x的header带有大量信息,而且每次都要重复发送,HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小。
- 服务端推送,服务端可以在客户端某个请求后,主动推送其他资源。
参考:
- 图解HTTP
- Cookie && Session
- HTTP2.0