TCP 数据包在 Docker 中拆分为 ACK 和 PSH、ACK

TCP 数据包在 Docker 中拆分为 ACK 和 PSH、ACK

我正在开发一个主要基于 TCP 的游戏服务器,并尝试在 Docker 容器中运行它。但是,我观察到,当在容器中访问服务器时(通过游戏客户端),每个 SeqNo 的数据包被分成两部分。第一部分是空的 TCP-ACK(无有效负载),第二部分是包含完整有效负载的 TCP,PSH-ACK。由于此模式适用于从服务器发送或发送到服务器的所有数据包,因此很明显它们属于一起。

为什么会发生这种情况,而且为什么只有当服务器在 Docker 容器中运行时才会发生这种情况?

答案1

我不确定你是如何在 Docker 中运行你的游戏服务器的,但 Docker 的工作方式如下

主机 - 网络 Docker - 网络 Docker Swarm - Ingress 网络 (Swarm) Docker 服务 - Overlay 网络 (容器服务)

在这种情况下,您可以使用 Docker 中的不同层网络,并且 Docker 内部的所有内容都是虚拟网络。

您需要了解的下一步是,如果您在 Swarm 模式下工作,那么当您使用 Docker Swarm 时,它会根据端口号指向您的容器服务,如果您在 Swarm 中运行超过 1 个副本,那么 2 个请求可能不会两次击中同一个服务器。

所以你问的问题我认为与 Docker 中的内部网络如何工作有关,你可以阅读更多关于 Docker 中的网络如何工作的内容,也许它只是一个你可以更改的设置,例如主机

Docker 网络驱动程序:https://docs.docker.com/network/#network-drivers

相关内容