Sockets 如何编写自己的TCP/IP或ISO/OSI堆栈来使用WebSocket,而不必每次都使用握手?

Sockets 如何编写自己的TCP/IP或ISO/OSI堆栈来使用WebSocket,而不必每次都使用握手?,sockets,networking,tcp,websocket,dpdk,Sockets,Networking,Tcp,Websocket,Dpdk,我的目的是使用具有自己的TCP/IP或ISO/OSI堆栈的WebSocket。我想对从客户端到应用服务器的所有请求进行负载平衡(正如我们所知,WebSocket只能与一台建立了连接的服务器一起工作)。我希望能够连接到一个节点并向任何节点发送请求 算法是下一个: 1.客户端与负载平衡器后面的一个节点建立连接。 2.客户端通过WebSocket将数据发送到负载平衡器。 3.负载平衡器接收数据并将其发送到任何服务器。 4.服务器看到数据并将其发送到应用程序。即使连接尚未建立,服务器也不会丢弃数据包,它

我的目的是使用具有自己的TCP/IP或ISO/OSI堆栈的WebSocket。我想对从客户端到应用服务器的所有请求进行负载平衡(正如我们所知,WebSocket只能与一台建立了连接的服务器一起工作)。我希望能够连接到一个节点并向任何节点发送请求

算法是下一个:
1.客户端与负载平衡器后面的一个节点建立连接。
2.客户端通过WebSocket将数据发送到负载平衡器。
3.负载平衡器接收数据并将其发送到任何服务器。
4.服务器看到数据并将其发送到应用程序。即使连接尚未建立,服务器也不会丢弃数据包,它只是将数据包发送到应用程序

在这种情况下,我们可以轻松地负载平衡WebSocket请求。我试图理解如何重写TCP/IP堆栈,让数据包直接进入用户空间中的应用程序,但我感到困惑


我们需要使用DPDK吗?如果是,那么您可以给出一个最简单的示例,说明如何直接接收和发送数据包,或者如何跳过连接检查?如果没有,那么在这种情况下我们需要使用什么

如果您只想重新加载现有webSocket连接,那么只需几行客户端代码,就可以向客户端发送“重新连接”消息,客户端将删除当前webSocket连接,然后重新连接新连接

此重新连接将允许服务器场重新加载该新连接

请记住,传入的webSocket连接以HTTP请求的形式开始,其上有一个“升级”头,所以这就是您在负载平衡中需要的


如果您在客户端和服务器(webSocket顶部的消息层)上都使用socket.io,那么它将自动重新连接,您甚至可以在服务器上断开连接,然后socket.io将自动重新连接,而无需任何新的客户端代码。

重写TCP/IP堆栈?祝你好运。如果您描述了实际问题(而没有描述您对解决方案的感觉),那么我们可能会帮助您找到更实际的解决方案。我们还需要知道这是什么类型的客户端(浏览器、自定义代码等)及其功能。仅供参考,您不能将数据包发送到尚未连接到您的服务器或本身就是您可以连接到的服务器的应用程序。必须有某种连接感才能通过TCP发送。还有其他协议,如UDP(和其他协议)具有不同的属性/特征,但您没有给我们提供实际问题的真正意义或您的两个端点的约束,让我们知道还可以建议什么。我必须在用户空间中处理数据包。默认情况下,传输层由Linux操作系统处理,但DPDK可以在用户空间中处理它。我想稍微改变一下TCP协议。我们称之为改变了的TCP。客户端是浏览器。但我不知道从哪里开始。您可以很好地平衡传入webSocket连接的负载。一旦建立了webSocket连接,您就不能将其移动到新服务器,但是如果您有正确的协作客户端,您可以向其发送消息以重新连接,以便重新加载它。仍然不知道您实际要解决的问题是什么。如果您的问题只是希望能够重新平衡webSocket连接的负载,那么只需在客户端中编写几行代码,当客户端收到“重新连接”消息时,它将断开当前连接并重新建立新连接,因此,您的服务器场可以随时重新加载并平衡它。然后,在所有传入的webSocket连接上设置适当的负载平衡(仅供参考,所有连接都以HTTP请求启动,并带有“升级”头)。