第二章 会话(Session)管理
会话是非常重要的一个概念,类似 TCP 中的连接 Socket,客户端与服务端握手成功后会在内存中创建 Session 对象,由双方共同生成 Session ID 唯一标识这个双向连接。后续的所有通信帧都要在头部中包含 Session ID,在解析帧数据时从内存中获取其对应的 Session 对象。
握手过程中会对连接服务器的客户端进行认证,同时协商加密参数,认证成功后将加密参数设置到 Session 中,后续所有数据帧的负载数据全部是加密的。
Session 会记录最近活跃时间,空闲超过一段时间会过期,从而被关闭掉,防止资源被无意义的占用。为了保持会话一直有效,需要客户端间隔发送心跳检测帧,服务端在收到心跳检测帧后尽快回复应答帧。
Session 中分配了发送队列与接收队列数据缓存,通过 Session 发送或接收的全局数据存储在 Session 的相应发送或接收缓存中。基于 Session 创建的 Stream 也存储在 Session 中。
创建 Session 时,客户端首先发起向服务端的连接并发送握手帧,握手成功后,客户端和服务端分别创建好 Session对象并返回给上层应用程序。应用程序可以通过 Session 发送与接收数据或者打开 Stream,并通过 Stream 发送与接收数据。