分享

端口数和最大连接数的关系...

 昵称15242507 2021-10-22

初学编程的人可能会有这样的误解:单个服务器程序可承受最大连接数“理论”上是“65535”。

这种说法是错误的,请注意,这里有两个词分别被我标记上了引号,一个是“理论”,一个是“65535”。强调“理论”这个词,是想特别明确误解者的意思:就是说,这个值是不可能被打破的,是铁板钉丁的。而65535这个数字的由来,很多人想当然地将它与port最大值联系起来。的确,TCP的端口数,最大值确实为65535。但是,这并不代表一个服务器可以接受的连接数就是这个值,很多人之所以把这两个概念搞混淆是因为对socket和port没有更深的认识和理解。我们先来回想一下服务器服务的先后过程:服务器创建监听socket- >与对外服务的端口号绑定->开始listen->客户端连接到服务器对应的port->服务器accept为新的客户端产生新的socket->基于这个新的socket与客户端交换数据。从以上流程来看,最大值为65535的“端口号”这个重要的东东,我们只用了一次,就是执行bind的时候!而以后创建的socket,说白了就是一个可以进行网络IO操作的HANDLE而已,它跟端口号的牵扯仅限bind以及作为客户端连接服务器的识别端口号的时候,一旦accept产生了socket,这个端口号,对服务器和新客户端的通信而言就不再有任何意义。而服务器可承载的连接数最大量,不就是能产生多少个客户端的socket吗?这个socket值即使与端口号无关,又何来65535的“理论”上限?我再一次地将“理论”二字用引号括起,是因为在有的操作系统中,默认的配置会将socket最大值设定为65535,但这个值是可以改的!端口号仅仅是门牌地址,不能因为鸟巢体育场能容纳10万名观众就搞10万个门牌号码吧,那电话簿要多厚啊!

所以说最大连接数是受linux最大可打开文件文件数限制的,当然,因为最大可打开文件数可以通过修改系统配置文件更改,所以最终最大连接数的限制来自于系统的资源限制。

写的好,accept之后并没有占用新的端口号,因为端口号是用来识别应用层进程的,一个服务器进程就是一个端口,连再多的客户端也是那一个端口。 当然如果你同一个客户端机子开n个进程去连这个服务器,客户端开的进程肯定不能超65535,如果说端口号和连接数有关系也只能在这儿有关系了。。但是客户端开这么多连接干啥,除非是压力测试

TCP报文的端口都是2个字节,如果端口号超过了65535,TCP报文中怎么表示呢?

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多