对于 iPhone 客户端在 3G 等移动网络上遇到的服务,有哪些 TCP 调整技巧?

z80*_*000 6 networking linux tcpip iphone performance-tuning

我是一名开发人员,设计网络服务时有好坏之分,iPhone 客户端将对其造成严重打击。iPhone 应用程序在过去一年的下载量超过 10 MM,现在我让用户在线进行互动。

我想为将托管我的基于 TCP 的网络服务的服务器调整 TCP 实现。发送的每个请求大小将是“小”(比如 < 256 字节)。好吧,你明白了,这是一个游戏服务器(令人震惊!)。

仅供参考,我对这个特定服务的 UDP(或 UDP 之上的可靠层,例如在 ENet 和 RakNet 中看到的)不感兴趣,因为游戏不是类似 Quake 的;必须可靠地接收所有数据包,这就是 TCP 的设计目的。因此,iPhone 客户端和服务之间的连接将是“长期存在的”(尽可能多——该死的隧道和电梯!)。

仅供参考,我在运行 Linux 2.6.18-164.9.1.el5 的服务器上的 100Mbps 上行链路上运行该服务。

我的目标是同时:

  • 保持尽可能低的延迟;和
  • 最小化每个连接的客户端使用的内存量。

大量与 TCP 相关的旋钮需要调整!经过一些基础研究后,似乎大多数人建议保留设置不变。但是,有许多设置似乎应该针对特定情况进行调整。我知道这有点模糊,这就是我寻求帮助的原因。

考虑在不稳定网络上调整小请求/响应同时尽可能减少内存的事情可能是:

  • TCP/IP 实现可用的内存
  • 设置“nodelay”选项(禁用 Nagle 算法,因为这是一个半实时游戏服务器)
  • 拥塞控制算法
  • 等(还有什么?)

考虑 TCP拥塞控制算法

  • reno:几乎所有其他操作系统都使用的传统 TCP
  • 立方:CUBIC-TCP
  • bic:BIC-TCP
  • htcp: 汉密尔顿 TCP
  • 拉斯维加斯:TCP 拉斯维加斯
  • westwood:针对有损网络进行了优化

我的服务器默认使用bic,其“目标是设计一种协议,可以在高速长途网络上将其性能扩展到每秒数十千兆位,同时保持强大的公平性、稳定性和 TCP 友好性。”

仅从微小的描述来看,Westwood听起来更合适,因为它“旨在更好地处理大带宽延迟产品路径(大管道),由于传输或其他错误(管道泄漏)而导致潜在的数据包丢失,以及动态负载(动态管)”。

我是不是在这里太深入了,还是这门课程的标准?

你们通常为什么类型的东西调整 TCP/IP?如何?有哪些经验法则需要知道?

对于我的具体情况,您有哪些智慧之言?

非常感谢!

And*_*gor 3

因此,正如您所发现的,TCP 拥塞控制是一个相当复杂的领域。

对于这种特殊情况,由于请求较小,您将希望尽可能保持连接打开,因为每个请求一个连接将占用五个数据包,而您可以将平均值降至如果您保持连接,则多于两个数据包。

NODELAY 对于游戏服务器来说是正确的选择;您希望立即交付 256 字节,但这不是一个完整的段,因此 Nagle 将暂停,除非您使用 NODELAY。

如果您的服务器有大量内存,那么内存选项没什么大不了的,新内核有它们。

至于拥塞控制算法,您发现了 Westwood。另一个选项是 CUBIC。您可以只选择一个,也可以做一些研究并对它们进行基准测试。这可能是一项相当大的工作,但对于 1000 万客户来说这是值得的。因此,我希望在一台或三台 Mac 上使用流量生成器(因为它们具有与手机相同的 TCP 实现)、一个充当路由器(稍后会详细介绍)和您的一台服务器,看看情况如何。

现在,中间的 Linux 机器应该运行ns-3,这样您就可以模拟比以太网交换机更复杂的路径。然后,您可以捕获 TCP 连接发送端的一些数据包跟踪,并使用tcptrace或wireshark 的 tcptrace 图形模式对其进行分析。tcptrace 文档很好地介绍了分析 TCP 拥塞行为。