我正在开发一个主要基于 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