tcputil是一个简单高效的Go语言TCP/IP网络编程库。 其中的代码和算法来源于真有趣团队的项目实践。
tcputil的目标是为基于消息包的TCP/IP网络应用提供一个稳定、便利、执行效率高的底层。
基于消息包的TCP/IP网络应用是生活中最常见的一种TCP/IP应用类型,例如:聊天系统、网络游戏等。
但是TCP/IP是面向流的协议。所以基于包的TCP/IP网络应用,通常都有一套自己的消息包分割算法,用于从TCP/IP网络流中分割出一个个独立的消息包。
最常用的算法是在每个消息包的头部安插固定字节数的包长度信息,例如mysql的通讯协议就是这么做的。
tcputil用的也是同样的算法,tcputil中提供了类似Erlang的{pack: N}的分包协议设置,调用者只需要预先设置要用几个字节存储消息长度,tcputil就会按设置进行接收和发送消息包。
tcputil在消息处理时,使用了一个简单的内存池算法,可用于避免不固定长度的消息,频繁的申请零碎的内存,在实际项目中已经证明这个算法可以对网络应用起到一定的优化作用。
tcputil还内置了一套经过优化的网关代码,这套网关有以下特性:
- 支持分布式部署的多对多结构,一个网关前端可以连接到多个网关后端,一个网关后端可以被多个网关前端连接
- 转发消息时不需要重复申请内存和复制数据
- 经过优化的广播机制,一个广播只需要在网关之间通讯一次,减少系统调用的同时也降低带宽消耗
网络层作为网络应用的底层,其稳定性是网络应用的重要指标,所以tcputil做了比较充分的单元测试来提早发现自身的问题。
我们将这些代码和算法从项目中提取出来的目的,除了方便自己方便大家,也希望在将来tcputil能成为一个好用的,并且经过比较多项目验证的,可以让人放心使用的网络编程库。 所以希望大家在使用过程中如果有遇到问题,及早反馈,便于我们改进,同时也欢迎大家贡献代码和想法。
我们团队的邮箱是:realint[at]qq.com
tcputil中的协议解析部分,为了追求效率,使用了指针操作进行强制类型转换,其原理是先假定进行通讯的两端的CPU使用的都是同样的大小端格式,比如都是小端格式或者都是大端格式。
就目前的实践经验来判断,以及从同行前辈那道听途说,似乎很难在生产环境和应用环境找到大端格式的设备。
所以这里做了一个比较大胆的假设,假设tcputil只部署于小端格式的设备上。
目前已测试可用的部署环境有:Windows、Linux、MaxOS系统 + x86或i686架构CPU的环境。
配套的客户端通讯代码,请注意使用小端格式,例如ActionScript3中的字节流和套接字默认都是是大端格式,需要手工设置成小端格式。
如果您的应用是部署于特殊环境,请谨慎使用tcputil。
如果您有很大把握证明大端格式的设备也很常见,请告诉我们,我们会考虑是否牺牲效率换取通用性。
最近项目比较赶,没空写教程,请大家暂时先通过tcp_test.go文件中的代码揣摩用法。目前wiki是开放编辑的,欢迎大家贡献教程文档和示例,谢谢。