OpenRTMFP/Cumulus性能优化(5) RTMFP协议详解(2)

        前一篇文字http://blog.csdn.net/linyanwen99/article/details/8664626叙述了rtmfp协议第一趟的握手流程,

本篇文字继续叙述第二趟握手流程,如下:

一.接收packet的处理,如下图:

1.读取该request的数据,如下:

    (1)UInt8 marker = packet.read8();其中marker==0x0b,表示session启动过程.

    (2)UInt16 time = packet.read16();

    (3)UInt8 id = packet.read8();

    (4)UInt16 size = packet.read16();

    说明:这里读取到的id值为id==0x38,表示Initiator Initial Keying chunk,简称IIKeying数据块.

    (5)(UInt32&)farId = request.read32();//读取farId

    (6)if(request.read7BitLongValue()!=COOKIE_SIZE)//比较cookie是否匹配

    (7)std::map<const UInt8*,Cookie*,CompareCookies>::iterator itCookie = _cookies.find(request.current());//查找cookie,该cookie就是在第一趟握手阶段创建的

    (8)读取剩下的signaturepublic key,如下:

    request.next(COOKIE_SIZE);

    size_t farSignatureLen = (size_t)request.read7BitLongValue();EVP_Digest(request.current(),farSignatureLen,(UInt8*)   peer.id,NULL,EVP_sha256(),NULL);

    std::vector<UInt8> publicKey(request.read7BitValue()-2);

    request.next(2); // unknown

    request.readRaw(&publicKey[0],publicKey.size());

    size_t farCertificateLen = request.read7BitValue();//证书长度

转载请注明出处:山水间博客,http://blog.csdn.net/linyanwen99/article/details/8667459

二.Response packet的处理,如下:

1.根据上面的加密,解密数据,farid,以及一些与client相关的数据,创建session,如下:

    Sessionsession = _gateway.createSession(farId,peer,pDecryptKey,pEncryptKey,cookie);

    (UInt32&)cookie.id = session.id//serial number

2.写入signaturepublic key,如下:

    _writer.write32(id);

    _writer.write7BitLongValue(_nonce.size());

    _writer.writeRaw(&_nonce[0],_nonce.size());

    _writer.write8(0x58);//unknown

3.写入typeIdSize,如下:

    response.write8(0x78);

    response.write16(response.length()-response.position()-2);

说明1:计算加密解密,如下:

    UInt8 decryptKey[AES_KEY_SIZE];

    UInt8* pDecryptKey=&decryptKey[0];

    UInt8 encryptKey[AES_KEY_SIZE];

    UInt8* pEncryptKey=&encryptKey[0];

    RTMFP::ComputeDiffieHellmanSecret(_pDH,initiatorKey,initKeySize,sharedSecret);

    RTMFP::ComputeAsymetricKeys(sharedSecret,initiatorNonce,initNonceSize,&_nonce[0],_nonce.size(),decryptKey,encryptKey);

 这些函数最底层都是调用了openssl函数的接口,欲知这些函数接口的功能以及如何使用,请关注本系列文字的更新,后续会讲到.

说明2:这里讲的都是正常的握手情况,不考虑异常情况的处理,欲知异常情况的处理,请关注本系列文字的更新,后续会讲到.

至此,第二趟握手也已经结束

 

未完待续~~

 

转载请注明出处:山水间博客,http://blog.csdn.net/linyanwen99/article/details/8667459

你可能感兴趣的:(山水间文集)