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

相关文章
|
4天前
|
网络协议 Linux 网络性能优化
Linux C/C++之TCP / UDP通信
这篇文章详细介绍了Linux下C/C++语言实现TCP和UDP通信的方法,包括网络基础、通信模型、编程示例以及TCP和UDP的优缺点比较。
12 0
Linux C/C++之TCP / UDP通信
|
13天前
|
网络协议 Linux 网络性能优化
Linux基础-socket详解、TCP/UDP
综上所述,Linux下的Socket编程是网络通信的重要组成部分,通过灵活运用TCP和UDP协议,开发者能够构建出满足不同需求的网络应用程序。掌握这些基础知识,是进行更复杂网络编程任务的基石。
42 1
|
2月前
|
缓存 监控 Linux
在Linux中,如何优化 Linux 系统?
在Linux中,如何优化 Linux 系统?
|
2月前
|
移动开发 监控 网络协议
在Linux中,如何查看 http 的并发请求数与其 TCP 连接状态?
在Linux中,如何查看 http 的并发请求数与其 TCP 连接状态?
|
2月前
|
监控 网络协议 Linux
在Linux中,如何实时抓取并显示当前系统中tcp 80 端口的网络数据信息?
在Linux中,如何实时抓取并显示当前系统中tcp 80 端口的网络数据信息?
|
2月前
|
存储 监控 网络协议
在Linux中,如何使用 tcpdump 监听主机为 192.168.1.1,tcp 端⼝为 80 的数据,并将将输出结果保存输出到tcpdump.log?
在Linux中,如何使用 tcpdump 监听主机为 192.168.1.1,tcp 端⼝为 80 的数据,并将将输出结果保存输出到tcpdump.log?
|
1月前
|
存储 监控 安全
探究Linux操作系统的进程管理机制及其优化策略
本文旨在深入探讨Linux操作系统中的进程管理机制,包括进程调度、内存管理以及I/O管理等核心内容。通过对这些关键组件的分析,我们将揭示它们如何共同工作以提供稳定、高效的计算环境,并讨论可能的优化策略。
32 0
|
2月前
|
网络协议 安全 Linux
在Linux中,tcp三次握⼿的过程及原理?
在Linux中,tcp三次握⼿的过程及原理?
|
2月前
|
域名解析 网络协议 Linux
在Linux中,我们都知道,dns采用了tcp协议,又采用了udp协议,什么时候采用tcp协议?什么 时候采用udp协议?为什么要这么设计?
在Linux中,我们都知道,dns采用了tcp协议,又采用了udp协议,什么时候采用tcp协议?什么 时候采用udp协议?为什么要这么设计?
|
2月前
|
网络协议 Linux
在Linux中,如何查看 http 的并发请求数与其 TCP 连接状态?
在Linux中,如何查看 http 的并发请求数与其 TCP 连接状态?