赵龙 全栈之路

自学 网络协议中session(会话)的理解

| Comments

session 在维基百科中的条目解释

在计算机科学领域来说,尤其是在网络领域,会话(session)是一种持久网络协议,在用户(或用户代理)端和服务器端之间创建关联,从而起到交换数据包的作用机制,session在网络协议(例如telnet或FTP)中是非常重要的部分。
在不包含会话层(例如UDP)或者是无法长时间驻留会话层(例如HTTP)的传输协议中,会话的维持需要依靠在传输数据中的高级别程序。例如,在浏览器和远程主机之间的HTTP传输中,HTTP cookie就会被用来包含一些相关的信息,例如session ID,参数和权限信息等。

用普通人能理解的类比解释

session 是一次浏览器和服务器的交互的会话。会话就是互相问候,举例:我与朋友见面,我问候“你好吗?”,朋友回复“恩,很好”,对话结束即会话结束。

简单了解 session 会话的历史

浏览器打开一个网页使用 HTTP 协议,它是无状态,通俗理解为本请求和上一次请求无任何关系,互不认识,没有关联。

优点:

浏览器单一页面数据处理速度极快,表现为页面翻译速度快。

缺点:

浏览器请求有关联的几个页面时需要反复重复相同的请求,造成流程繁琐且增加数据库压力。例如:在www.a.com/login.php页面已经登陆了,在www.a.com/index.php需要再次登录。因为,这是 2 个不同的页面即不同的HTTP请求(无状态、无关联),无法在 index.php 页面中读取到 “ login.php 页面中已登陆” 的信息。

负面影响:

任何有一点不同的页面都要重复相同请求(例如,重复登录)。

  • 解决方案 1:每个页面都查询数据库(例如,每个页面的登录状态,都去数据库查询判断。该方案会增加不必要的数据库压力)。
  • 解决方案 2:Cookie,一种客户端存储方法,少量的信息存储在用户端(用户电脑、手机等)。它的存储路径为域名www.a.com,当用户用浏览器访问时,PHP(全称:PHP:Hypertext Preprocessor,即“PHP:超文本预处理器”)从该域名的任意页面读取Cookie中的信息。解决上一个方案的弊端的,免去反复查询数据库。
    注意: Cookie 储存在用户端,存储有限,安全性极低——用户可见并随意修改。

session 的出现

session 这种新的存储会话机制安全又方便的全局读取信息(储存在服务器的/tmp 目录下),解决了以上 2 个方案的痛点。

  • 通俗解释: 在一次会话中解决 2 次HTTP请求的关联,让它们产生联系并都能读取到找个这个全局的session信息。session信息存在于服务器端(解决安全问题)。

session的运行机制和是怎么保存的?

开启session,读取Cookie中的PHPSESSID是否有,如果没有,则新生成一个session_id,先存入Cookie中的PHPSESSID中,再生成一个sess_前缀文件。当有写入$SESSION的时候,往sess文件里序列化写入数据。当读取的session变量时,先读取Cookie中的PHPSESSID,获得session_id,再找这个sess_sessionid文件并获取对应的数据。由于默认的PHPSESSID是临时的会话,在浏览器关闭后会消失,当我们重新访问的时候,会新生成session_id和sess_这个文件。


参考原文:彻底弄清楚session是什么?

参考资料:

http://zhidao.baidu.com/link?url=2_phukSt0xI6SSIVKUE37TxzivLqdCz_JCPhIUPLMB3TX_IWgoVKL2lwDn1Gh7xTykyV3ezU1YQv9s6HD3uhO_

http://blog.sina.com.cn/s/blog_5f54f0be0100xs7e.html

http://star0708.blog.163.com/blog/static/181091248201341710100381/

http://baike.baidu.com/view/25258.htm?fr=aladdin

http://www.cnblogs.com/hongfei/archive/2012/06/17/2552434.html

Comments

comments powered by Disqus