了解WebSockets

时间:2017-05-06 07:22:11

标签: sockets networking tcp websocket

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

操作系统使进程能够与端口相关联(IIUC是使进程在入站数据网络上可寻址的一种方式)。

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

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

[1] "提供唯一的姓名    每个TCP,我们连接一个NETWORK标识符和一个TCP标识符    使用端口名称创建一个唯一的SOCKET名称    在所有连接在一起的网络中。" https://tools.ietf.org/html/rfc675

2 个答案:

答案 0 :(得分:14)

当客户端连接到给定端口上的服务器时,客户端连接来自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套接字关联,以便它可以在正确的套接字上触发事件。

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

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

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

仅供参考,您可能听说过NAT(网络地址转换)。这通常用于允许专用网络(如家庭或公司网络)与公共网络(如互联网)连接。使用NAT,服务器可能会看到多个客户端具有相同的客户端IP地址,即使它们是专用网络上的物理上不同的计算机)。使用NAT,多台计算机通过公共IP地址路由,但NAT仍然保证客户端IP地址和客户端端口号仍然是唯一的组合,因此上述方案仍然有效。使用NAT时,发往特定客户端的传入数据包到达共享IP地址。然后将IP /端口转换为专用网络上的实际客户端IP地址和端口号,然后将数据包转发到该设备。服务器通常不知道这种转换和数据包转发。由于NAT服务器仍然保持客户端IP /客户端端口组合的唯一性,因此即使看起来许多客户端共享公共IP地址,服务器的逻辑仍然可以正常工作。注意,家庭网络路由通常配置为使用NAT,因为家庭网络上的所有计算机都将共享"路由器访问互联网时的一个公共IP地址。

答案 1 :(得分:0)

您不会启用多个套接字,也不需要它。你将有多个连接。它有点不同,但你表现得不好。对于UDP,没有任何事可做,因为没有连接。

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