想 象一下现在为什么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