HTTP 协议的特点可以概括为:客户端服务端模式、无连接、无状态、简单快速和灵活等。
网络世界中的两台计算机,就像现实世界中的两个陌生人一样,要想搭上关系,首先得先说上话。在网络世界中,先开口的,被称为客户端。而做出回应的,被称为服务端。也就是说,在一条通信线路上,客户端用于请求资源,服务端用于提供资源。
事实上,HTTP 协议还规定了:
对 HTTP 有点了解的童鞋应该都知道,HTTP 协议是无连接的。也就是说,每进行一次 HTTP 通信,都要断开一次 TCP 连接。这是因为 HTTP 诞生之初,主要是为了应付容易很小的文本传输,所以即使这样也没多大的问题。
可随着 HTTP 的普及,文档中包含大量图片的情况多了起来,每次请求完都要断开 TCP 连接,无疑增加通信量的开销。为了解决 TCP 的连接问题,HTTP1.1 提出了持久连接的方法。所谓的持久连接,就是任意一端只要没有明确提出断开连接,则保持 TCP 连接状态。
这样一来,就减少了 TCP 连接的重复建立和断开所造成的额外开销,减轻了服务端的负载,Web 页面的显示速度也就相应的提高了。更重要的是,持久连接使得管线化成为可能。从前发送请求后,需要收到响应了才能发送下一个请求。管线化技术出现后,不用等待响应也可以直接发送下一个请求了。
这样就能够做到同时并行发送多个请求,而不需要一个接一个地等待响应。管线化的效果是立竿见影的。持久连接可以让请求更快结束,而管线化技术则比持久连接还要快,而且请求数越多,时间差就越明显。
除了无连接,HTTP 的另一个特点是无状态。也就是说,HTTP 协议无法根据之前的状态进行本次的请求处理。不可否认,不保存状态是有他的优点的,可以减少服务器的 CPU 及内存资源的消耗。但问题也是显而易见。
假设系统需要登录后才能访问,由于无状态的特点,每次跳转页面都需要重新登录,这是难以想象的。为了解决无状态的问题,引入了 Cookie 技术。Cookie 技术通过在请求和响应报文中写入 Cookie 信息来控制客户端的状态。
首次访问服务端时,响应报文内会返回一个叫 Set-Cookie 的首部字段信息,通知客户端保存 Cookie。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入 Cookie 值后发送出去。
服务端发现客户端发送过来的 Cookie 后,会去检查究竟是从哪个客户端发送来的请求,然后对比服务器上的记录,最后得到之前的状态信息。
HTTP 协议的主要特点可概括如下: