就实际情况而言,两台计算机作为客户端或者服务端的角色可能会互换。但就一条通信线路而言,服务端和客户端的角色是明确的。HTTP协议的两端角色是明确的。
发送请求的报文例子:
GET /index.htm HTTP/1.1 Host: hackr.jp
在这里面,GET表示请求访问服务器的类型,/index.htm表示请求访问的资源对象,也叫作请求URI,HTTP/1.1代表客户端HTTP的版本号,用来提示客户端使用的HTTP协议功能。
请求报文由请求方法、请求URI、协议版本、可选的请求首部字段和内容实体组成。
响应报文的例子:
HTTP/1.1 200 OK Date : Tue ,10 Jul 2012 06:50:15 GMT Content - Length :362
Content - Type : text/html <html> ... </html>
这里的HTTP/1.1表示服务端HTTP的版本号,OK是原因语句,下一行是响应时间,下面空一行再写资源实体的主体。
HTTP协议通过URI定位互联网上的资源,因为URI的特性,互联网上任何位置上的资源都能够访问到,如果不是访问特定的资源而是对服务器自身发起请求,可以用 *
来代替URI。
HTTP方法:
GET
获取服务端的资源
值得注意的是:指定的资源要经过服务器端的解析后才能返回响应,如果请求的是文本,那么就原样返回,如果是程序,那么返回输出结果。
POST
用来传输实体的主体。
GET也可以传输实体的主体,但是一般使用POST进行操作,因为POST的主要目的并不是获取响应的主体内容。
PUT
用来向服务端传输文件。
一般网站不支持PUT,因为PUT不支持验证,很危险。
DELETE
用来删除服务端的资源。
和PUT一样,一般网站不支持。
HEAD
获取资源相关信息。
与GET方法相似,不过HEAD方法不返回报文主体,主要用来确认URI的有效性及资源更新的日期时间。
OPTIONS
询问支持的方法。
用来查询针对请求URI指定资源支持的方法。
TRACE
用来了解在物理层传输的过程,经过了多少路由器,收到了怎样的处理。
CONNECT
使用隧道协议连接代理。
HTTP的连接:
持久连接:
只要任意一端没有明确提出断开连接,则保持TCP的连接状态。
在HTTP/1.1中,所有的连接默认都是持久连接。
管线化:
持久连接使得管线化称为可能。
即不用等待之前请求的响应就直接发送下一个请求。
这样的话,可以做到同时并行发送多个请求,而且请求数越多,时间差就越明显。
Cookie管理状态
HTTP的无状态:
HTTP是一种不保存状态的协议,即无状态协议,它对于任何的发送过的请求或者响应都不做持久化的处理。
HTTP不保存状态的优点:轻量级、能够快速处理大量事务、确保协议的可伸缩性。
使用Cookie:
Cookie会根据从服务端发送的响应报文中的一个叫做Set-Cookie的首部字段信息,通知客户端保存Cookie。
当写一次客户端发送请求的时候,客户端会自动将Cookie加入到请求报文中去。
当服务端发现从客户端发送过来的Cookie时,会去检查究竟是哪一个客户端发送过来的请求,然后对比在服务器上面的记录,进行验证,就可以得到之前的状态信息。
参考书籍:《图解HTTP》上野宣 著 于均良 译