Sockets 对WebSocket的理解

Sockets 对WebSocket的理解,sockets,networking,tcp,websocket,Sockets,Networking,Tcp,Websocket,我的理解是套接字对应于网络标识符、端口和TCP标识符。[1] 操作系统允许进程与端口相关联(IIUC是一种使进程在网络上可寻址以接收入站数据的方法) 因此,WebSocket服务器通常会与一个众所周知的端口相关联,该端口用于接受和理解升级请求的HTTP(如443),然后使用TCP标识符为单个服务器进程和单个端口同时打开多个网络套接字 请有人确认或纠正我的理解 [1] “在以下位置提供唯一名称: 每个TCP连接一个网络标识符和一个TCP标识符 使用端口名创建唯一的套接字名称 在所有连接在一起的网络

我的理解是套接字对应于网络标识符、端口和TCP标识符。[1]

操作系统允许进程与端口相关联(IIUC是一种使进程在网络上可寻址以接收入站数据的方法)

因此,WebSocket服务器通常会与一个众所周知的端口相关联,该端口用于接受和理解升级请求的HTTP(如443),然后使用TCP标识符为单个服务器进程和单个端口同时打开多个网络套接字

请有人确认或纠正我的理解

[1] “在以下位置提供唯一名称: 每个TCP连接一个网络标识符和一个TCP标识符 使用端口名创建唯一的套接字名称
在所有连接在一起的网络中。”

您将不启用多个套接字,不需要它。您将有多个连接。这有点不同,但你站得很好。对于UDP,没有什么可做的,因为没有连接


在TCP中,如果两台不同的机器连接到第三台机器上的同一端口,则会有两个不同的连接,因为源IP不同。如果同一台机器(或NAT后面的两台机器或共享相同IP地址的两台机器)两次连接到单个远程端,则连接会根据源端口进行区分,同一台机器无法在同一端口上打开2个连接

当客户端通过给定端口连接到服务器时,客户端连接来自IP地址和客户端端口号。客户端端口号由客户端自动生成,并且对于该客户端是唯一的。因此,您最终得到了四个连接项

Server IP address  (well known to all clients)
Server port        (well known to all clients)
Client IP address  (unique for that client)
Client port        (dynamically unique for that client and that socket)
因此,正是这四项的组合构成了一个独特的TCP连接。如果同一客户机与同一服务器和端口进行第二次连接,则该第二次连接将具有不同的客户机端口号(客户机进行的每个连接将被赋予不同的客户机端口号),因此,对于该第二次客户机连接,上述四项的组合将不同,允许它的流量与客户端建立的第一个连接完全分离

所以,TCP套接字是上述四项的独特组合。为了了解它是如何使用的,让我们看看一些流量是如何流动的

在客户端连接到服务器并创建TCP套接字来表示该连接之后,客户端发送一个数据包。数据包从客户机IP地址和特定套接字使用的唯一客户机端口号发送。当服务器在其自己的端口号上接收到该数据包时,它可以看到该数据包来自客户端IP地址和该特定客户端端口号。它可以使用这些项在其表中查找并查看此流量与哪个TCP套接字关联,并触发该特定套接字的事件。这将该客户端的通信量与当前连接的所有其他套接字(无论它们是来自同一客户端的其他连接还是来自其他客户端的连接)分离

现在,服务器希望向该客户机发送响应。数据包被发送到客户端的IP地址和客户端端口号。客户端TCP堆栈也做同样的事情。它从服务器IP/端口接收数据包并发送到特定的客户机端口号,然后可以将该数据包与客户机上适当的TCP套接字相关联,以便在正确的套接字上触发事件

所有流量都可以通过这种方式与相应的客户端或服务器TCP套接字唯一关联,即使许多客户端可能连接到相同的服务器IP和端口。客户端IP/端口的唯一性允许两端判断给定数据包属于哪个套接字


webSocket连接从HTTP连接开始(这是一个运行HTTP协议的TCP套接字)。该初始HTTP请求包含一个“升级”头,请求服务器将协议从HTTP升级到webSocket。如果服务器同意升级,则返回一个响应,指示协议将更改为webSocket协议。TCP套接字保持不变,但双方都同意现在使用webSocket协议而不是HTTP协议。因此,一旦连接,就有了一个TCP套接字,双方都在使用webSocket协议。此TCP连接使用上述相同的逻辑来保持与同一服务器的其他TCP连接的唯一性

通过这种方式,您可以在一个端口上拥有一台服务器,该端口可用于HTTP连接和webSocket连接。到该服务器的所有连接开始时都是HTTP连接,但在双方同意更改协议后,有些连接会转换为webSocket连接。保留HTTP连接的HTTP连接将是典型的请求/响应,然后套接字将关闭。“升级”到webSocket协议的HTTP连接将在webSocket会话期间保持打开状态(这可能是长期的)。您可以有许多并发的开放webSocket连接,这些连接彼此不同,而新的HTTP连接则由同一台服务器定期提供服务。上面的TCP逻辑用于跟踪到/来自同一服务器/端口的哪些数据包属于哪个连接

Server IP address  (well known to all clients)
Server port        (well known to all clients)
Client IP address  (unique for that client)
Client port        (dynamically unique for that client and that socket)

仅供参考,您可能听说过NAT(网络地址转换)。这通常用于允许专用网络(如家庭或公司网络)连接到公共网络(如internet)。使用NAT,服务器可能会将多个客户端视为具有相同的客户端IP地址,即使它们是专用网络上物理上不同的计算机)。使用NAT,多台计算机通过一个公共IP地址进行路由,但NAT仍然保证客户端IP地址和客户端端口号仍然是唯一的c