一、HTTP简介
HTTP用于客户端与服务端之间进行通信。
请求访问文本、图像等资源的一端为客户端,提供资源相应的一端为服务器端。
仅就一条通信来说,服务端与客户端的角色是确定且固定的,在连接过程中的多次通信可能会发生交换。
1.1 客户端
请求报文是由请求方法、 请求 URI、 协议版本、 可选的请求首部字段
和内容实体构成的。
请求访问服务器的类型,方法
请求访问的资源对象,请求 URI
HTTP 的版本号,提示客户端使用的 HTTP 协议功能
GET /index.htm HTTP/1.1
首部字段
Host: hackr.jp
URI
当客户端请求访问资源而发送请求时, URI 需要将作为请求报文中的请求 URI 包含在内。
如果不是访问特定资源而是对服务器本身发起请求, 可以用 * 来代替请求 URI。
1.2 服务端
#服务器对应的HTTP版本 状态码 原因
HTTP/1.1 200 OK
创建响应的日期时间
Date: Tue, 10 Jul 2012 06:50:15 GMT
Content-Length: 362
Content-Type: text/html
资源主体
<html>
……
</html>
1.3 cookie
HTTP是无状态协议。
HTTP为了保证更快的处理大量事务,确保协议的可伸缩性,将HTTP设计简单化。
自身不对请求和相应之间的通信状态进行保存,即对发送过的请求和响应都不做持久化处理。
为了实现保存登陆状态等功能,HTTP引入了cookie技术,Cookie 技术通过在请求和响应报文中写入 Cookie 信息来控制客户端的状态。
Cookie 会根据从服务器端发送的响应报文内的一个叫做 Set-Cookie 的
首部字段信息, 通知客户端保存 Cookie。 当下次客户端再往该服务器
发送请求时, 客户端会自动在请求报文中加入 Cookie 值后发送出
去。
GET /reader/ HTTP/1.1
Host: hackr.jp
HTTP/1.1 200 OK
Date: Thu, 12 Jul 2012 07:12:20 GMT
Server: Apache
<Set-Cookie: sid=1342077140226724; path=/; expires=Wed,
10-Oct-12 07:12:20 GMT>
Content-Type: text/plain; charset=UTF-8
GET /image/ HTTP/1.1
Host: hackr.jp
Cookie: sid=1342077140226724
1.4 HTTP方法
GET
GET 方法用来请求访问已被 URI 识别的资源。 指定的资源经服务器端解析后返回响应内容。
POST
POST 方法用来传输实体的主体。
其余方法
1.5 长连接
为解决每次连接都要建立和断开TCP连接的问题,HTTP/1.1 和一部分的 HTTP/1.0 想出了持久连接,持久连接的特点是, 只要任意一端没有明确提出断开连接, 则保持 TCP 连接状态。
持久连接的好处在于减少了 TCP 连接的重复建立和断开所造成的额外开销, 减轻了服务器端的负载。 另外, 减少开销的那部分时间, 使HTTP 请求和响应能够更早地结束, 这样 Web 页面的显示速度也就相应提高了。
为解决多请求并行,持久化支持管道线方式,不用等待相应,就可以直接发送下一个请求。
1.6 HTTP1.0 和 1.1的区别
- 长连接:HTTP1.0每次请求与相应完成后都会断开TCP连接,再次请求时还要再次三次握手建立连接,浪费资源。HTTP1.1默认Connection请求头的值为Keep-Alive,会开启TCP长连接。
- 缓存处理:在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。
- Host头处理:在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。
- 错误通知的管理:在HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。
- 带宽优化及网络连接的使用:HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。
1.7 HTTPS与HTTP的区别
- HTTPS协议需要到CA申请证书,一般免费证书很少,需要交费。
- HTTP协议运行在TCP之上,所有传输的内容都是明文,HTTPS运行在SSL/TLS之上,SSL/TLS运行在TCP之上,所有传输的内容都经过加密的。
- HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
- HTTPS可以有效的防止运营商劫持,解决了防劫持的一个大问题。