Linux TCP实现优化的背后想法

简介:
想象一下当初为什么不让多个进程/线程在一个相同的IP地址和端口上侦听,很简单,这是因为TCP/IP模型将一个端口作为一个四层复用解复用的唯一标 识,也就是一个四层地址,正如IP地址属于一个主机一样(属于一块网卡?),一个IP/端口对属于一台主机上一个特定的进程,它只是一个保证唯一性的静态 标识。世界上不同的主机不能有相同的IP地址,一台主机上绑定特定IP地址的不同进程也不能有相同的端口,否则就不知道一个流到底该交给哪个进程!
想 象一下现在为什么reuseport可以让以前不可能的事变成可能。很简单,在静态因素之外加入了一个动态因素,那就是将发起连接的源IP和源端口也一起 考虑了进来,四元组一起做了一个简单的hash计算,所得的结果对Listener数量取模,获取哪个Listener要为这个连接服务。
事实 上,我们发现,需要唯一标识的不是一个Listener,而应该是一个连接本身。TCP服务端在有客户端企图建立一个连接时才有意义。那么是什么让一个绑 定同一IP/端口的套接字只能Listen一次这么一个限制存在了这么久呢?我认为答案有两个方面,一方面是因为UNIX的进程模型,另一方面是这个限制 在单核CPU时代工作的足够好,又可以避免很多问题。

       好吧,现在我将Listener和进程完全分割开,我既不赞同绑定同一IP地址/端口的套接字只能Listen一次,又不赞同采用reuseport方 案,我暂且忽略了哪个进程/线程在侦听,假设根本没有任何进程/线程侦听的概念,我只求一个连接请求到来的时候,可以成功完成三次握手,创建一个客户 socket,而这个很简单,新创建的客户socket被放入一个池中,Listen的任务就完成了,在握手完成之前,与任何进程/线程都无关联,接下来 把进程/线程考虑进来,它们来accept,也就是从一个池中获取一个客户socket来处理。事实上,我是分离了Listen和Accept,内核协议 栈只负责Listen,而进程/线程只负责Accept,问题就解决了。

杂乱不清的东西纠缠在一起的时候,会引入很多复杂性,避免这些复杂性的方式就是把纠缠在一起的东西剥离,海阔天空。同事为我这个优化取了一个很好的名字,叫做Xsocket,这里的X可以理解成两个意思,一个是“牛X”中的X,一个是“插”!!

今天感到特别累,但是却又无比的高兴,昨晚做了一个梦,感觉今天会有惊喜,然而等了一天还是未能如愿,我不再相信缘份了,可是最终我还是改变了想法,缘份未尽,上帝让我的惊喜来自于别处,虽然它并不是我梦里的那个。阿们...



 本文转自 dog250 51CTO博客,原文链接:http://blog.51cto.com/dog250/1698025

相关文章
|
2月前
|
存储 Linux
Linux基础项目开发1:量产工具——改进优化(八)
Linux基础项目开发1:量产工具——改进优化(八)
34 0
Linux基础项目开发1:量产工具——改进优化(八)
|
3月前
|
网络协议 Linux
拿来即用的Linux上TCP服务端程序
拿来即用的Linux上TCP服务端程序
|
3月前
|
网络协议 Linux C++
Linux C/C++ 开发(学习笔记十二 ):TCP服务器(并发网络编程io多路复用epoll)
Linux C/C++ 开发(学习笔记十二 ):TCP服务器(并发网络编程io多路复用epoll)
56 0
|
4天前
|
网络协议 Ubuntu Unix
Linux 下使用 socket 实现 TCP 客户端
Linux 下使用 socket 实现 TCP 客户端
|
14天前
|
负载均衡 算法 Linux
深度解析:Linux内核调度器的演变与优化策略
【4月更文挑战第5天】 在本文中,我们将深入探讨Linux操作系统的核心组成部分——内核调度器。文章将首先回顾Linux内核调度器的发展历程,从早期的简单轮转调度(Round Robin)到现代的完全公平调度器(Completely Fair Scheduler, CFS)。接着,分析当前CFS面临的挑战以及社区提出的各种优化方案,最后提出未来可能的发展趋势和研究方向。通过本文,读者将对Linux调度器的原理、实现及其优化有一个全面的认识。
|
1月前
|
NoSQL Java Linux
【Linux IO多路复用 】 Linux 网络编程 认知负荷与Epoll:高性能I-O多路复用的实现与优化
【Linux IO多路复用 】 Linux 网络编程 认知负荷与Epoll:高性能I-O多路复用的实现与优化
60 0
|
2月前
|
网络协议 关系型数据库 MySQL
Linux下的网络编程——C/S模型TCP(二)
Linux下的网络编程——C/S模型TCP(二)
33 0
Linux下的网络编程——C/S模型TCP(二)
|
2月前
|
Kubernetes Linux 开发工具
容器开发运维人员的 Linux 操作机配置优化建议
容器开发运维人员的 Linux 操作机配置优化建议
|
2月前
|
缓存 Linux 数据库
Linux内存管理优化
Linux内存管理优化
40 0
|
3月前
|
网络协议 Linux
【Linux C TCP服务器端-epoll案例】
本文主要介绍了linux下Select的TCP通信流程,实现了客户端和服务器的通信,主要实现了消息的回发,即服务器将消息原封不动的回发给客户端。
25 0