一.在握手创建session阶段,接收到的packet包的id都为0,该阶段的主要过程为client端发送hello数据块至server端,然后,server端也会创建rhello数据块响应client端,rhello包含server端创建的cookie以及认证证书certificate,具体流程如下:
二.对接收到的packet进行处理如下:
接收到的packet结构如下,(该图为网友提供):
1.UInt8 marker = packet.read8();//读取Marker
UInt16 time = packet.read16();//读取TimeSent
UInt8 id = packet.read8();//读取TypeID
UInt16 size = packet.read16();//读取Size
说明:(a)在client发送的hello数据块里,读取到的marker的值为marker==0x0b,写成二进制形式为marker==00001011,
最后两位的值确定了该packet的类型,如下:
0:表示禁止值
1:表示发送者标志
2:表示响应者标志
3:创建Session启动类型
所以,由上面的marker可知,该packet类型为创建Session启动类型.
(b).这里读取到的id值为0x30,表示为hello数据块
2.继续读取packet数据,如下:
request.read8(); //跳过Unknown
UInt8 epdLen = request.read8()-1;//读取EPD Length
UInt8 type = request.read8();//读取type
string epd;
request.readRaw(epdLen,epd);//读取EPD
string tag;
request.readRaw(16,tag);//读取tag
response.writeString8(tag);//把tag写入response,协议要求的
其中hello数据块的结构如下:
三.response的处理,如下:
response的结构图如下:
1.如上所述,已经把tag写入response.
2.接着创建cookie并写入response,如下:
Cookie* pCookie = attempt.pCookie;
writer.write8(COOKIE_SIZE);
writer.writeRaw(pCookie->value,COOKIE_SIZE);
3.把认证证书写入response,如下:
memcpy(_certificat,"\x01\x0A\x41\x0E",4);
RandomInputStream().read((char*)&_certificat[4],64);
memcpy(&_certificat[68],"\x02\x15\x02\x02\x15\x05\x02\x15\x0E",9);
response.writeRaw(_certificat,sizeof(_certificat));
4.把TypeID写入response,如下
response.write8(0x70);
5.把Size写入response,如下:
response.write16(response.length()-response.position()-2);
最后发送给client端,第一趟握手结束.
其中rhello数据块的结构图如下:
未完待续~~
转载请注明出处:山水间博客,http://blog.youkuaiyun.com/linyanwen99/article/details/8664626