Skip to content

协议改进 #1

@bg5sbk

Description

@bg5sbk

改进点:

  • 让握手和重连区分更明显
  • 重连失败有明确响应

新建连接,上行:

  • 新建连接时,客户端先发送一个全0的字节告知服务端这是一个新连接

  • 接着客户端发送8个字节的握手请求

  • PublicKey为DH密钥交换用的公钥

     type HandshakeRequest struct {
     	PublicKey uint64
     }
    

新建连接,下行:

  • 当服务端收到新建连接请求后,下发16个字节的握手响应

  • PublicKey为DH密钥交换用的公钥

  • CryptedConnID为加密后的连接ID,加密所需密钥通过DH密钥交换算法计算得出

     type HandshakeResponse struct {
     	PublicKey     uint64
     	CryptedConnID uint64
     }
    

重连,上行:

  • 当客户端尝试重连时,新建一个TCP/IP连接,并发送一个全1的字节告知服务端这是一个重连

  • 接着客户端40个字节的重连请求

  • ConnID为连接ID

  • WriteCount为客户端已发送字节数

  • ReadCount为客户端已接收字节数

  • MD5Hash为消息前24个字节加通讯密钥计算得出的MD5哈希值

     type ReconnRequest struct {
     	ConnID     uint64
     	WriteCount uint64
     	ReadCount  uint64
     	MD5Hash    [16]byte
     }
    

重连,下行:

  • 当服务端接收到重连请求时,对连接的合法性进行验证

  • 服务端下发16个字节的重连响应

  • 验证失败:

    • WriteCount始终为-1
    • ReadCount始终为-1
  • 验证成功:

    • WriteCount为服务端已发送字节数
    • ReadCount为服务端已接收字节数
  • 紧接着服务端立即下发需要重传的数据

  • 客户端在收到重连响应后,比较收发字节数差值来读取服务端下发的重传数据

     type ReconnResponse struct {
     	WriteCount uint64
     	ReadCount  uint64
     }
    

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions