在3G移动networking上iPhone客户端遇到的服务有哪些TCP调优技巧?

我是一个开发者,他有一个很好的devise一个networking服务的不好的情况,很难被iPhone客户打到。 iPhone应用程序在过去一年的下载量超过了10MM,现在我正在把用户在线上互相交stream。

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

仅供参考,对于这种特殊的服务,我不感兴趣UDP(或UDP上的可靠层,例如ENet和RakNet),因为游戏不像Quake一样; 所有的数据包都必须可靠地接收,这就是TCPdevise的。 因此,iPhone客户端和服务之间的连接将是“长久的”(尽可能多 – 隧道和电梯被诅咒!)。

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

我的目标是同时:

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

大量的TCP相关的旋钮来调整! 经过一些基础研究之后,似乎大多数人都build议保持原样。 但是,有一些设置似乎应该针对特定情况进行调整。 我知道这有点模糊,这就是为什么我要求帮助。

需要考虑的事情是,尽可能减less内存,尽量减less片状networking上的小请求/响应,这可能是:

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

考虑TCP 拥塞控制algorithm :

  • reno:几乎所有其他操作系统使用的传统TCP
  • 立方体:CUBIC-TCP
  • bic:BIC-TCP
  • htcp:Hamilton TCP
  • 维加斯:TCP维加斯
  • westwood:针对有损networking进行了优化

我的服务器默认为bic,其目标是devise一个协议,可以在高速长距离networking中将性能提高到每秒几十吉比特,同时保持强大的公平性,稳定性和TCP友好性。

韦斯特伍德听起来更合适,因为它旨在更好地处理大带宽延迟产品path(大型pipe道),由于传输或其他错误(泄漏pipe道)造成的潜在分组丢失,以及dynamic负载(dynamic负载pipe道)”。

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

什么types的东西你们一般调整TCP / IP? 怎么样? 有什么规则可以知道?

你对我的个案有什么智慧的话?

非常感谢!

所以,正如你发现的那样,TCP拥塞控制是一个相当复杂的领域。

对于这个特殊的情况,由于小的请求,你会想尽量保持连接打开,因为每个请求一个连接将需要五个数据包每个,而你可以得到平均下来如果你保持连接的话,多一点点多的数据包。

NODELAY是游戏服务器的正确select; 你希望你的256个字节马上交付,这不是一个完整的分段,所以Nagle会暂停,除非你使用NODELAY。

如果你的服务器有大量的内存,内存选项没有什么大不了的,新内核就是正确的。

至于拥塞控制algorithm,你发现了Westwood。 另一种select是CUBIC。 你可以去一个,或者你可以做一些研究和基准。 这可能是相当多的工作,但对于10M的客户是值得的。 所以,我会考虑在Mac或者三台Mac上使用stream量生成器来运行一个模拟器(因为它们和电话具有相同的TCP实现),在一个充当路由器的Linux机器之间(稍后会介绍这个)你的服务器之一,看看它是如何去的。

现在,中间的Linux机器应该运行ns-3,这样你就可以模拟一个比以太网交换机更复杂的path。 然后在TCP连接的发送端捕获一些数据包跟踪,并使用tcptrace或wireshark的tcptracegraphics模式分析它们。 tcptrace文档是分析TCP拥塞行为的一个很好的介绍。