4 个回答

抛砖引玉

  • 一台服务器上已经安装了Nginx并启动监听80端口,但此时你又下载一个Apache想启动也去监听80端口,这时服务器就不让了,会提示端口被占用,这就是一个端口对应一个应用程序
  • 当你访问一个网址时,默认会访问80端口,假设服务器使用Nginx,当Nginx监听到有客户请求自己监听的80端口时,会根据请求做出相应的相应,至于为什么可以同时链接多个用户,那得看服务器的本身配置了,可以同时允许多少个用户同时访问,若是仅允许一个,那么第一个进来了,接下来的就顺次排队,服务器处理一个之后会接下往下处理

不明白你的点在哪里,你的疑问和前段所描述的原理并不冲突。
服务端都是多进程或者多线程又或者使用了代理等等,一个链接进来,会交由一个子进程/线程/一台web服务器进行处理,并不影响接下来的请求。

猜测题主可能是混淆了socket和port这两个概念。

打个(可能不太恰当的)比方,port就是门牌号,你一家住进去了,如果不搬出来,下一家不能进。socket就是快递编号,可以同时给你们家寄好几件快递。port只不过是在网络中标识了一个进程,socket才是数据交换的端点。

节选一下 man accept,翻译成中文是这样的

It extracts the first connection request on the queue of pending connections for the listening socket, sockfd, creates a new connected socket, and returns a new file descriptor referring to that socket. The newly created socket is not in the listening state. The original socket sockfd is unaffected by this call.

它(accept)从监听套接字sockfd的队列中取出第一个请求,创建一个新的连接socket,然后返回一个指向新socket的文件描述符。这个新socket并不在监听状态。原本的socketsockfd不会被这个调用改变。

所以跟“切换的够快”、“子进程/线程”、“Nginx的配置”都无关,它们只是后续用来处理这些新socket的方法,是一个一个处理,还是一起处理,相当于你快递可以一件一件收,也可以请快递员用推车一起送上来。但是能支持多连接,本质上还是因为每个客户端连接都有一个新的socket,互不相干,可以分别处理。

系统区分socket,靠的则是五元组。因为两个IP都是不能变的,只能靠端口号来区分应用程序,所以要求一个端口只能由一个程序使用。

计算机原理,linux多用户其实还是单用户,但是切换的够快就感觉是在并发使用了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题