特定于计算机科学和网络中,session 是限时的双路链接,是 TCP/IP 协议中相对较高的 layer,在两个或更多通讯设备或终端 (可能是计算机,自动系统,live active user) 之间支持交互表达和信息交换。session 于特定的时间点建立,在随后的某个时间点关闭。一个已建立的通讯会话可能在每个方向上都涉及超过一个消息。会话通常是 stateful,意味着至少通讯中的一方需要持有当前状态信息,保存会话的历史以便能够通讯,与之相反的是 stateless 通讯,通讯由独立的请求和响应组成。
一个已建立的会话是执行 connection-oriented communication 的基本需求。 会话也是 connectionless communication 模式下的基本步骤。然而,任何单向的传输都不需要定义一个会话。
Communication Transport 可能作为 OSI 模型中的应用层,会话层或传输层的协议和服务的一部分被实现。
- 应用层的例子:
- HTTP sessions,允许信息和单独的访问者关联
- telnet 远程登陆 session
- 会话层的例子:
- 基于 Internet Phone call 的 session Initiation Protocol (SIP)
- 传输层的例子:
- TCP session,与 TCP 虚拟回路,TCP 连接,或已建立的 TCP socket 是同义词
在传输协议没有实现正式的 session layer (e.g. UDP) 的情况下,或应用层的 session 通常十分短暂 (e.g. HTTP),session 由更高层级的程序使用定义于交换的数据中的方法来维护。例如,HTTP 在浏览器和远程主机间的交换可能就包含一个 HTTP cookie,它标识了状态 (例如唯一的 session ID) 以及关于用户优先级和权限等级的信息。
HTTP/1.0 在一个 Web/HTTP session 期间,仅允许单个请求和响应。协议版本 HTTP/1.1 通过完成 Common Gateway Interface (CGI),使管理 Web session 更加简单且支持 HTTP cookies 和文件上传。
大部分的 client-server session 由传输层管理 - 一个连接一个 session。然而 Web/HTTP session 的每个事务处理阶段都会创建一个单独的连接。保持阶段间 session 的连续性需要一个 session ID。Session ID 被嵌入到 dynamic web page 的 <A HREF> 或 <FROM> 链接中,所以它能传回了 CGI 中。CGI 随后使用 session ID 来保证 session 在事务处理阶段的连续性。每个事务一个连接的优点之一是在低带宽的连接上它也能工作的很好。
Software implementation
软件中,TCP 会话通常使用子进程或多线程实现,当计算机建立或加入一个会话时,新的进程或线程被创建。HTTP 会话通常不使用每个会话一个线程的方式实现,而是通过一个包含每个会话状态信息的数据库实现。多进程或线程的优点是降低了软件的复杂度,因为每个线程都是一个实例,它有自己的历史和封装的变量。缺点是系统资源的大量开销,且如果系统重启,会话可能会被中断。
当客户端可能连接服务器集群中的任何服务器时,如果服务器需要保持会话状态,保持一致性方面出现问题。客户端要么在会话期间被定向到同一个服务器,要么服务器就必须通过共享文件系统或数据库传输 server-side 的会话信息。否则。客户端可能重连到与开始会话时不同的服务器上,这会导致一个问题,新的服务器不能访问旧的服务器存储的状态。
Server-side web sessions
Server-side session 非常便利有效,但是如果与 load-balancing/high-availability 系统一起结合使用则变得难以处理,且在一些没有存储器的嵌入式系统中毫无作用。Load-balancing 的问题可以使用共享存储或者在每个客户端和集群中的单个服务器间应用强制对等,尽管这可能影响系统效率和负载分配。
在系统中不借助大量存储器来使用 server-side 会话的方法之一是预留一部分 RAM 来存储会话数据。这一方法对只有有限数量客户端的服务器来说是可应用的。(e.g. 不经常或不允许一次访问超过一个客户端的路由器或访问点)
Client-side web sessions
Client-side web session 使用 cookies 和密码技术来保持状态且不在服务器上存储太多数据。当展现一个动态网页时,服务器使用 cookie 的方式向客户端 (网页浏览器) 发送当前的状态数据。客户端将 cookie 存储到内存或硬盘中。每个成功的请求中,客户端都将 cookie 发送回服务器,服务器使用该数据来“记起”对这个特定客户端的应用状态,并产生一个合适的响应。
在某些上下文中,这个机制可能工作的很好,然而,存储在客户端上的数据很容易受到访问该客户端电脑的用户或软件的影响。使用 client-side sessions需要机密性和完整性的地方,下列条件需要得到保证:
- 机密性:除了服务器,任何其他的都不应该对会话数据进行解释。
- 数据完整性: 除了服务器,任何其他的都不应该操作会话数据(意外的或故意的)。
- 真实性:除了服务器,任何其他的都不应该发起合法的会话。
为了实现这一点,服务器需要在将会话数据发送到客户端前对数据进行加密,其他方对信息进行的修改应当通过密码方式避免。
仅当 cookie 很小时,在每个请求中来回发送状态才是实际的。本质上是,client-side 会话使用服务器磁盘空间交换每个 web 请求需要的额外的带宽。进一步来说,web 浏览器限制能被网站存储的 cookies 的数量和大小。为了提升效率和允许更多的会话数据,服务器在创建 cookie 前可能压缩数据,当 cookie 由客户端返回时再解压它。
HTTP session token
会话 token 是一个唯一的标识符,它由服务器生成,并从服务器发送到客户端,用于标识当前的交互会话。客户端通常将 token 作为 HTTP cookie 和/或 GET 或 POST 查询的参数进行存储和发送。使用会话 token 的理由是客户端仅必须处理标识符–所有的会话数据都存储在服务器上 (通常存储在数据库中,客户端不能直接访问),并使用该标识符链接。
Session management
在人机交互中,会话管理是在与计算机系统交互的会话中持续追踪用户活动的过程。
桌面环境中典型的会话管理任务包含追踪哪些应用被打开了,哪些文档被应用打开了,所以当用户登出随后再登入时,相同的状态能被恢复。对于网站来说,会话管理可能涉及如果会话过期,可能需要用户重新登陆 (i.e.,在一个确定的时间限制内,用户没有任何活动)。它也用于存储 HTTP 请求间 server-side 的信息。
Desktop session management
桌面会话管理者是一个程序,它能存储和恢复桌面会话。桌面会话是当前所有运行的窗口和它们当前的内容。基于 Linux 系统的会话管理由 X session manager 提供。
Browser session management
会话管理在 web 浏览器中十分有用,用户能存储所有打开的网页和设置,且能在随后的某个时间或在不同的电脑上(see data porbility)恢复它们。为了帮助从系统或引用崩溃中恢复,页面和设置也可以在下次运行时恢复。会话管理通常通过应用的 cookie 管理。
Web server session management
Hypertest Transfer Protocol (HTTP) 是无状态的:每个运行网页浏览器的客户端计算机对每个新的 HTTP GET 或 POST 请求都必须与 web 服务器建立一个新的 Transmission Control Protocol (TCP) 网络连接。因此,web 服务器不能在一个已建立的 TCP 网络连接上进行超过一个 HTTP GET 或 POST 操作。会话管理是 web 开发者使用的一项技术,用于使无状态的 HTTP 协议支持会话状态。例如,一旦一个用户已被 web 服务器验证,该用户的下一个 HTTP 请求 (POST 或 GET) 就不应该导致 web 服务器再次请求用户的账户和密码。关于实现这一点的方法的讨论见 HTTP cookie 和 Session ID。
在多个 web 服务器必须共享会话状态的场景中 (典型的在集群环境中),会话信息必须在运行 web 服务器软件的集群节点中共享,在集群节点中共享会话信息的方式包括:向成员节点多播会话信息 (见 JGroups 作为这个技术的一个例子),使用 disturbuted shared memory 或 memory virtualization 与其他节点共享会话信息,使用网络 sockets 共享会话信息,在共享文件系统上,比如 distributed file system 或 global file system,存储会话信息,或者在集群外的数据库中存储会话信息。
如果会话信息被认为是短暂的,易变的数据,不需要 non-repudiation 的事务且不包含是 complicance auditing 项的数据,任何用于存储会话信息的方法都能被使用。然而,如果会话信息是 audit compliance 项,应当考虑用于会话存储,复制和集群的方法。
在 service-oriented architecture,使用 Extensible Markup Language (XML) 消息构建的 Simple Object Access Protocol 或 SOAP 消息能被消费者应用使用来使服务器创建会话。