Linux网络编程之简单总结

简介: 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/feilengcui008/article/details/44067587 网络编程是一个很大也很有趣的话题,要写好一个高性能并且bug少的服务端或者客户端程序还是挺不容易的,而且往往涉及到进程线程管理/内存管理/VFS/协议栈等许多相关的知识,尤其是并发。
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/feilengcui008/article/details/44067587

网络编程是一个很大也很有趣的话题,要写好一个高性能并且bug少的服务端或者客户端程序还是挺不容易的,而且往往涉及到进程线程管理/内存管理/VFS/协议栈等许多相关的知识,尤其是并发。所以不仅仅只是会使用socket那么简单。

网络编程模型

几个相关概念:

  • 阻塞/非阻塞
    阻塞和非阻塞通常是指文件描述符本身的属性,拿socket来说,当socket读缓冲区中没有数据时或者写缓冲区满时,都会造成我们read/recv或者write/send系统调用阻塞。而非阻塞socket在这种情况下会产生EWOULDBLOCK或者EAGAIN等错误并立即返回,不会等待socket变得可读或者可写。当然这只是理解阻塞和非阻塞的一个简单例子,并不全面。在Linux下我们可以通过accept4/fcntl等函数设置socket为非阻塞。

  • 同步/异步
    同步和异步可以分两层理解。一个是编程方式上的同步和异步,另一个是同步IO和异步IO。
    同步IO和异步IO更多地是我们怎么处理读写问题的一种手段。通常这也对应着两种高性能网络编程模式reactor和proactor,同步通常是我们主动读写数据,直到显示地返回读写状态标志;而异步通常是我们交给操作系统帮我们读写,只需要注册读写完成后的回调函数,提交完读写的请求控制权就返回到进程。

  • IO复用
    IO复用通常是用select/poll/epoll等来统一代理多个socket的事件的发生,select是一种比较通用的多路复用技术,很多平台都支持,poll是Linux平台下对select做的改进,而epoll可以说是目前Linux平台下性能最高的一种multiplexing技术,当然你得用好,尤其是LT和ET两种触发方式的使用。

下面简单总结了常见的服务器端使用的网络编程模型(包含线程模型)

先看看常见组件采用的模型(只看epoll):

nginx:master进程+多个worker进程,每个进程一个epoll eventloop
memcached: 主线程+多个worker线程,每个线程一个epoll eventloop
tornado:单线程,一个epoll eventloop
libevent:对于Linux平台封装了epoll
libev:对于Linux平台封装了epoll
boost.asio:对于Linux平台封装了epoll
muduo:对于Linux平台封装了epoll
nodejs的libuv:基于libev对epoll的封装

所以排除掉传统的单线程,多进程,多线程等模型,常见的高性能网络编程模型通常是one eventloop per thread与多线程的组合,或者为了处理耗时的任务再加上threadpool。通常为了更好地性能与并发,以master/worker的形式来配置进程线程模型。其实说到底各种高性能网络库或者框架还是在玩epoll+非阻塞,基础设施OS层面已经准备好了,最终看谁优化做得好。

值得注意的问题

  • 选择线程模型
    单线程下不用考虑同步等问题,one eventloop,相对容易很多
    多线程下要考虑多线程编程可能产生的各种竞争同步问题,协调各个thread里面的eventloop。
    多进程下要考虑各个eventloop thread的通信等问题
  • socket的读写
    这也是一大难点,尤其是epoll LT和ET方式下的读写,还有怎么优雅地处理各种错误。
  • 协议的设计
  • 使用文本还是二进制?json,xml,pb等等?
  • TCP/IP协议本身的深入理解
  • 日志
  • ……

应用层之外

前面都是基于应用层对于C10K这类问题的解决方案,在更高并发要求的环境下就得在内核态下做手脚了,如零拷贝等技术,直接越过内核协议栈,实现高速数据包的传递。相应的内核模块也早有实现。主要的技术点在于数据平面与控制平面分离、减少不必要的系统调用、用户态驱动uio/vfio等减少内存拷贝、内存池减少内存分配、减少缓存失效、batch syscall、用户态协议栈…相应的技术方案大多数是围绕这些点来做优化整合。比如OSDI ‘14上的best awarded paper-Arrakis、IX,再早的有pfring、netmap、intel DPDK、mTCP等等。

相关资源

  • 书籍:
    《UNIX环境高级编程》
    《UNIX网络编程》两卷
    《TCP/IP协议》三卷
    《Linux内核设计与实现》
    《深入理解Linux内核》
    《Linux多线程服务端编程》
  • 各种开源组件:
    nginx、memcached、beanstalkd、libevent、libev、muduo、boost.asio、ace、tornado、swoole等等
目录
打赏
0
0
0
0
4
分享
相关文章
|
2月前
|
Linux系统管理:服务器时间与网络时间同步技巧。
以上就是在Linux服务器上设置时间同步的方式。然而,要正确运用这些知识,需要理解其背后的工作原理:服务器根据网络中的其他机器的时间进行校对,逐步地精确自己的系统时间,就像一只犹豫不决的啮齿动物,通过观察其他啮齿动物的行为,逐渐确定自己的行为逻辑,既简单,又有趣。最后希望这个过程既能给你带来乐趣,也能提高你作为系统管理员的专业素养。
122 20
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景,包括 ping(测试连通性)、traceroute(跟踪路由路径)、netstat(显示网络连接信息)、nmap(网络扫描)、ifconfig 和 ip(网络接口配置)。掌握这些命令有助于高效诊断和解决网络问题,保障网络稳定运行。
202 2
|
2月前
|
Linux下如何使用Curl进行网络请求
希望这篇文章能帮助您在Linux下更好地使用Curl进行网络请求。如有疑问,请随时提问!
106 10
Linux(openwrt)下iptables+tc工具实现网络流量限速控制(QoS)
通过以上步骤,您可以在Linux(OpenWrt)系统中使用iptables和tc工具实现网络流量限速控制(QoS)。这种方法灵活且功能强大,可以帮助管理员有效管理网络带宽,确保关键业务的网络性能。希望本文能够为您提供有价值的参考。
432 28
Web安全-Linux网络协议
Web安全-Linux网络协议
115 4
深入解析:Linux网络配置工具ifconfig与ip命令的全面对比
虽然 `ifconfig`作为一个经典的网络配置工具,简单易用,但其功能已经不能满足现代网络配置的需求。相比之下,`ip`命令不仅功能全面,而且提供了一致且简洁的语法,适用于各种网络配置场景。因此,在实际使用中,推荐逐步过渡到 `ip`命令,以更好地适应现代网络管理需求。
116 11
Ubuntu20.04搭建嵌入式linux网络加载内核、设备树和根文件系统
使用上述U-Boot命令配置并启动嵌入式设备。如果配置正确,设备将通过TFTP加载内核和设备树,并通过NFS挂载根文件系统。
232 15
|
5月前
|
Linux网络文件系统NFS:配置与管理指南
NFS 是 Linux 系统中常用的网络文件系统协议,通过配置和管理 NFS,可以实现跨网络的文件共享。本文详细介绍了 NFS 的安装、配置、管理和常见问题的解决方法,希望对您的工作有所帮助。通过正确配置和优化 NFS,可以显著提高文件共享的效率和安全性。
585 7
Linux虚拟机网络配置
【10月更文挑战第25天】在 Linux 虚拟机中,网络配置是实现虚拟机与外部网络通信的关键步骤。本文介绍了四种常见的网络配置方式:桥接模式、NAT 模式、仅主机模式和自定义网络模式,每种模式都详细说明了其原理和配置步骤。通过这些配置,用户可以根据实际需求选择合适的网络模式,确保虚拟机能够顺利地进行网络通信。
305 1

热门文章

最新文章