数据库有两个专业词汇:主键、组合键。同学们肯定想知道这两者是什么含义与区别,不急,接下来一一解释。
主键
一个数据库用来存储一个个表项,当我们查询到数据库某一条表项时,我们希望用一个关键字就可以过滤出想要查询的表项,这个唯一标识(Uniquely Identify)的关键字就是主键。
组合键
顾名思义,就是用几个关键字组合在一起,尽管每一个关键字在数据库条目里不唯一,但组合在一起却可以唯一定位一个条目。
计算机通信,有一个问题必须解决,就是如何唯一识别一个会话,英文名称是session,TCP/IP协议里没有一个字段可以完全胜任这个工作,意味着,无法遴选出一个主键,我们可以退而求其次,遴选出组合键来完成这个使命。
既然通信是双方的事,最终遴选出五元组的这个组合键:
服务器IP + 服务器端口 + TCP + 客户端IP + 客户端端口
只要保证这个五元组是唯一的,就可以唯一识别一个session,不是吗?
对于一个特定的服务器,一般IP、端口号都是固定的,比如提供网页服务的默认端口是80不会变。
如果相同的客户端来连接这个服务器,客户端的IP是相同的,多个TCP连接都使用相同的端口号,那么这个组合键是不是都是一样的?这是绝对不行的!因为无法唯一识别一个session!
客户端的操作系统TCP/IP必须做出硬性的限制,每次连接,如果本地端口已经被别的session占用,要从空闲的端口号池子里选取一个端口号,以此方式,无论是在客户端的眼里,还是服务器的眼里,最终的五元组肯定是唯一的。
端口号在TCP协议字段里,一共两个字节,二进制的16位,意味着有2^16= 65536个端口号可用,但0-1023系统通常保留为知名服务端口,所以最多有64512个端口做为端口池资源。
一个问题
如果相同的客户端使用相同的端口号来连接同一个服务器(IP相同)的不同端口、或不同服务器(IP不同)相同端口,那可不可以呢?
理论上,按照五元组的精神,根据五元组的哈希值,只要有任何一项是不同的,session ID 就是不同的,所以是完全可行的,但为何操作系统也要限制?
是为了简化实现,试想客户端每个TCP连接硬性规定,使用不同的端口号,服务器一点也不需要担心session ID 的唯一性。此外,64512个端口难道还不够一个客户端使用?
服务器
服务器在监听端口(比如80)可以接受来自五湖四海的客户端TCP连接,至于这个连接数的上限是多少,则完全取决于服务器的CPU、Memory 资源限制。
转载:https://www.zhihu.com/question/66553828/answer/244123563