我是Linux服务器上一个叫小金的进程。
人们总是说我最多只能创建65,535个TCP连接。
我是不信这个邪的,今天我也要亲自实践一下。
我找到操作系统的老板说:
操,我要建立TCP连接!"
他妈的不慌不忙,拿出一张表格递给我小金,你先填表
我一看这个表,就是经典的插座四倍我只有一张网卡,IP地址是123.126.45.68我想与110.242.68.3的80端口建立TCP连接我已经把这个信息填在表格里了
源端口号是什么。我记得端口号是16位,可以有0 ~ 65535范围内的数字,我就随便选一个吧!
就在我犹豫选哪个号的时候,我总是抢我的表格。
小金,你在想什么你不需要填写源端口号,我会给你分配一个可用的号码你也不需要填写源IP我知道有哪些网卡,我会帮你选一个合适的真是个新手回去等消息
哦
妈的,我带着表格走了。
过了很久,老曹终于拿着纸条回来了。
小金,你把这个收起来。"
我问:这是什么。"
操不耐烦的说,你刚说你是新手,你还不接受这个5表示文件描述符linux下一切都是一个文件以后在TCP中与目标IP通信时,只需读写这个文件描述符即可
太方便了!好的,谢谢,操。"
我把这个文件描述符放在我自己的内存中反正我就是想看看我最多能创建多少个TCP连接,并不是真的用嘻嘻
通道数
过了一分钟,我又去看老曹。
操,我要建立TCP连接!"
他妈的不慌不忙,拿出一张表格递给我小金,你先填表
这次我熟悉了只需填写目标IP和端口
做好事之后,我带回来一张纸条,上面写着数字6。
就这样,每隔一分钟,我就去找老操建立一个新的TCP连接目标IP是110.242.68.3,目标端口是80
老曹也很奇怪我不知道我在这里做什么虽然他权力很大,但他无权拒绝我的指示每次他都努力把事情做好,给我一张写有文档描述符的纸
直到有一次,我收到的纸条有些不同。
我用有些责备的语气问,操,怎么回事。"
操没好气地说道,这意味着端口号不够了!我早就觉得你小子有点不对劲您一直试图使用相同的IP和端口创建TCP连接以前,你必须遵循你的指示,但现在你不能端口号不够
我也没那么容易上当,我质疑道「我操,别欺负我是新手,但我知道端口号是16位,从1到65535,总共可以创建65535个TCP连接
他妈的轻蔑地看了我一眼你小子真是个讨厌鬼真的是一个数字让我告诉你一些事情Linux对可以使用的端口范围有特定的限制您可以使用以下命令来检查详细信息
# cat/proc/sys/net/IP v4/IP _ local _ port _ range 102465000
看吧,目前的限制是1024~65000,所以只能用63977端口号。"
我赶紧像老曹一样道歉,哦,真的很抱歉,还是我见识太少了这个数字可以修改吗
他妈的没有和我争论,而是耐心的回答我,可以,你可以修改文件vim /etc/ sysctl.conf,我们会在这个文件里增加一条记录
net . IP v4 . IP _本地_端口_范围=6000060009
"保存并执行sysctl —p /etc/ sysctl.conf使其生效这样你只有10个端口号可以用,报错端口号不够会更快
我明白了谢谢老曹,又给我上了一课
不,要建立TCP连接,您需要绑定通信两端的套接字,如下所示:
IP地址:源端口号lt,—gt,IP地址:目标端口号
只要这种绑定关系形成的四联不重复,刚才端口号就不够用了,因为我一直连接的是同一个目标ip和端口,我再试试另一个目标端口号。
我又把这张表格递给老曹,老曹一眼就看穿了我的小心思,但我也无能为力我立即为自己建立了一个新的TCP连接,并成功地向我返回了一个新的文件描述符
好像成功了。只要源端口号不够,我就可以通过不断改变目标IP和目标端口号来创建很多TCP连接,保证四重不重复!
这也证明了有人说最多只能创建65535个TCP连接是多么的荒谬。
文件描述符
我找到了突破端口号限制的方法一直找老曹建立TCP连接,老曹也没办法
直到有一次,我收到了另一个特别的纸条,不是文件描述符。
我没好气地问老操,这到底怎么回事。"
曹操幸灾乐祸的跟我说:呵呵,你以为突破端口号限制就会无法无天吗。现在文件描述符不够用了!"
为什么凡事都有限制你的操作系统给我们的限制太多了吧
废话,你看看你建立了多少TCP连接!每个TCP连接建立后,我必须给你分配一个文件描述符linux在三个方面限制了可以打开的文件描述符的数量
级别:目前可以打开的系统的最大数量,可以通过cat /proc/ sys/fs/file—max查看。
用户级别:指定用户可以打开的最大数量,可以通过cat /etc/ security/limits.conf查看
Level:单个进程可以打开的最大进程数,可以通过cat /proc/ sys/fs/nr_open查看。
天啊,真的是屋檐下的人我迅速看了一下这些具体的限制
# cat/proc/sys/fs/file—max 100000 # cat/proc/sys/fs/NR _ open 100000 # cat/etc/security/limits . conf * soft nproc 100000 * hardnproc 100000
我记得我刚收到的最后一张纸条是。
然后收到文件描述符不够的错误。
我又问老曹:老曹,这个限制可以修改吗。"
他妈的还是很耐心的跟我说,当然,比如你想把单个进程可以打开的最大文件描述符的限制修改为100,你可以这么做。"
echo100/proc/sys/fs/nr_open
我明白了,我要稍微改变一下各种文件描述符的限制,不要太多,只要在后面加一个0就行了
嗯,我就知道我不会告诉你儿子的」老混蛋又用轻蔑的眼神看着我
线
突破了文件描述符的限制,我开始毫无顾忌地创建TCP连接。
但是我发现老曹的效率越来越慢,建立一个TCP连接需要的时间越来越长。
有一次,我忍不住问老操,你懒吗以前,建立TCP连接只需不到一分钟的时间你以为我最近没等你一个多小时吗
他妈的没办法小瑾,你还好意思约我你知道每次建立TCP连接都需要消耗一个线程来为你服务吗现在,我和CPU老板忙得不可开交,我们一直在不停地为你的几十万个线程切换上下文我们的精力有限,自然不能像以前那样快速为您服务
听了老操的抱怨,我想起之前好像有人跟我说过C10K的问题,就是当服务器连接数达到10000,每个连接需要消耗一个线程资源的时候,操作系统会不断忙于线程的上下文切换,最终导致系统崩溃这不是开玩笑
我赶紧问操作系统的老板:我操,真对不起我一直以为你极其厉害,没想到你有时候忙得不可开交我们现在应该做什么
操无奈的说:我劝你别玩了毫无意义,但我想你也不会听我的让我跟你谈谈
现在您为每个TCP连接创建一个线程,这是最传统的多线程并发模型早期的操作系统只支持这种方式但是现在我进化了,还是支持IO复用简单来说,一个线程可以管理多个TCP连接的资源,这样你就可以用少量的线程管理大量的TCP连接
我一脸迷惑,什么是IO复用"
操一脸轻蔑,你...你去看看Flash的《你把这个蠢东西叫做IO复用》就知道了。"
这真是大开眼界我赶紧把代码改成了这个IO复用模型,破坏了原来的TCP连接,改成了同一个线程管理多个TCP连接很快,操作系统的老板恢复了之前的效率,同时,我的TCP连接数又增加了
内存储器
我突破了端口号,文件描述符,线程数等限制,又一次肆无忌惮地创建了TCP连接
直到有一次,我又收到了一张红牌。
嘿,什么限制来着改了就完了我不耐烦地问老曹,这次又怎么了
老操说这个错误叫做内存溢出每个TCP连接本身,以及这个连接使用的缓冲区,都需要占用一定的内存现在内存已经被你占了,不够用,所以报了这个错误
我很有耐心,没有多说什么,但是我觉得自己受记忆的限制,有点不开心,就让老曹帮我最后一次。
「操,帮小金最后一个忙你有强大的力量请杀掉那些占用特殊内存的进程,给我腾出空间
曹操看我真的够狠,就答应了我,杀了很多程我很感动
中央处理器
有了老曹给我争取来的内存资源,我又开始没日没夜的创建TCP连接。
他妈的不再说什么了,也没日没夜的执行我的指令。
有一次,老曹语重心长地对我说:时间差不多了我建议你就此打住现在CPU利用率几乎100%
我觉得老曹真的很可笑经过这些小挫折,我明白了,只要思想不衰退,办法总比苦多老曹就是太谨慎了我不能半途而废,不管他
我仍然继续创建TCP连接。
直到有一天,老曹请我去一家小饭馆,一起吃了顿饭吃完后,他说我的兄弟们合作已久,今天我来向你们告别
我百思不得其解,问:怎么了,老操发生了什么事
老曹说,因为你的TCP连接,CPU利用率长期保持在100%我们的用户,也就是我们的上帝,几乎什么都做不了,要等很久才能移动一个鼠标,所以他给了我一个重启的指令在我执行了这个指令之后,你和所有像你一样的进程,包括我的操作系统本身,都消失了
我大吃一惊,啊,这么突然这条指令什么时候执行
他妈的慢慢起身现在就去刚才,这条指令还没有机会让CPU运行,但现在它在这里
突然,我眼前一黑,一切都没了。
摘要
资源
Linux服务器的资源
TCP连接占用的资源
满了会怎么样。
中央处理器
看看你花了多少钱。
看看你在用它做什么。
电脑堵塞
内存储器
看看你花了多少钱。
取决于缓冲区的大小
伯父
临时端口号
ip _本地_端口_范围
无法分配请求的地址
文件描述符
fs.file—max
打开的文件太多
进程数 线程数
程可打开句柄数限制
看看IO模型
系统崩溃
附言
其实我觉得结论不重要最重要的是思维过程
其实思考过程挺简单的,就是找限制其实在这篇文章的开头,我一开始写了一个故事,后来觉得放在后记里比较合适故事是这样的
修卡:小雨,我问你,你一天最多能吃多少个汉堡。
于:好吧,你这个问题太私人了,不过看在教我技术的份上,我告诉你最多吃四个左右。
修卡:咳咳,真的吗好的,你一分钟能吃几个汉堡
于:如果快的话可以吃两个,但是一般情况下你最多只能吃一个。
修卡:好吧,那我问你,为什么你能不假思索地回答这两个问题。
于:哈哈,你说什么呢我自己当然明白
闪念:不是,仔细想想你回答这两个问题的逻辑。
于:哦,我明白你的意思了当你问我一天能吃多少汉堡的时候,我在想我的胃能装多少汉堡你问我一分钟能吃几个汉堡,我考虑的是我吃汉堡的速度,以这个速度一分钟能吃几个
闪电侠:没错,你总结的很好!一天最多吃多少个汉堡这个时候时间充裕,所以主要是胃的容量限制了这个汉堡的最大价值
最大汉堡数量=胃容量÷汉堡体积
还有你一分钟最多能吃几个汉堡这个时候胃的容量是非常充裕的时间因素限制了汉堡的最大价值
汉堡的最大数量=一分钟÷吃一个汉堡的时间。
这取决于第一个约束。
还有TCP连接数上限的问题,如果面试被问到,即使你完全不知道,也应该有这样的想法。
而如果你有这样的想法,或多或少也能回答出让面试官满意的答案,因为计算机往往更注重想法而不是细节。
郑重声明:此文内容为本网站转载企业宣传资讯,目的在于传播更多信息,与本站立场无关。仅供读者参考,并请自行核实相关内容。