com.qifun.bcp

Bcp

object Bcp

BCP协议相关的数据结构和常量

BCP(Brutal Control Protocol,残暴控制协议)是基于TCP实现的用户层传输协议。特性如下:

  1. 基于连接
  2. 可靠,低延时
  3. 以数据包为单位,没有流
  4. 乱序数据包,不保证接收顺序与发送顺序一致
BCP vs. TCP

BCP和普通TCP功能相似,重新实现了TCP的包确认重发机制。

当网络条件不好,丢包频繁,TCP重传间隔时间会变得很长,从而基本不可用。 这种情况下,BCP会暴力杀死底层TCP连接,强制重建TCP连接,暴力重发数据,避免丢失数据并减少延时。

BCP和TCP都属于面向连接会话的协议。 但另一方面,BCP数据不是TCP那样的流,而以Packet为单位。 BCP协议不保证接收方收取Packet的顺序和发送方发出Packet的顺序一致。 这是因为,一条BCP会话,可能会对应多达MaxConnectionsPerSession个底层TCP连接, 而这几条底层TCP连接的延时可能并不相同。

BCP会话的一生
  1. 客户端随机生成NumBytesSessionId字节的会话ID。
  2. 客户端发起TCP连接。
  3. TCP连接成功建立后,客户端发送ConnectionHead, 其中包括先前生成的会话ID和varint格式的底层连接ID。 每条会话的底层连接ID都从0开始, 每当客户端发起新TCP连接时,底层连接ID递增1。
  4. 客户端或服务端发送Data包,向对端发送用户数据。
  5. 每发一个Data,对端都回应Acknowledge
  6. 如果客户端或服务端连续HeartBeatDelay时间, 都没有Packet需要发送,那么发送一个HeartBeat到对端。
  7. 如果客户端或服务端连续ReadingTimeout都收不到任何数据, 就认为这个TCP连接已经没救了,就关闭这个TCP连接。
  8. 当客户端发送一个包,并超过BusyTimeout时间收不到对端都回应的Acknowledge时, 就认为已有底层TCP连接速度太慢,客户端可以发起新的TCP连接, 把一部分Data放到新的TCP连接上发送。
  9. 新增TCP连接与首个TCP一样,仍然属于同一会话, 客户端也需要在连接建立后发送ConnectionHead。 但此处的会话ID应当重用原有的会话ID,不要生成新ID。
  10. 如果客户端发现某一会话中的TCP连接超过IdleTimeout时间没有发送任何数据, 且该连接不是最后一条连接,那么客户端可以向服务端发送Finish,关掉这条TCP连接。
  11. 服务器收到Finish时,应当回复Acknowledge,然后关掉底层连接。
  12. 如果一个底层TCP连接因为超时或者别的原因异常中断, 那么每一端都必须在同一会话的其他TCP连接上, 重发那些尚未收到对应AcknowledgeDataFinish。 重发的RetransmissionDataRetransmissionFinish包中, 包含原先连接ID和原先包ID。 包ID是指原包的序号,从零开始计算, 原连接每发送一个DataFinish,序号就递增1。
  13. 当客户端和服务端希望结束BCP会话时,向对端发送ShutDown, 然后清除该会话相关的所有数据。
  14. 对端收到ShutDown后,无须回复,直接清除会话相关的所有数据。

此外,客户端可以把会话ID记录在文件中。 如果应用崩溃,用户在短时间内重连, 客户端可以使用先前保存的会话ID,而不需要重新生成会话ID。 这种情况下,客户端应当在建立连接后立即发送Renew给服务端, 服务端会放弃重发原会话尚未成功发送的数据, 但同时会视为会话从未断开,不会清除原会话的服务端数据。

Linear Supertypes
AnyRef, Any
Content Hierarchy Learn more about scaladoc diagrams
Ordering
  1. Grouped
  2. Alphabetic
  3. By inheritance
Inherited
  1. Bcp
  2. AnyRef
  3. Any
  1. Hide All
  2. Show all
Learn more about member selection
Visibility
  1. Public
  2. All

Type Members

  1. sealed trait AcknowledgeRequired extends Packet

    需要回复Acknowledge的协议

  2. sealed trait ClientToServer extends Packet

  3. final case class ConnectionHead(sessionId: Array[Byte], isRenew: Boolean, connectionId: Int) extends Product with Serializable

  4. sealed trait ConnectionState extends AnyRef

  5. final case class Data(buffers: Seq[ByteBuffer]) extends ServerToClient with ClientToServer with AcknowledgeRequired with Product with Serializable

  6. sealed trait Packet extends AnyRef

  7. sealed trait Retransmission extends Packet

    重传的数据

  8. final case class RetransmissionData(connectionId: Int, packId: Int, buffers: Seq[ByteBuffer]) extends ServerToClient with ClientToServer with AcknowledgeRequired with Retransmission with Product with Serializable

  9. final case class RetransmissionFinish(connectionId: Int, packId: Int) extends ServerToClient with ClientToServer with AcknowledgeRequired with Retransmission with Product with Serializable

  10. sealed trait ServerToClient extends Packet

Value Members

  1. final def !=(arg0: Any): Boolean

    Definition Classes
    AnyRef → Any
  2. final def ##(): Int

    Definition Classes
    AnyRef → Any
  3. final def ==(arg0: Any): Boolean

    Definition Classes
    AnyRef → Any
  4. object Acknowledge extends ServerToClient with ClientToServer with Product with Serializable

  5. final val BusyTimeout: FiniteDuration

    连接在busy状态多长时间就新建链接

  6. object ConnectionBusy extends ConnectionState with Product with Serializable

  7. object ConnectionIdle extends ConnectionState with Product with Serializable

  8. object ConnectionSlow extends ConnectionState with Product with Serializable

  9. object Data extends Serializable

  10. object Finish extends ServerToClient with ClientToServer with AcknowledgeRequired with Product with Serializable

    结束一个TCP连接,相当于TCP FIN。

    结束一个TCP连接,相当于TCP FIN。

    Note

    不能直接用TCP FIN是因为一方发送Finish后还可能继续发Acknowledge。 而在调用shutdown发送TCP FIN后,就没办法再发送Acknowledge了。

  11. object HeartBeat extends ServerToClient with ClientToServer with Product with Serializable

  12. final val HeartBeatDelay: FiniteDuration

    当一个TCP连接空闲多长时间没发送任何数据时,发一个心跳包

  13. final val IdleTimeout: FiniteDuration

    连接在idle状态多长时间就关闭链接

  14. final val MaxActiveConnectionsPerSession: Int(3)

    每个会话最多允许多少个活跃TCP连接

  15. final val MaxConnectionsPerSession: Int(5)

    每个会话最多允许多少个TCP连接,包括活跃TCP连接和还没有收到Finish但已经关闭的僵尸连接

  16. final val MaxDataSize: Int(100000)

    数据包上限是多少字节

  17. final val MaxOfflinePack: Int(200)

    最多缓存多少个离线包

  18. final val NumBytesSessionId: Int(16)

    Session ID由多少字节构成

  19. final val ReadingTimeout: FiniteDuration

    多长时间收不到任何包,就杀掉TCP连接。

  20. final val ReconnectTimeout: FiniteDuration

    重新建立链接时间

  21. object RetransmissionData extends Serializable

  22. object RetransmissionFinish extends Serializable

  23. object ShutDown extends ServerToClient with ClientToServer with Product with Serializable

  24. final val WritingTimeout: FiniteDuration

    多长时间发不出数据就杀掉TCP连接。

    多长时间发不出数据就杀掉TCP连接。

    发数据超时只可能因为TCP缓冲区满, 只有发送超大数据包时,客户端很慢,才会发生这种情况,可能性微乎其微。

  25. final def asInstanceOf[T0]: T0

    Definition Classes
    Any
  26. def clone(): AnyRef

    Attributes
    protected[java.lang]
    Definition Classes
    AnyRef
    Annotations
    @throws( ... )
  27. final def eq(arg0: AnyRef): Boolean

    Definition Classes
    AnyRef
  28. def equals(arg0: Any): Boolean

    Definition Classes
    AnyRef → Any
  29. def finalize(): Unit

    Attributes
    protected[java.lang]
    Definition Classes
    AnyRef
    Annotations
    @throws( classOf[java.lang.Throwable] )
  30. final def getClass(): Class[_]

    Definition Classes
    AnyRef → Any
  31. def hashCode(): Int

    Definition Classes
    AnyRef → Any
  32. final def isInstanceOf[T0]: Boolean

    Definition Classes
    Any
  33. final def ne(arg0: AnyRef): Boolean

    Definition Classes
    AnyRef
  34. final def notify(): Unit

    Definition Classes
    AnyRef
  35. final def notifyAll(): Unit

    Definition Classes
    AnyRef
  36. final def synchronized[T0](arg0: ⇒ T0): T0

    Definition Classes
    AnyRef
  37. def toString(): String

    Definition Classes
    AnyRef → Any
  38. final def wait(): Unit

    Definition Classes
    AnyRef
    Annotations
    @throws( ... )
  39. final def wait(arg0: Long, arg1: Int): Unit

    Definition Classes
    AnyRef
    Annotations
    @throws( ... )
  40. final def wait(arg0: Long): Unit

    Definition Classes
    AnyRef
    Annotations
    @throws( ... )

Inherited from AnyRef

Inherited from Any

ConnectionStates

ConnectionsStates

Constants

Protocols

Ungrouped