-
Notifications
You must be signed in to change notification settings - Fork 2.5k
Network Layer
Linwei edited this page Sep 4, 2017
·
6 revisions
一个纯算法的 KCP对象,组成了一个干净独立的协议单元:
kcp 的 input, output 方法用来对接下层的 udp 收发模块。而 ikcp_send, ikcp_recv 提供给上层逻辑调用实现协议的收发。
不同的协议单元模块可以串联起来,比如:
假设你设计了一套 fec 协议,那么可以把 kcp 的 input/output 和fec协议的 send/recv 串联起来,使 kcp->output 被调用时,把kcp希望 发送的数据调用 fec 的 send 方法传递给 fec模块,而从 fec 模块 recv 到的数据再反向 input 给 kcp。
而原来直接和 kcp 接触的 udp 传输层,就放到了 fec层下面,与 fec打交道,这样就完成了协议组装。
你可能需要实现 UDP绘话管理,KCP,加密 等若干功能,那么最好的做法就是把他们实现成协议单元,然后串联起来成为协议栈,这样每一层可以 单独开发调试,需要时再进行串联,这是网络库成熟的写法。
为了方便数据再协议栈中高性能的传递,你可以选择实现类似 linux skbuf 的数据结构来管理各个数据包:
这样的数据结构方便在包的头部不断添加或者剥离数据,当数据包由最高层协议产生不断往下传递的过程是一个不断追加包头的过程,而数据接收回来,从最底层进入一直往上的过程是一个不断剥离包头的过程,使用 skbuf 数据结构利于避免追加/剥离包头时的频繁内存拷贝。