- 论坛徽章:
- 9
|
本帖最后由 wlmqgzm 于 2015-10-27 12:20 编辑
这个算是大数据的底层架构之一: 网络错误自修复统一协议栈, 这一层是Google一直没有开源的一层架构.
正在 自修复协议栈的开发, 正在做代码中. 这一层提供给应用层一个高可靠全透明的网络环境, 数据的读写结构是struct, 最终目标是访问远端数据跟访问本地共享内存中的一样简单可靠.
自修复协议栈的设计看上去很简单, 似乎怎么定义都可以,
协议栈的核心就是定义TLVV: type, length, value, verify. 最后还有一个可选项control. 其中, 做代码的时候, 最难的部分是control, 这个是底部错误流程的体现,
其实, 这个层多数游戏公司也都有做类似的东西. 各类网络接口, 都有类似的东西,
就是只有大公司有统一架构, 其他部门直接调用库就可以了, 不需要考虑底层的东西. 过滤掉全部错误处理.
里面的门道很多的. 由于是底层库, IO层, 效率要求高, 可靠性要求高, 对应用层来说, 没有什么错误可见, 这层是一个高可靠的透明的东西, 自动重发,自动重连,自动数据校正, 跟访问本地内存的可靠性一样高.
所有的数据都跟UDP一样, 有完整性, 应用层收发的结构不是数据流, 是struct.
这一层协议栈控制字节如果有流控设计, 下一层使用UDP也是可以的.
设计上要注意的地方也多, 先说4个点:
1)校验码的位置有讲究: 校验码要放在数据的结尾, 中间任何一Byte字节丢失后, 校验码由于被移位的原因, 一定会被检出. 放在前面, 对于丢字节的情况, 存在一定概率未被检出.
2)同步码很重要; 很多人不设计同步码的. 其实, 同步码长度要求不高, 允许与数据重复, 只有同步出错才用到. 找同步的时候, 结合校验码, 就跳过了疑似同步码, 对于单个数据包被破坏, 只要有同步头在, 最多丢弃这个包, 后续的数据包都是完整的. 再同步是相当的容易. 同步头一般放到最后或者最前, 个人倾向放到最后.
3)控制字节的位置重要: 一般要放到最前方的字节,出错概率最小.单字节无大小序, 对于后面的处理方便.
控制字节最终决定控制流程, 统一架构的设计主要在这里体现, 大公司里一般非做此层库的, 一般不接触此控制字节的内容, 因为这些对上层是透明的, 看不到.
4)校验字节的校验方法很重要: 校验方法有很多, 为了可靠, 每个字节的32位校验+不支持情况下Boost crcr32c软件校验, 至少要有2次非相关的校验, 带来64位校验的效果, 只有2倍的处理复杂度, 提高到64位校验的精确度. 校验方法尽量采用硬件校验, 目前采用的是intel CPU自带的SSE4.2指令校验, 校验方法是crc32c, 校验速度基本是内存瓶颈. 标准的64位校验性能比较低. |
|