一台机器最多能创建多少个 TCP 连接?

作者:微信小助手

发布时间:2022-01-26T11:55:57

我是一个 Linux 服务器上的进程,名叫小进。


老是有人说我最多只能创建 65535 个 TCP 连接。

我不信这个邪,今天我要亲自去实践一下。

我走到操作系统老大的跟前,说: “老操,我要建立一个 TCP 连接!

老操不慌不忙,拿出一个表格递给我," 小进,先填表吧 "


我一看这个表,这不就是经典的 socket 四元组 嘛。我只有一块网卡,其 IP 地址是 123.126.45.68,我想要与 110.242.68.3 的 80 端口建立一个 TCP 连接,我将这些信息填写在了表中。


源端口号填什么呢?我记得端口号是 16 位的,可以有 0 ~ 65535 这个范围的数字,那我随便选一个吧!

正当我犹豫到底选什么数字的时候,老操一把抢过我的表格。

你墨迹个啥呢小进?源端口号不用你填,我会给你分配一个可用的数字。源IP也不用你填,我知道都有哪些网卡,并且会帮你选个合适的。真是个新手,回去等消息吧。

"哦"

老操带着我的表格,走了。

过了很长时间,老操终于回来了,并且带着一个纸条。


小进,你把这个收好了。

我问道,“这是啥呀?”

老操不耐烦地说道,“ 刚刚说你是新手你还不服,这个 5 表示文件描述符,linux 下一切皆文件,你待会和你那个目标 IP 进行 TCP 通信的时候,就对着这个文件描述符读写就好啦。

“这么方便!好的,谢谢老操。”

我拿着这个文件描述符,把它放到属于我的内存中裱起来了,反正我只是想看看最多能创建多少 TCP 连接,又不是去真的用它,嘻嘻。
 

端口号

 
过了一分钟,我又去找老操了。

“老操,我要建立一个 TCP 连接!”

老操不慌不忙,拿出一个表格递给我,“小进,先填表吧”


这回我熟悉了,只把目标IP和目标端口填好。


老操办好事之后,又带着一个纸条回来,上面写着数字“6”。

就这样,我每隔一分钟都去找老操建立一个新的 TCP 连接,目标 IP 都是110.242.68.3,目标端口都是 80。

老操也很奇怪,不知道我在这折腾啥,他虽然权力大,但无权拒绝我的指令,每次都兢兢业业地把事情办好,并给我一张一张写着文件描述符的纸条。

直到有一次,我收到的纸条有些不同。


我带着些许责怪的语气问,“老操,这是怎么回事呀?”

老操也没好气地说,“ 这表示端口号不够用啦!早就觉得你小子不对劲了,一个劲地对着同一个 IP 和端口创建 TCP 连接,之前没办法必须执行你给的指令,现在不行了,端口号不够用了,源端口那里我没法给你填了。

我也不是那么好骗的,质疑道。“老操,你也别欺负我这个新手,我可是知道端口号是 16 位的,范围是 1~65535,一共可以创建 65535 个 TCP 连接,我现在才创建了 63977 个,怎么就不够了!”

老操鄙视地看了我一眼,“ 你小子可真是闲的蛋疼啊,还真一个个数,来我告诉你吧,Linux 对可使用的端口范围是有具体限制的,具体可以用如下命令查看。

[root]# cat /proc/sys/net/ipv4/ip_local_port_range 1024 65000

看到没,当前的限制是1024~65000,所以你就只能有63977个端口号可以使用。


我赶紧像老操道歉,"哎哟真是抱歉,还是我见识太少,那这个数可以修改么?"

老操也没跟我一般见识,还是耐心地回答我,“ 可以的,具体可以 vim /etc/sysctl.conf 这个文件进行修改,我们在这个文件里添加一行记录 ”。

net.ipv4.ip_local_port_range = 60000 60009

保存好后执行 sysctl -p /etc/sysctl.conf 使其生效。这样你就只有 10 个端口号可以用了,就会更快报出端口号不够用的错误 ”。

"原来如此,谢谢老操又给我上了一课。"

哎不对,建立一个 TCP 连接,需要将通信两端的套接字(socket)进行绑定,如下:

源 IP 地址:源