TCP与HTTP基准测试比较

56

我有一个运行在IIS上的Web应用程序,它与[远程]服务机器通信。

我不确定主要协议选择TCP还是Http。

更多细节:

  1. 我将有多个服务/端点
  2. 其中一些是单向的
  3. 其他一些是双向的
  4. Web页面将在服务之前工作
  5. 我们谈论的是高规模的网站

我很清楚它们之间的区别,但我正在寻找一个好的基准,以显示TCP有多快?


这取决于你想做什么。你有关于 web 应用程序所连接的服务的更多信息吗?请求是一次性的(例如,问题、回答),还是会发生几个问题和回答的对话? - Chris J
4个回答

80

HTTP是建立在TCP层之上的一种协议,旨在标准化数据传输。因此,使用TCP套接字比使用HTTP更轻量级。如果您只关心性能,那么纯TCP是最好的解决方案。

您可能会考虑使用HTTP,因为它易于使用和简单,从而降低了开发时间。如果您正在做一些可能被浏览器(通过AJAX调用)直接消费的内容,则应使用HTTP。对于非现代浏览器来直接使用不带HTTP的TCP连接,您必须使用Flash或Silverlight,这通常用于富媒体内容,例如视频和/或音频。然而,许多现代浏览器(截至2013年)现在支持API通过JavaScript直接访问网络、音频和视频资源。唯一需要考虑的是现代Web浏览器在您的用户中的使用率;有关浏览器兼容性的最新信息,请参见caniuse.com

至于基准测试,这里是我找到的唯一一份文献。请参见第5页,其中有性能图表。请注意,它并没有真正比较苹果和苹果,因为它比较了TCP/二进制数据选项与HTTP/XML数据选项。这引出了一个问题:您的服务输出什么类型的数据?二进制(视频、音频、文件)还是文本(JSON、XML、HTML)?

总的来说,像军事或金融领域这样面向性能的系统可能会使用纯TCP连接。而通常面向Web的公司将选择使用HTTP,并使用IIS或Apache来托管其服务。


您可以使用WebSocket进行原始TCP连接,在浏览器中使用JavaScript来创建丰富的内容,也可以使用Canvas/WebGL。 - Ben Barkay
11
真实的情况是,在我最初发布帖子的4年后,现在可以使用JS和HTML5设施(WebSocket、WebGL、Canvas、音频、拖放、WebWorkers、WebRTC、地理位置、Web存储、TypedArrays等)访问音频、视频和网络API。 - Darwyn
感谢Darwyn提供这个好的解释。消除了我很多的误解。您能否详细说明一下“通过JavaScript直接访问网络、音频和视频资源的API”? - user3275211
2
@BenBarkay - WebSockets不是原始的TCP连接。 - Zach Smith
@ZachSmith 那是对的,也许我的类比表达得不太好。 - Ben Barkay
1
此外要提到,当使用HTTP添加安全性,比如SSL和身份验证时,与编写自己的传输安全或授权协议相比,更加方便且降低风险。 - Ole K

36
你真正需要回答的问题是:“对于我的应用程序,TCP还是HTTP更快?”答案取决于你的应用程序的性质以及你在应用程序中使用TCP和/或HTTP的方式。通用的HTTP vs TCP基准测试无法回答你的问题,因为该基准测试很可能无法匹配你的应用程序行为。
理论上,使用TCP的经过最佳设计/实施的解决方案将比使用HTTP的解决方案更快。但这也可能需要更多的工作来实现...具体取决于你的应用程序细节。
还有其他问题可能会影响你的选择。例如,如果你使用HTTP而不是随机端口上使用TCP,则遇到防火墙问题的可能性较小。另一个问题是,在IIS服务器和后端系统之间实现负载平衡器会更容易使用HTTP。
最后,总的来说,系统安全、可靠、易维护和(也许)可扩展可能比速度更重要。明智的策略是先实现简单版本,但在脑海中制定计划以使其更快...如果简单解决方案速度太慢。

3
在使用HTTP时,您可以利用SSL和授权实现,这将显著降低与自制解决方案相比的风险和工作量。 - Ole K
但是如果你想的话,你可以在普通套接字上使用SSL;请参见SSLSocket - Stephen C

7

您可以进行基准测试。

一般来说,如果您想要完成的任务可以通过HTTP轻松完成(即您考虑使用原始TCP的唯一原因是可能会提高性能),那么您应该只使用HTTP。当然,您可以进行套接字编程,但为什么要麻烦自己呢?很多人花费了大量时间和精力构建HTTP客户端库和服务器,并且他们花费了比您在TCP套接字上可能花费的时间更长的时间来优化和测试该代码。通常情况下,有太多可能出现的错误、边缘情况和可以进行的优化,因此使用HTTP的库函数通常更容易、更安全。

此外,HTTP规范定义了各种功能(并由客户端/服务器实现),这使得任何第三方互操作性更加容易。"这是我的URL,这是您发送的规则,这是我返回的规则..."


2
注意事项--如果是对话,HTTP可能不太高效——通过每次打开TCP连接在HTTP中进行多个请求是昂贵的,我曾经看到服务器因为底层TCP连接没有干净地关闭而耗尽资源。是的,HTTP/1.1支持保持连接以进行更多请求,但不清楚这个其他服务是否支持此功能。 - Chris J
3
没错,但如果其他服务器支持它,那就是其中一种“免费”的优化。至于连接没有被干净地关闭,那是库中的一个错误,会是一个严重的问题,但是“自己编写”的情况需要谨慎处理可能导致相同资源匮乏的每种情况。 - Adam Batkin
我不确定你在实现方面的意思是什么?如果使用WCF和net.tcp会更快(并且需要创建Java代理),那就非常简单了。 或者也许我们已经有了Java的实现... 所以它已经被实现和测试过了, 只需要决定,不是吗? - rabashani
问题:在AsyncTask生成的适当http请求的位置,是否使用Socket编程来处理像add_to_cart / add_to_wishlist / add_to_favorite这样的情况会更好? - Tushar Pandey
@rabashani,这更加冒险。 - Ole K

0
我有一个自托管的Windows本地C++服务器应用程序,其中使用了Casablanca C++ REST SDK代码。我可以使用任何客户端C#、JavaScript、C++、cURL,基本上任何可以发送POST、GET、PUT、DEL消息的东西都可以用来向这个自托管的Windows应用程序发送请求消息。此外,我可以使用普通的浏览器地址栏来使用各种参数进行GET相关请求。目前,我只在私有内部网络上运行此系统,因此速度非常快——我还没有对其进行原始TCP的基准测试,但在私有内部网络上,我怀疑甚至不会有几微秒的差异?为了方便开发和能够扩展到完整的互联网应用程序,这是一个梦想成真的系统。它是一个专用系统,使用小型JSON数据包的私有协议,因此不确定是否符合您的应用程序需求?另一个好处是,这个Windows应用程序本地C++代码可以相对容易地移植到Linux/MacOS上运行,因为Casablanca REST SDK可以在这些操作系统上运行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接