2016-08-28 17:22:25 +08:00
2016-08-26 13:30:10 +08:00
upd
2016-08-28 16:53:55 +08:00
upd
2016-08-28 17:22:25 +08:00
upd
2016-08-26 15:51:33 +08:00
2016-08-26 13:30:10 +08:00
upd
2016-08-28 16:53:55 +08:00
upd
2016-08-28 17:22:25 +08:00
upd
2016-08-28 16:53:55 +08:00
upd
2016-08-28 12:17:01 +08:00

smux simple multiplexing

goals

  1. receive window is shared among the streams.
  2. precise flow control(pluggable stragety like linux TC).
  3. precise memory control.
  4. maximized payload.
  5. optimized for high-speed streams.
  6. aim for game services.
FRAMETYPE=Data, OPTIONS=(flagSYN, flagACK, flagFIN, flagRST)
+---------------+--------------+------------+--------------+--------------------------------+
|               |              |            |              |                                |
| FRAMETYPE(1B) | OPTIONS(1B)  | LENGTH(2B) | STREAMID(4B) | DATA(MAX 64K)                  |
|               |              |            |              |                                |
+---------------+--------------+------------+--------------+--------------------------------+

FRAMETYPE=WindowUpdate
+---------------+--------------+------------+
|               |                           |
| FRAMETYPE(1B) |  WINDOWSIZE(4B)           |
|               |                           |
+---------------+--------------+------------+

FRAMETYPE=Ping, OPTIONS=(flagSYN, flagACK)
+---------------+--------------+------------+------------+
|               |              |                         |
| FRAMETYPE(1B) | OPTIONS(1B)  | PINGID(4B)              |
|               |              |                         |
+---------------+--------------+------------+------------+

FRAMETYPE=GoAway 
+---------------+---------------+
|               |               |
| FRAMETYPE(1B) | ERROR(2B)     |
|               |               |
+---------------+---------------+

Stream.Write([]byte) 
  --> Framer.split([]byte) 
    --> Qdisc.Enqueue(Frame) 
      --> (goroutine: Session.xmit() { Qdisc.Dequeue() } 
        --> conn.Write(Framer.serialize())

Stream.Read([]byte) 
  --> Stream.RxQueue <-- Framer.deserialize <-- (goroutine: Session.recvLoop(conn))

status

in-progress

S
Description
A Stream Multiplexing Library for golang with least memory usage(TDMA)
Readme
669 KiB
Languages
Go 100%