TNS协议分包
SDU
SDU(Session Data Unit Size)是一项网络参数设置项。其值直接影响TNS协议网络包大小。 SDU取值范围: 0x200 <= sdu <= 0xffee 适用于oracle版本不高于11g 0x200 <= sdu <= 0x200000 适用于oracle版本不小于12c TNS协议网络包大小不大于SDU。
缓存
每个连接都是有两缓存:写缓存和读缓存。
两个缓存大小不一定相同(但都不大于SDU)。目前从jdbc分析到缓存大小计算方法: SDU - 预留空间;预留空间原驱动不同有所差异。
写缓存
-
缓存空间前8字节或10字节为协议头预留。协议内容从协议头后面开始写入。(TNS协议类型决定是8字节还是10字节)
-
每写一值前都会判断剩余缓存空间够不够。
-
如果够,则把数据写入缓存区。
-
如果不够,则把缓存区内的先发送出去,再把数据写入缓存区开始位置(缓存空间协议头后面)。
写数组时两种情况:
a. 先把缓存区填满后发送,再把留个数据写入缓存区。
b. 先发送之前的数据,再把数据写入缓存区。
读缓存
- 读取一个TNS包到读缓存区。从缓存空间协议头后面开始解析TTC协议数据。
- 当发现缓存区剩余空间不够取当前数据时:
a. 开辟一块满足当前数据大小的新的空间,把缓存区剩余内容拷贝到新的空间。
b. 把缓存区内容替换成下个TNS数据包,从缓存空间协议头后面开始解析数据,把当前的数据剩余的数据拷贝到新的空间。