谈谈网络编程(基于C++)

这里讲了一点网络编程的一些新路,一点体悟。学习就是这种不断总结提升的过程。react

设计到进程,线程,线程池,reactior和proactor并发编程模式,IOCP,linux下的epoll。。。。。linux

讲到这里就要提一下 socket 技术了,要想理解socket天然要学习 TCP/IP 协议,对于 TCP/IP 的理论,学习 Richard 的《TCP/IP 详解卷1:协议》我认为是不二的选择,这本书涵盖内容不少,若是对于只是实现C/S通讯的网络库而言,仅须要了解其中介绍 UDP 和 TCP 的章节就好,扎实的理论基础会为你之后遇到网络传输中出现的问题给予很好的解释,也便于你解决这些问题。理论联系实现,仍是 Richard 的《UNIX 网络编程卷1:套接口 API》(俗称 UNP1),这本书我一直在看,可是还没看完,我认为这是网络编程的圣经,你掌握了这本书,基本也就掌握了网络编程,甚至细枝末节也能覆盖到。这边也推荐几个视频给你们看看。。。。c++

TCP/IP协议栈深度解析丨实现单机百万链接丨优化三次握手、四次挥手丨优化TCP的传输速率丨epoll原理剖析和面试必问的问题_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com图标c/c++Linux实战训练精讲丨徒手实现网络协议栈丨TCP/IP协议栈丨面试必备系列_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com图标面试

如下只涉及 TCP 协议编程

  紧接着学习转为实践,想一想网络通讯的场景:一个 server 要对应成百上千..个客户,这样必需要考虑到 server 的处理能力。windows

  最简单的模型就是你用一个进程来处理全部的客户端链接,my god!你想一想,在处理过程当中若是有上百个链接同时请求服务,咱们采用这种模式,首先下一个链接要等着上一个链接处理完(同步),这个在处理的链接还颇有可能阻塞在数据操做(I/O)上,这样处理链接的效率之差及客户端的响应之慢我想几乎没有人能忍受吧。网络

  好,为了提升效率,咱们改进一下,对每个客户链接产生一个线程(windows)或进程(linux)来处理,抛开线程或进程的上下文切换损耗不谈,也不谈 SMP,就单单看产生成千上百个线程和进程的可行性,对不起,咱操做系统但是有线程或进程资源上限的。并发

  为了解决线程频繁切换形成的资源损耗和资源数限制问题,咱们再改进一下,采用一个线程池来处理部分链接,其余链接排队等候,毕竟咱 cpu 很少,同时也就能处理那么几个链接,响应效率和处理效率依然提不上去。异步

  想一个问题,其实咱们的网络耗时通常都是在数据操做上(I/O),为了增长客户端的响应,咱们能够把一次网络接入分为处理链接的线程和进行逻辑处理的线程,这样就能够极大地提升客户端的响应,可是记住必定要在逻辑处理线程中维护住这个链接的会话。这样仿佛还不错,no,no,其实也很差,你并不知道何时有数据到来须要处理,你必需要轮询来肯定可不能够进行数据操做….,效率仍是很差啊。socket

  好了,咱不本身首创技术了,选用经典的 Reactor 和 Proactor 并发编程模式,他们都是基于事件驱动的,咱呢就是把网络中须要处理的事件注册到事件管理器中去(好比网络行为事件,IO 操做事件…..),而后等事件状态就绪了,他就用回调的方式通知咱去处理,怎么样,这样至少 CPU 不会闲着了,只用一个线程就能够处理几乎全部的事件了。可是 Reactor 和 Proactor 仍是有很大区别的,Reactor 对于I/O这一步是须要本身处理的,可是 Proactor 对于I/O这一步是由操做系统完成的,而后把完成事件通知你,而后你就能够进行下一步操做了(好比从缓冲区 buf 里读数据),比本身操做I/O这种方式快多了吧。目前,我在 windows 下写网络库采用的是 Proactor 模式:用 windows 本身提供的完成端口模型(IOCP)实现,在 linux 下,因为 linux 没有很好的异步I/O机制,只好采用 Reactor 方式了:使用的是 linux 特有的 epoll。

  谈一些我本身的见解:从个人理解上,对于大部分网络库而言,不少都是I/O密集型的,这样仿佛采用 Proactor 模式更有优点,可是 linux 下没有和 windows 下 IOCP 相似的机制,可是能够采用 epoll 加任务队列的方式实现一套,可是仿佛很复杂,我想本身实现就算了吧。好在“山穷水复疑无路,柳暗花明又一村”,boost asio 已经为咱们封转好了 windows 和 linux 下的 Proactor 实现,windows 采用的是完成端口,linux 下采用的是 epoll 加任务队列的方式实现。下一步我准备把目前 linux 下采用 epoll 方式实现的 Reactor 网络库改成 boost asio 的实现。

今天,对于网络编程先整体而且归纳的介绍下吧,其实还有不少问题没有涉及,我本人对网络编程十分的感兴趣,如今也在从事这方面的工做,因此之后有机会但愿和你们一块儿分享一些更细致全面的知识,鉴于本人水平有限,但愿你们能对文章中出现的错误给予批评指正,咱们一块儿进步……
image.png须要以上资料能够加qun:832218493免费领取!

相关文章
相关标签/搜索