套接字 – 服务器是否已为每个客户端进程打开套接字?

我对插座感到困惑.据我所知,socket是ip地址和端口号的组合.它只是编程抽象,允许写入或从流中读取(在TCP的情况下).现在我不能完全确定服务器在服务客户端时是否有一个或多个套接字?让我们说端口80的http.

是否将来自不同客户端的所有数据发送到一个套接字(服务器:80),并且某些UBER服务器进程根据传入地址区分它们,或者是基于TCP层创建的客户端地址和端口号组合的更多套接字?有人可以通过逐步算法(对于同时服务的多个客户端)彻底描述这一点,而不仅仅是服务器绑定套接字到端口,服务器侦听套接字,服务器服务数据.

最佳答案
您将TCP连接与套接字混淆.套接字不是网络级概念.是操作系统的概念. TCP连接作为(source-ip,source-port,dest-ip,dest-port)的唯一组合存在于网络上.套接字是打开端口或打开连接的句柄(此语句略有简化).当我开始时,我也认为这是令人困惑的和OS设计错误(但它是什么,我们坚持它).设计错误是每个不同套接字的允许操作非常不同.这些用例应该是两个具有不同名称和不同API的独立概念.

如您所见,套接字和连接之间没有1:1的关系.

Can someone describe this thoroughly with step-by-step algorithm

服务器打开一个套接字,让操作系统知道它想要监听或连接.然后,每个接受的连接将产生一个新的独立套接字.每个新连接都在同一个服务器-ip和服务器端口上.只是客户端IP和/或客户端端口是不同的.服务器在每个连接套接字上进行读写.开放端口套接字仅用于接受新连接.

服务器在概念上是这样的:

var openPortSocket = Open(80); //HTTP port
while(true) {
 var connectionSocket = openPortSocket.Accept();
 ServeConnectionOnNewThread(connectionSocket);
}

这是一个逻辑模型.实际的API调用是不同的.例如,大多数服务器使用异步IO.但这与你的问题无关.

客户端必须为每个连接使用不同的客户端端口.这正是您的浏览器所做的.

转载注明原文:套接字 – 服务器是否已为每个客户端进程打开套接字? - 代码日志