prelogin数据包之response包

    prelogin数据包的详细讲解可以见《SQL server jdbc之prelogin数据包》,本文主要讲解这个包的响应包,在jdbc中日志中可以得到这个响应包的内容如下所示:

04 01 00 1F 00 00 01 00 00 00 10 00 06 01 00 16   ................
00 01 05 00 17 00 00 FF 0D 00 06 41 00 00 00      ...........A...

针对响应包的内容解析是在文件SQLServerConnection.java文件的Prelogin函数中。首先函数通过tdsChannel累中的read函数读取响应包的内容。再针对这些内容进行解析。

第一个字节(0x04):表示的是包的类型

第二个字节(0x01):表示的是响应的状态(status),必须为01,否则报错

第三,四字节(0x00 0x1F):表示包的长度

第9个字节(0x00):这个字节如果为-1,则会显示“Prelogin response is missing version and/or encryption option.”的警告信息,并且终止解析后的内容(记为v1)。

第10,11个字节(0x00 0x10):这两个字节的十进制值+8必须要大于0(记为v2),这个是选项的偏移量.

第12,13两个字节(0x00 0x06):这个字节的十进制值必须要大于0(记为v3),这个是选项的长度

如果v2+v3大于了包的长度,则得到异常信息与警告信息。

包剩下的内容就是选项的内容了,需要根据v1的值来选择不同的处理方法,v1的取值为0或者1.其他的都为得到Ignoring prelogin response option的日志信息。

下面根据不同的v1的值来进行讲解,剩下的内容如下所示:

01 00 16   ................
00 01 05 00 17 00 00 FF 0D 00 06 41 00 00 00      ...........A...

1. 当v1的值为0

1)判断v3的值是否为6.如果不为6,则抛出异常,并且打印警告日志为:Version option length:" + v3 + " is incorrect.  Correct value is 6。

2) 根据v2的值来取serverMajorVersion。从上面的数据包内容可以得到serverMajorVersion是0x0D(13)。

2. 当v1的值为1

1)判断v3的值是否为1,如果不为1,则抛出异常,并且打印警告日志为:Encryption option length:" + v3 + " is incorrect.  Correct value is 1.

2)从v2的值作为数据包的下标来取得negotiatedEncryptionLevel的值。这个值必须是在0,1,2,3这四个数字之一。

如果客户端要求加密(连接串中设置了encrypt为true),则negotiatedEncryptionLevel的值必须为1或者3.

如果requestedEncryptionLevel是2,则negotiatedEncryptionLevel不能为3.

上面就是整个prelogin包的响应包的解析情况。

 

 

 

 

 

 

 

转载于:https://my.oschina.net/u/918218/blog/708451

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值