超文本传输协议(HTTP,Hyper Text Transfer Protocol)是互联网上应用最为广泛的一种网络协议。是用于从WWW服务器传输超文本到本地浏览器的传输协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)。
HTTP/1.0, 发送请求,创建一次连接,获得一个web资源,连接断开(在最早的 http 协议中,每进行一次 http 通信,就需要做一次 tcp 的连接。而一次连接需要进 行 3 次握手,这种通信方式会增加通信量的开销)
HTTP/1.1,发送请求,创建一次连接,获得多个web资源,连接断开。在 HTTP/1.1 中改用了持久连接,就是在一次连接建立之后,只要客户端或者服务端没有 明确提出断开连接,那么这个 tcp 连接会一直保持连接状态 持久连接的一个最大的好处是:大大减少了连接的建立以及关闭时延。 HTTP1.1 中有一个 Transport 段。会携带一个 Connection:Keep-Alive,表示希望将此条连接作为持久连接。
1.支持客户/服务器模式。(c/s)
2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有:
每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
3.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
4.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
5.无状态:HTTP协议是无状态协议。
无状态是指协议对于事务处理没有记忆能力。对同一个url请求没有上下文关系,每次的请求都是独立的,它的执行情况和结果与前面的请求和之后的请求是无直接关系的,它不会受前面的请求应答情况直接影响,也不会直接影响后面的请求应答情况。服务器中没有保存客户端的状态,客户端必须每次带上自己的状态去请求服务器。另一方面,缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。在程序中,会话跟踪是很重要的事情。理论上,一个用户的所有请求操作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个会话,二者不能混淆。例如,用户张三在商场购买的任何商品都应该放在张三的购物车内,不论是用户张三什么时间购买的,这都是属于同一个会话的,不能放入用户李四或用户牛二的购物车内,这不属于同一个会话。 而Web应用程序是使用HTTP协议传输数据的。HTTP 协议是无状态的,什么是无状态呢?通俗来讲就是说http协议一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。 但是现在的应用程序都是有状态的,如果是无状态,那这些应用基本没人用,你想想,访问一个电商网站,先登录,然后去选购商品,当点击一个商品加入购物车以后又提示你登录。
每一次操作都要与系统底层的数据库进行交互
这种繁杂、冗余的用户体验根本不会有人去使用,那我们是如何实现带状态的协议呢?所以此时便引入了cookie和session两个概念!
Cookie意为“甜饼”,是由W3C组织提出,最早由Netscape社区发展的一种机制。目前Cookie已经成为标准,所有的主流浏览器如IE、google、Netscape、Firefox、Opera等都支持Cookie。
由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份。怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论是谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。这就是Cookie的工作原理。
Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修Cookie的内容。Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存客户端信息。 客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了,这就是Session。
为每个访问服务器的用户创建一个存储数据的容器,容器中的数据在多个请求之间共享;通过在服务器端开辟一块缓存区,存储、记忆、共享一些临时数据(这个数据指的是客户端和服务器在临时会话中产生的数据)如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识 ——称为session id,如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。
http协议本身是无状态的,只是后来随着互联网的发展以及电商平台的普及,越来越多的web应用程序出现,为了顺应与人交互的便捷化,这两个非正式协议的机制便被引入到http中,其实这两种机制很久以前就已经存在(cookie是1993年提出,session暂不清楚)
cookie:默认情况下,当浏览器关闭后,Cookie数据被销毁
session:可以认为是服务器端开辟的一小块缓冲空间
举一个很贴近生活的例子,一般大部分小区都会有保安看守,想进小区无非不过就两种方法:
一、拥有你自己的身份证明,能证明你是小区里的人,拿给保安看。
二、让保安查询对应的小区出入信息登记表,核对身份后,方可进入。
这里的第一点就好比你自己的cookie,第二点里的登记表就好比小区为业主为专门设置的缓冲区(或者说记录表),也就是session。
本人小白,第一次发文,以上均为个人见解,如有不严谨的地方还望各位不吝赐教!
参考文链接:cookie