如何编写自己的 TCP/IP 或 ISO/OSI 堆栈以使用 WebSockets 而无需每次都使用握手?
Posted
技术标签:
【中文标题】如何编写自己的 TCP/IP 或 ISO/OSI 堆栈以使用 WebSockets 而无需每次都使用握手?【英文标题】:How to write own TCP/IP or ISO/OSI stack to use WebSockets without using handshake every time? 【发布时间】:2016-10-25 10:13:26 【问题描述】:我的目的是使用带有自己的 TCP/IP 或 ISO/OSI 堆栈的 WebSockets。我想对从客户端到应用程序服务器的所有请求进行负载平衡(我们知道 WebSockets 只能与已建立连接的一台服务器一起使用)。我希望能够连接到一个节点并向任何节点发送请求。
算法是下一个: 1. 客户端与负载均衡器后面的其中一个节点建立连接。 2.客户端通过WebSocket向负载均衡器发送数据。 3.负载均衡器接收数据并将其发送到任何服务器。 4. 服务器看到数据并将其发送给应用程序。即使没有建立连接,服务器也不会丢弃数据包,它只是将数据包发送到应用程序。
在这种情况下,我们可以轻松地对 WebSockets 请求进行负载平衡。我试图了解如何重写 TCP/IP 堆栈并让数据包直接进入用户空间中的应用程序,但我很困惑。
我们需要使用 DPDK 吗?是的,那么您能否展示一个如何直接接收和发送数据包或如何跳过连接检查的最小示例?如果没有,那么在这种情况下我们需要使用什么?
【问题讨论】:
重写 TCP/IP 堆栈?祝你好运。如果您描述了实际问题(没有描述您对解决方案的看法),那么我们也许可以帮助您提供更实际的解决方案。我们还需要知道这是什么类型的客户端(浏览器、自定义代码等)以及它的功能。 仅供参考,您不能将数据包发送到尚未连接到您的服务器或本身就是您可以连接到的服务器的应用程序。为了通过 TCP 发送,必须有某种连接感。还有其他协议,例如 UDP(和其他)具有不同的属性/特征,但是您没有让我们真正了解实际问题或您的两个端点的限制,让我们知道还有什么可以建议的。 我必须在用户空间处理数据包。默认情况下,传输层由 Linux 操作系统处理,但 DPDK 可以在用户空间中处理它。我想稍微改变一下 TCP 协议。我们称它为 Changed_TCP。客户端是浏览器。但我不知道从哪里开始。 您可以很好地平衡传入的 webSocket 连接。一旦建立了 webSocket 连接,您就无法将其移动到新服务器,但如果您有正确的合作客户端,您可以向它发送一条消息以重新连接,以便重新平衡它。仍然不知道您实际上要解决什么问题。 如果您的问题只是希望能够重新负载平衡 webSocket 连接,那么只需在客户端中编写几行代码,当它收到“重新连接”消息时,它将断开当前连接并重新建立新连接,从而让您的服务器场随时重新加载平衡。然后,在所有传入的 webSocket 连接上设置适当的负载平衡(仅供参考,所有这些连接都以带有“升级”标头的 HTTP 请求开始)。 【参考方案1】:如果你只是希望能够重新加载平衡现有的 webSocket 连接,那么通过几行客户端代码,你可以向客户端发送“重新连接”消息,客户端将断开当前的 webSocket 连接,然后重新连接一个新连接。
此重新连接将允许您的服务器场重新平衡该新连接。
请记住,传入的 webSocket 连接以带有“升级”标头的 HTTP 请求的形式开始生命周期,因此这就是您在负载平衡中寻找的内容。
如果您在客户端和服务器(webSocket 之上的消息传递层)都使用 socket.io,那么它将自动重新连接,因此您甚至可以在服务器端断开连接,然后 socket.io 将自动重新连接而无需任何新的客户端代码。
【讨论】:
以上是关于如何编写自己的 TCP/IP 或 ISO/OSI 堆栈以使用 WebSockets 而无需每次都使用握手?的主要内容,如果未能解决你的问题,请参考以下文章
ISO/OSI参考模型与TCP/IP协议模型中各层的对应关系