11

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

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

每个程序员都应该知道的关于内存的知识

4

1 回答 1

14

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

  • TCP 的工作原理和原理... 3 次握手、确认、延迟确认、nagling、滑动窗口协议。这些功能中的每一个都有一个具体的原因......如果处理不当,它们都会破坏您的应用程序的性能。
  • UDP 多播……即使您从不认为自己会使用它,您也需要知道它存在的原因,以便在设计系统时做出明智的决定。
  • IP 分片,以及 MTU 的影响。
  • 二进制序列化和网络字节排序(即使您只是要使用 Google proto 缓冲区,也很高兴了解它们为何高效)。
  • \r\n\r\nAscii 序列化和消息框架(在 HTTP中是什么意思?)
  • 不同的 I/O 调度模型:Apache 风格的 preforking、thread-per-connection、基于事件的单线程、基于事件的工作线程等。
  • 网络应用程序中缓冲区溢出漏洞的影响
  • 基于协议的设计,与基于 API 或库的设计相反
  • 异步与同步协议。许多高性能系统是异步的。HTTP 是同步的,除非你使用流水线,即使那样,对可能的事情也有很多限制……例如,没有无序响应。

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

考虑一下 HTTP,Web 的协议。Apache、IIS、Lighttpd、Firefox、Opera、WebKit 等……所有这些软件都使用 HTTP。很可能他们都没有共享代码来这样做。当然,不利的一面是由于代码的净量而增加了错误的可能性。有很多好处:

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

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

于 2008-12-14T07:25:01.350 回答