compare with websocket and fastcgi protocol - noradle/noradle-dispatcher GitHub Wiki
noradle-dispatcher 的协议受到了 WebSocket/FastCGI 两个协议的启发。
differences between WebSocket and FastCGI
- WebSocket protocol is for (massive) browser to server end-to-end communication
- FastCGI is used for (http)server to (application)server end-to-end communication
共通点
- client/server 点对点通信采用单TCP/stream链路,不会为各个请求单独创建连接
- 基于 frame 的多路复用,通过 frame 中的 req id 或者 slot id 来区分并发的请求响应 frame
- frame 分为应用类和管理类,id 分别为大于0,和等于0
- 应用类别的frame: 一个请求或响应都是一个 frame 流,由 head,body/end/exception 等等不同类别的 frame 组成一个完成的请求和响应
- 管理类别的frame:往往一个frame单独就是一个完整的请求或者响应,不用流
- websocket: Opcode:4位操作码,包括 text/binary/ping/pong/close
- noradle 已经引用 frame type,而且 slotID=0 代表管理包 ping/pong/quit
- 管理frame有 ping/pong frame 机制,实现端到端 keep-alive 和心跳检测
- 管理frame有 quit frame 机制,实现端到端的安全退出
遗弃点
但是 noradle-dispatcher 没有使用一些 websocket/fastcgi 的特性和机制,目的是为了简化设计,降低处理负载(而不是轻微的降低网络负载)。
- 长度指示变长机制
- websocket: payload length 不定长,noradle 是定长4个字节,对于单个 frame 2G/4G 足够用了。
- fast-cgi : one byte or four bytes, see if the first byte is greater than 127
- padding
- fast-cgi : 每个 record 内容体都要 padding 到整数个 8 字节
- frame 分片和组装
- websocket: 大的 frame 分片,防止传输被一个请求独占,不过 noradle 已经将上传文件留下不发往db,因此意义不是很大