简单的HTTP协议

通过请求和响应的交换达成通信

发送请求

GET / HTTP/1.1
Host: hackr.jp

发送向应

HTTP/1.1 200 OK
Date: Tue, 10 Jul 2012 06:50:15 GMT
Content-Length: 362
Content-Type: text/html
<html>
.......
GET /index.htm HTTP/1.1
Host: hackr.jp

  • 起始行GET表示请求访问服务器的类型,称为方法(method)。/index.htm指明了请求访问的资源对象,也叫URI。最后的HTTP/1.1,即为HTTP的版本号。
  • 请求报文是由请求方法、请求URI、协议版本、可选的请求首部字段和内容实体构成的

POST /form/entry HTTP/1.1
Host: hackr.jp
Connection: keep-alive
Connection-Type: application/x-www-form-urlencoded
Connection-Length: 16

name=ueno&age=37

POST: 方法、URI: /form/entry、协议版本:HTTP/1.1

HTTP是不保存状态的协议

即无状态协议,每当有新的请求发送时,就有对应的新响应产生。协议本身并不保留之前一切的请求或响应报文的信息,这是为了更快的处理大量事务,确保协议的可伸缩性,而特意把HTTP协议设计成如此简单。
随着WEB的不断发展,因无状态而导致业务处理变得棘手的情况增多了。如:用户登录到一家购物网站,即使他跳到该站的其他页面后,也需要能继续保持登录状态,针对这个实例,网站为了能够掌握是谁推出的请求,需要保存用户的状态。
HTTP1.1虽然是无状态协议,但为了实现期望的保持状态功能,于是引入了Cookie技术。有了Cookie再用HTTP协议通信,就可以管理状态了。

请求URI定资源

HTTP协议使用URI定位互联网上的资源。正是因为URI的特定功能,在互联网上任意位置的资源都能访问到。
当客户端请求访问资源而发送请求时,URI需要将作为请求报文中的请求URI包含在内。指定请求URI的方式有很多。
* URI为完整的请求
GET http://hackr.jp/index.htm HTTP/1.1
请求URI

在首部字段Host中写明网络域名或IP地址
GET /index.htm HTTP/1.1
Host: hackr.jp

除此之外,如果不是访问特定资源而是对服务器本身发起请求,可以用一个*来代替请求的URI,下面这个例子是查询HTTP服务器端支持的HTTP访问各类
OPTIONS * HTTP/1.1

使用方法下达命令

方法 说明 支持的HTTP协议版本
GET 获取资源 1.0、1.1
POST 传输实体主体 1.0、1.1
PUT 传输文件 1.0、1.1
HEAD 获得报文首部 1.0、1.1
DELETE 删除文件 1.0、1.1
OPTIONS 询问支持的方法 1.1
TRACE 追踪路径 1.1
CONNECT 要求用隧道协议连接代理 1.1
LINK 建立和资源之间的联系 1.0
UNLINK 断开连接关系 1.0

持久连接

HTTP协议的初始版本中,进行一次HTTP通信就要断开一次TCP连接,持久连接也称为HTTP keep-alive或HTTP connection reuse,持久连接的特点是,只要任意一端没有明确提出断开连接,则保持TCP连接状态。
持久连接的好处在于减少TCP连接的重复建立和断开所造成的额外开销,减轻了服务器的负载。另外,减少开销的那部分时间,使HTTP请求和响应能够更早的结束,这样WEB磁面的显示速度也就相应的提高了。

管线化

持久连接使得多数请求以管线化(pipelining)方式发送成为可能,从前发送请求后需要等待并收到响应,才能发送下一个请求,管线化技术出现后,不用等待响应亦可直接发送下一个请求。
这样就能够做到同时并行发送多个请求,而不需要一个接一个地等待响应了。
比如10张图的HTML WEB页面,与挨个连接相比,用持久连接可以让请求更快结束,而管线化技术则比持久连接还要快,请求数据越多,时间差就越明显。

使用Cookie的状态管理

HTTP是无状态协议,它不对之前发生过的请求和响应状态进行管理。也就是说,无法根据之前的状态进行本次的请求处理。
假设要求登录认证的WEB页面本身无法进行状态的管理(不记录登录的状态),那么每次跳转新页面就要再次登录、或者要在每次请求报文中附加参数和管理登录状态。
不可不认,无状态协议当然也有它的优点。由于不必保存状态,自然可减少服务器CPU及内存资源的消耗。从另一侧面来说,也正是因为HTTP协议本身是非常简单的,所以才会被应用在各种场景里。

保留无状态协议这个特征的同时又要解决类似的矛盾问题,于是引入了Cookie技术。Cookie技术通过在请求和响应报文中写入Cookie信息来控制客户端的状态。
Cookie会根据从服务器端发送的响应报文内的一个叫做set-Cookie的首部字段信息,通过客户端保存Cookie。当下次客户端再次往服务器发送请求时,客户端会自动在请求报文中加入Cookie值后发送出云。
服务器端发现客户端发送过来的Cookie后,会云检查究竟是从哪个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息。

没有Cookie信息状态下的请求

第2次以后(存有Cookie信息状态)的请求

请求报文(没有Cookie信息的状态)
GET /reader/ HTTP1.1
Host: hackr.jp
*首部字段内没有Cookie的相关信息

响应报文(服务器端生成的Cookie信息)
HTTP/1.1 200 OK
Date: Thu,12 Jul 2012 07:12:20 GMT
Server: Apache
<Set-Cookie: sid=1342077140226724; path=/; expires=web, 10-Oct-12 07:12:20 GMT>
Content-Type: text/plain; charset=UTF=8:

请求报文(自动发送保存着Cookie信息)
GET /image/ HTTP/1.1
Host: hackr.jp
Cookie: sid=1342077140226724

posted @ 2023-11-18 22:38  星火撩原  阅读(17)  评论(0编辑  收藏  举报