sockets - 了解WebSockets

标签 sockets networking tcp websocket

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

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

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

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

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

最佳答案

当客户端通过给定端口连接到服务器时,客户端连接来自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协议(protocol)的TCP套接字)开始。该初始HTTP请求包含一个“升级” header ,请求服务器将协议(protocol)从HTTP升级到webSocket。如果服务器同意升级,则它将返回响应,指示该协议(protocol)将更改为webSocket协议(protocol)。 TCP套接字保持不变,但是双方都同意,他们现在将使用webSocket协议(protocol)而不是HTTP协议(protocol)。因此,一旦连接,您便有了一个TCP套接字,双方都在说webSocket协议(protocol)。此TCP连接使用上述相同的逻辑,以保持与其他TCP连接到同一服务器的唯一性。

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

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

关于sockets - 了解WebSockets,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43817850/

相关文章:

xml - 尝试对服务器进行身份验证时通过对等方重置连接

wcf - WCF 服务如何监听与 IIS 相同的端口?

java - 通过socket继续中断的下载

java - Java如何从字节数组形成TCP数据包?

Delphi - 桥接两个 TCP 端口

linux - 使用 bash 脚本配置 eth0 ip 地址、子网掩码、网关

ios - iOS 中的多路径 TCP

c++ - 使用 C 进行套接字编程时无法接收或发送整个数据包

java - 如何从flex向java套接字服务器发送AMF格式的数据?

c - 我是 C 网络的新手,我需要将字符串(字符数组)从命令行参数发送到服务器