设备认证模块下的session机制tcp_session文件分析
本篇主要分析模块一中trans_service目录下tcp_session.h+.c代码。(tcp_socket理论篇) 文件路径(模块一\communication_softbus_lite-master\trans_service\source\libdistbus\tcp_session.c)
一、session机制
1.session session,中文经常翻译为会话,其本来的含义是指有始有终的一系列动作/消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个session。 session一词与网络协议相关联时,它又往往隐含了“面向连接”和/或“保持状态”这样两个含义,“面向连接”指的是在通信双方在通信之前要先建立一个通信的渠道,比如打电话,直到对方接了电话通信才能开始,与此相对的是写信,在你把信发出去的时候你并不能确认对方的地址是否正确,通信渠道不一定能建立,但对发信人来说,通信已经开始了。“保持状态”则是指通信的一方能够把一系列的消息关联起来,使得消息之间可以互相依赖。 2. 理解session机制 session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。 当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识 - 称为session id,如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。 3. session常见问题 3.1创建时间 一个常见的误解是以为session在有客户端访问时就被创建,然而事实是直到某server端程序调用时才被创建。 3.2 删除时间 综合前面的讨论,session在下列情况下被删除:
- 调用删除程序
- 距离上一次收到客户端发送的session id时间间隔超过了session的超时设置
- 服务器进程被停止(非持久session)
3.3 存放对象 session里面存放的对象不是必需序列化的。要求对象可序列化只是为了session能够在集群中被复制或者能够持久保存或者在必要时server能够暂时把session交换出内存。在Weblogic Server的session中放置一个不可序列化的对象在控制台上会收到一个警告。
二、代码分析
1. 头文件tcp_session.h
主要分析tcp_session.h中一些数据定义和结构体定义。 宏定义
#define NAME_LENGTH 64
#define SESSION_KEY_LENGTH 32
结构体
typedef struct {
List head;
int seqNum;
} SessionSeqNumNode;
typedef struct {
char sessionName[NAME_LENGTH];
char deviceId[MAX_DEV_ID_LEN];
char groupId[NAME_LENGTH];
char sessionKey[SESSION_KEY_LENGTH];
long seqNum;
int fd;
int busVersion;
int routeType;
bool isAccepted;
List *seqNumList;
} TcpSession;
函数声明
TcpSession* CreateTcpSession(void);
源文件tcp_session.c
知识点: 代码分析
TcpSession *CreateTcpSession(void)
{
TcpSession *tcpSession = (TcpSession *)malloc(sizeof(TcpSession));
if (tcpSession == NULL) {
return NULL;
}
if (strcpy_s(tcpSession->sessionName, NAME_LENGTH, "softbus_Lite_unknown") != 0) {
SOFTBUS_PRINT("[TRANS] CreateTcpSession cpy busname fail\n");
free(tcpSession);
return NULL;
}
(void)memset_s(tcpSession->deviceId, MAX_DEV_ID_LEN, 0, MAX_DEV_ID_LEN);
(void)memset_s(tcpSession->groupId, NAME_LENGTH, 0, NAME_LENGTH);
(void)memset_s(tcpSession->sessionKey, SESSION_KEY_LENGTH, 0, SESSION_KEY_LENGTH);
tcpSession->seqNum = 0;
tcpSession->fd = -1;
tcpSession->busVersion = 0;
tcpSession->routeType = 0;
tcpSession->isAccepted = false;
tcpSession->seqNumList = malloc(sizeof(List));
if (tcpSession->seqNumList == NULL) {
free(tcpSession);
return NULL;
}
ListInitHead(tcpSession->seqNumList);
return tcpSession;
}
以上为tcp会话机制理论知识和相关代码分析,感谢阅读。tcp_socket通信机制点击此处查看
|