继续学习图解HTTP。
http协议是用于客户端和服务端之间的通信
- 请求访问文本或图片等资源的一端统称为客户端。
- 提供资源响应的一端称之为服务端。
在两台计算机之间使用http通讯时,必然有一端是客户端,有一端是服务端。
有时候两台计算机作为客户端和服务端的角色可能会互换,但是在一次访问中,客户端和服务端是固定的。
通过请求和响应的交换达成通信
请求必定从客户端发出,而服务端回复反应。
书中介绍了一些http的组成,比如请求报文头,协议版本之类的,但是其实多数时候我个人使用http都是直接拿来用的,所以这块接触的很少。
响应报文的构成
HTTP是不保存状态的协议
这个其实很多地方都有讲到,http的三大特性就包括无状态。
简而言之协议自身不对请求和响应的通信状态进行保存。也就是不持久化。
比如每当有新的请求就会对应有新的响应,协议本身不保存之前的请求和响应。这样做是为了简化http协议,可以更快的处理大量事务。
但是有的时候我们又必须需要保存一些东西,比如登录淘宝以后,不管点到任何页面都要保存登录状态,任何请求都要服务端知道具体是哪个用户发送的请求。为了实现这个功能,http1.1引入了cookie功能。
请求URI定位资源
这里要提一下上一篇中的小知识点:URL是一种特殊的URI。
然后继续说,URI是统一资源标识符,所以通过完整的URI是可以定位互联网上的资源的。
当客户端请求资源时,要写明URI,指明URI的方式很多:
请求URI
以上两种是一样的效果。
告知服务器意图的 HTTP 方法
get:获取资源。
这是一种常用的请求方式,但是这个因为能传递的数据很小,所以一般用来获取资源。
post:传输实体主体
与fet相比,post可传输的数据更多,而且更加安全。是一个平时较为常用的方法。(可传输文件等)
put:传输文件
在请求报文的主题中包含文件内容,直接上传到指定url。
这个方法自身不带验证机制,所以有一些安全问题,所以一般的web网站不适用这个方法。
如果用web验证机制,或者rest标准,才会开放使用这种方法。
head:获取报文首部
这个与get类似,但是不返回报文主体部分,只能确认url是否有效及资源更新的时间等。
delete:删除文件。
这个同put正好相反,但是机制差不多,都是要有web验证机制或者rest风格开发才会使用。
options:询问支持的方法
用来查询针对请求 URI 指定的资源支持的方法。大多数时候我们会规定某接口支持什么方法,比如:
如图,第一个接口只支持get,第二个只支持post,第三个则都可以。options就是可以询问一个接口支持什么方法。
剩下还有几样我都没见过的,只能说很不常见,所以这里就不一一列举了。
使用方法下达命令
向请求URL发送请求报文时,采用不同方法被称为方法的命令。
HTTP1.0和HTTP1.1是不同的,有一些细微的差别:
HTTP/1.0 和 HTTP/1.1 支持的方法
持久连接节省通信量
在以前,一次HTTP协议就要断开一个TCP链接。当年2G传输,一次资源很少,这样也就可以了。但是现在随着HTTP的普及,一个HTML中可能包含大量图片。在发送请求访问 HTML 页面资源的同时,也会请求该 HTML 页面里包含的其他资源。因此,每次的请求都会造成无谓的 TCP 连接建立和断开,增加通信量的开销。
持久连接
持久连接也叫长连接。持久连接的特点是,只要任意一端没有明确提出断开连接,则保持 TCP 连接状态。
在 HTTP/1.1 中,所有的连接默认都是持久连接,但在 HTTP/1.0 内并未标准化。
注意一点:持久连接只是保持TCP的连接。
管线化
持久连接似的多数请求管线化成为可能。从前发送请求要能收到反应后才能再次发送请求,而现在不用等待响应就可以直接再次发送请求。
比如,当请求一个包含 10 张图片的 HTML Web 页面,与挨个连接相比,用持久连接可以让请求更快结束。而管线化技术则比持久连接还要快。请求数越多,时间差就越明显。
使用cookie的状态管理
上面就提到了,HTTP是无状态协议,他不对任何请求和响应做保存,所以想要实现登录认证,只能人为的来处理。
其实HTTP的无状态,由于不必保存状态,自然可减少服务器的 CPU 及内存资源的消耗。也正是因为这点才会被广泛使用。
保留无状态协议这个特征的同时又要解决类似的矛盾问题,于是引入了 Cookie 技术。Cookie 技术通过在请求和响应报文中写入 Cookie 信息来控制客户端的状态。
Cookie 会根据从服务器端发送的响应报文内的一个叫做 Set-Cookie 的首部字段信息,通知客户端保存 Cookie。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入 Cookie 值后发送出去。
服务器端发现客户端发送过来的 Cookie 后,会去检查究竟是从哪一个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息。
其实简而言之,就是在第一次返回响应时人为的在某地方放置一个辨别码,由http自动获取这个辨别码然后放到请求报文中。下次服务器就知道是谁访问的了。
原书中这一块的图很可爱,分享给大家:
没有cookie则保存cookie
有cookie则取cookie
上图请求报文和响应报文内容
网友评论