我的网络编程之旅
来源:互联网 发布:apm2.6地面站软件 编辑:程序博客网 时间:2024/05/05 16:46
网络编程是什么?
熟悉Socket编程,熟悉Tcp/Ip协议栈;
熟悉TCP/IP协议、UDP协议,有相关的协议开发经验;
熟悉网络编程/多线程编程技术;
tcp/ip协议分析
socket编程
局域网
我们这个项目主要针对局域网用户,相比广域网的网络环境,几乎可以忽略带宽考虑,用户并发数也相对较小,对性能和效率要求较低,另外业务较复杂。在这种情况下最合适的就是采用RFC(远程过程调用),于是我们首先想到了开源的RFC框架,经他人尝试推荐采用了RCF,相当于我们只需要在此框架上套上业务逻辑即可,起初在我们实践和小规模的测试中并未发现有问题,但是真正模拟到高并发情况时却在网络层出现了不可控的错误,初步判断是RCF的线程模型和我们的使用场景不一致,于是决定开发一套自己的网络库,于是在一位以前有过网游经验的研发人员的指导下,我们一起开发了一个基于boost asio的远程过程调用框架,boost asio的网络模型在windows下采用的完成端口,在类unix系统下采用的是相应的多路复用接口,由于在局域网环境下,用户并发数也不多,也就是用好boost asio,设计好网络传输协议,处理好数据封包解包就好了,并未遇到太大的问题。广域网
首先抛开广域网复杂的网络环境不谈,这个产品是个互联网项目,面向普通用户,有些类似于IM软件,由于有QQ这个优秀的采用UDP协议的例子,我们也曾经在TCP和UDP协议间犹豫过,但是鉴于UDP实现的难度太大,还是采用了TCP来实现C/S通信。客户端(windows,linux,android),服务端(linux)网络库的设计编写都由我负责,考虑到以后可能出现的海量并发,在服务端我采用了master——worker模型,一个事件循环一个线程的多线程网络模型,这样可以充分利用服务器的多核资源,客户端和服务端的网络库都采用了libevent。服务端的设计思路及代码实现可以参考我的github:highPerformanceNetworkServer(这只是个演示demo,离企业及应用还有许多需要自己完善的)。
扩展话题
UDP
UDP也属于socket编程的范畴,把他单拿出来是因为他的使用范围相比较TCP还是有局限性的。在做可靠信息传输这种应用中,腾讯QQ的技术让我们体会到了他的可靠和高效。业界也有相应的对UDP可靠传输的包装,我仔细研究过的是UDT。在我们的产品应用中,主要是使用UDP来进行NAT穿透,我和同事一起使用过UDP和UDT进行NAT穿透,很有效,但依然有局限性:比如针对对称nat。另外使用UDP来进行相对可靠的视频传输,现在我的一个同事在专心搞这块,我想以后从他那一定可以学到不少更深的技术。多线程
如果搞网络编程不掌握多线程就好像你只有一条腿一般。比如我前面说所的master——worker模型,一个事件循环一个线程,一些涉及到IO bound、CPU bound、心跳包、客户端抢带宽都可以利用线程来进行相应的解决。Python
用python来写网络测试脚本,事半功倍。
推荐书籍
《TCP/IP详解 卷1:协议》
《UNIX网络编程》
这两本书不用多说,大家肯定都铁铁的知道经典程度。《Linux多线程服务端编程》
这本陈硕老师的书籍实战性很强,讲述的思维和问题都是和实战紧密相联的。我感觉代码部分比较复杂,用了不少我不熟悉的c++特性,还需进一步学习理解
- 我的网络编程之旅
- 我的网络编程之旅
- 我的网络编程之旅
- 我的网络开发之旅——socket编程
- 我的编程之旅
- 我的编程之旅
- 我的编程之旅
- 我的编程之旅
- 我的笔记(4)之网络编程
- 网络编程之 我对windows socket的理解
- 我的网络编程之旅——P2P相关话题
- 我的面向网络编程
- 我的大学--网络编程
- 我的网络编程路
- 我的网络编程学习之路——主机字节序和网络字节序
- 游戏之旅-我的编程感悟
- 开始我的iphone编程之旅
- 记录我的编程之旅
- 指针常量和常量指针
- 工作中接触的linux命令记录
- collect2: ld returned 1 exit status错误.
- (usaco) Friday the Thirteenth 黑色星期五
- Linux中du和df
- 我的网络编程之旅
- 正则表达式优先级
- Nginx RTMP 功能研究
- 浅析名人商标之争
- 网络编程释疑之:同步,异步,阻塞,非阻塞
- Android学习笔记:如何自定义ViewGroup和View
- Oracle NID工具修改数据库DBID和数据库名称
- 网络编程释疑之:TCP半开连接的处理
- ASP.NET 表单按钮防止二次提交