因此,我正在使用Boost::Asio(或者,如果愿意的话,也可以只是使用Asio)来进行许多高性能的网络编程,并且对TCP和UDP协议(protocol)的本质都有相当的了解。不过,我想知道的是,尽管我仍然不了解自己,但我仍然不认为自己是网络方面的专家,所以这是一种很好的方式来构造网络程序员应了解的基本知识,特别是对于那些试图提高其大型网络性能的人而言。应用程序?

关于程序员以及他们应该了解的有关内存的文章非常多(请参阅下文),所以我想知道是否有人为网络建立了类似的东西。

What every programmer should know about memory

最佳答案

您应该知道的一些提示标志着我的头脑:

  • TCP的工作原理和原因... 3向握手,确认,延迟的ack,打g,滑动窗口协议(protocol)。这些功能中的每一个都有一个具体的原因……如果处理不当,它们都会破坏应用程序的性能。
  • UDP多播...即使您从不认为自己会使用它,也需要知道它为什么存在,以便在设计系统时做出有根据的决策。
  • IP碎片,以及MTU的影响。
  • 二进制序列化和网络字节排序(即使您只是要使用Google proto缓冲区,也很高兴了解它们为何有效)。
  • Ascii序列化和消息框架(HTTP中的\r\n\r\n是什么意思?)
  • 不同的I/O调度模型:Apache样式的预 fork ,每连接线程,基于事件的单线程,基于事件的工作线程等。
  • 联网应用程序中的缓冲区溢出漏洞的影响
  • 基于协议(protocol)的设计,而不是基于API或基于库的设计
  • 异步与同步协议(protocol)。许多高性能系统都是异步的。除非您使用流水线,否则HTTP是同步的,即使那样,对可能的内容也有很多限制...例如,没有乱序的响应。


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

    考虑HTTP,即网络协议(protocol)。 Apache,IIS,Lighttpd,Firefox,Opera,WebKit等。所有这些软件都使用HTTP。他们中很可能没有人共享这样做的代码。缺点当然是由于净代码量导致错误发生的可能性增加。有很多优点:
  • 任何程序都可以通过HTTP进行通信,而与实现语言
  • 无关
  • 轻量级/嵌入式环境可以选择协议(protocol)的一个子集,而不是使用整个
  • 可以针对特定情况优化协议(protocol)处理程序。不牺牲通用性就不可能优化库。
  • 各种不同的实现都迫使库提供程序解决bug(而不是仅仅因为所有的人都使用同一个库而销毁了它们)。
  • HTTP用户没有组织或契约(Contract)上的负担,也没有许可费用。

  • 在设计网络协议(protocol)时,您可以构建几个API,每个API都针对特定的用例量身定制。或者您可以构建一个,由您自己决定。联网软件组件可以彼此独立升级。基本上,您所听到的所有关于Java/C#接口(interface)和C++抽象类的东西都很好,但是适用于网络层而不是编程语言层。

    10-07 19:32
    查看更多