因此,我使用 Boost::Asio(或者如果您愿意的话,也可以直接使用 Asio)进行大量高性能网络编程,并且对 TCP 和 UDP 协议的要点有相当扎实的掌握。但我想知道,因为尽管我有知识,但我仍然不认为自己是网络专家,有什么好方法来构建网络程序员应该知道的要点,特别是对于那些试图提高基于大型网络的性能的人来说应用程序?

有一篇关于程序员以及他们应该了解内存的很棒的文章(见下文),所以我想知道是否有人为网络编写了类似的东西。

每个程序员都应该了解的内存知识

有帮助吗?

解决方案

我的一些要点是你应该知道的:

  • TCP 的工作原理和原因...3 向握手、确认、延迟确认、nagling、滑动窗口协议。这些功能中的每一项都有一个具体的原因......如果处理不当,它们都会破坏应用程序的性能。
  • UDP 组播...即使您从未想过会使用它,您也需要知道它为何存在,以便在设计系统时做出明智的决策。
  • IP分片,以及MTU的影响。
  • 二进制序列化和网络字节排序(即使您只是要使用 Google proto 缓冲区,理解它也很好 为什么 他们很有效率)。
  • Ascii 序列化和消息帧(什么是 \r\n\r\n HTTP 中的意思?)
  • 不同的I/O调度模型:Apache 风格的预分叉、每个连接一个线程、基于事件的单线程、基于事件的工作线程等。
  • 网络应用程序中缓冲区溢出漏洞的影响
  • 基于协议的设计,而不是基于 API 或库的设计
  • 异步与同步协议。许多高性能系统都是异步的。HTTP 是同步的,除非您使用管道,即使如此,可能的情况也有很多限制......例如,没有无序响应。

更新:基于协议的设计是什么意思?

考虑一下 HTTP,网络协议。Apache、IIS、Lighttpd、Firefox、Opera、WebKit 等...所有这些软件都使用 HTTP。他们很可能都没有共享这样做的代码。当然,缺点是由于代码的净量而增加了出现错误的可能性。有很多优点:

  • 任何程序都可以通过 HTTP 进行通信,无论实现语言如何
  • 轻量级/嵌入式环境可以选择协议的子集,而不是使用整个协议
  • 可以针对特定情况优化协议处理程序。在不牺牲通用性的情况下优化库是不可能的。
  • 各种不同的实现迫使库提供者解决错误(而不是仅仅因为每个人都使用相同的库而将其排除在外)。
  • HTTP 用户没有组织或合同负担,也没有许可费用。

当您设计网络协议时,您可以自己构建多个 API,每个 API 都针对特定用例进行定制。或者您可以构建一个,这取决于您。联网的软件组件可以彼此独立地升级。基本上,您听到的有关 Java/C# 接口和 C++ 抽象类的所有优点,但都应用于网络层而不是编程语言层。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top