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,一个是“插”!!

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-04 01:24:26

Linux TCP实现优化的背后想法的相关文章

Linux TCP拥塞控制中undo操作

Linux的TCP实现复杂且繁琐,建议不要直接去看代码,而是花点时间把TCP规范先撸一遍.本文主要描述一下TCP实现中undo操作,然后顺便再吐一下槽(千万不要觉得吐槽有什么不好,很多好东西都是从吐槽开始的,从造纸,蒸汽机,到法兰西第一共和国,再到Linux...). 1.TCP对网络拥塞是基于预测的 TCP属于网络的一部分,这无可厚非,但当一个人说自己精通网络的时候,他更可能的意思是自己精通网络节点的行为而不是端到端的行为.比如,一个Cisco的工程师精通各种路由协议,可以设计出复杂的OSPF

彻底实现Linux TCP的Pacing发送逻辑-高精度hrtimer版

代码的实现是简单的,背后的思绪是复杂的.        如果单纯的将<彻底实现Linux TCP的Pacing发送逻辑-普通timer版>中的timer_list换成hrtimer,必然招致失败.因为在hrtimer的function中,调用诸如tcp_write_xmit这样的长路径函数是一种用丝袜装榴莲的行为.好吧,在无奈中我只能参考TSQ的做法.旧恨心魔!在Linux的TCP实现中,TSQ保证了一个单独的流不会过多地占据发送缓存,从而保证的多个数据流的相对公平.这个机制是用tasklet

Linux网络性能优化方法简析

Linux网络性能优化方法简析 2010-12-20 10:56 赵军 IBMDW 字号:T | T 性能问题永远是永恒的主题之一,而Linux在网络性能方面的优势则显而易见,这篇文章是对于Linux内核中提升网络性能的一些优化方法的简析,以让我们去后台看看魔术师表演用的盒子,同时也看看内核极客们是怎样灵活的,渐进的去解决这些实际的问题. AD:2014WOT全球软件技术峰会北京站 课程视频发布 对于网络的行为,可以简单划分为 3 条路径:1) 发送路径,2) 转发路径,3) 接收路径,而网络性

Linux之nginx优化与防盗链

Linux之nginx优化与防盗链 Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,Nginx,它的发音为"engine X",是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器.Nginx是由俄罗斯人 Igor Sysoev为俄罗斯访问量第二的 Rambler.ru站点开发. Nginx以事件驱动(epoll)的方式编写,所以有非常好的性能,同时也是一个非常高效的反向代理.负载平衡.但是Nginx并不支持cgi方式运行,原因是可以减少因

linux 内核参数优化

linux 内核参数优化 Sysctl命令及linux内核参数调整 一.Sysctl命令用来配置与显示在/proc/sys目录中的内核参数.如果想使参数长期保存,可以通过编辑/etc/sysctl.conf文件来实现. 命令格式: sysctl [-n] [-e] -w variable=value sysctl [-n] [-e] -p (default /etc/sysctl.conf) sysctl [-n] [-e] –a 常用参数的意义: -w  临时改变某个指定参数的值,如 # sy

linux tcp 高并发最大连接数

Linux下高并发socket最大连接数所受的限制问题 1.修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄).可使用ulimit命令查看系统允许当前用户进程打开的文件数限制: [[email protected] ~]$ ulimit -n 1024 这表示当前用户的

关于Linux TCP接收缓存以及接收窗口的一个细节解析

关于TCP的接收缓存以及通告窗口,一般而言懂TCP的都能说出个大概,但是涉及到细节的话可能理解就不那么深入了.由于我最近的工作与TCP有关,顺便又想起了很久之前遇到的一个问题:明明在接收端有8192字节的接收缓存,为什么收了不到8000字节的数据就ZeroWindow了呢?当时我的解决方案是直接扩大接收缓存完事,然后就没有然后了.后来深挖了一下细节,发现了很多曾经不知道的东西,如今对TCP的理解想必又深入了一些,趁着国庆假期顺便就把很多想法整理成一篇文章了. 0.network buffer &

Linux内核socket优化项

Linux内核socket优化项 vi /etc/sysctl.confnet.core.netdev_max_backlog = 30000  每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目 net.core.somaxconn = 262144   用来限制监听(LISTEN)队列最大数据包的数量,超过这个数量就会导致链接超时或者触发重传机制 net.core.rmem_default = 8388608    接收套接字缓冲区大小的默认值(以字节为单

linux的性能优化

转一位大神的笔记. linux的性能优化: 1.CPU,MEM 2.DISK--RAID 3.网络相关的外设,网卡 linux系统性能分析: top:linux系统的负载,CPU,MEM,SWAP,占用CPU和内存比较的进程,杀死占用性能高的进程. [[email protected] ~]# top top - 22:45:24 up 22:53, 5 users, load average: 0.00, 0.00, 0.00 当前的时间,开机时间为22小时53分钟,5个用户在线,linux系