C++开发者需要了解的网络编程知识全面指南?

12

我正在使用Boost::Asio(或者只是Asio)进行大量的高性能网络编程,并且对TCP和UDP协议的基本要素有相当扎实的掌握。然而,尽管我的知识渐入佳境,但我仍不认为自己是网络专家,所以想问一下:有没有一个好的方式来概括网络程序员应该知道的关键要素,特别是那些试图推动其大型网络应用性能的人呢?

关于程序员需要了解内存的知识,有一篇很棒的文章(请见下文链接),所以我想知道是否有人已经为网络编程类似地撰写了相关的文章。

What every programmer should know about memory

1个回答

15

以下是我脑海中需要了解的一些要点:

  • TCP的工作原理和目的...三次握手、确认、延迟确认、Nagle算法、滑动窗口协议。每一个特性都有具体的原因...如果处理不当,它们都可能破坏应用程序的性能。
  • UDP组播...即使您认为您永远不会使用它,也需要知道它存在的原因,以便在设计系统时做出明智的决策。
  • IP分片和MTU的影响。
  • 二进制序列化和网络字节顺序(即使您只是使用Google协议缓冲区,了解它们有效的原因也很好)。
  • ASCII序列化和消息格式(HTTP中的\r\n\r\n是什么意思?)
  • 不同的I/O调度模型:Apache风格的预派生、每连接一个线程、基于事件的单线程、基于事件的工作线程等。
  • 网络应用程序中缓冲区溢出漏洞的影响
  • 基于协议的设计,而不是基于API或库的设计
  • 异步与同步协议。许多高性能系统是异步的。HTTP是同步的,除非您使用流水线处理,即使这样,也有许多限制...例如,不能出现无序的响应。

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

以Web为例,HTTP是Web的协议。Apache、IIS、Lighttpd、Firefox、Opera、WebKit等...所有这些软件都使用HTTP进行通信。它们之间没有共享代码也是可能的。缺点当然是由于代码量的增加而增加错误的可能性。但也有很多好处:

  • 任何程序都可以通过HTTP进行通信,而不受实现语言的限制
  • 轻量级/嵌入式环境可以挑选协议的子集,而不必使用整个协议
  • 可以为特定情况优化协议处理程序。但是,要在牺牲通用性的情况下优化库。
  • 不同的实现方式会迫使库提供者解决问题(而不是无动于衷,因为大家都在使用相同的库)。
  • 使用HTTP没有组织或合同负担,也没有许可费用。
  • 当你设计一个网络协议时,可以构建多个API,每个API都针对特定的用例。或者你可以只构建一个,这取决于你自己。网络化的软件组件可以独立于彼此进行升级。基本上,你听到的有关Java/C#接口和C++抽象类的好处,在网络层应用而不是编程语言层。


    谢谢,很棒的列表。你能详细说明一下这个点吗?“基于协议的设计,而不是基于API或库的设计”。 - ApplePieIsGood
    啊,明白了,这完全有道理。谢谢你澄清。有没有推荐的阅读资料可以了解这些内容呢?除了那些多卷的TCP书系,有没有更简明扼要、面向开发人员的资料? - ApplePieIsGood
    抱歉,我真的不知道这方面有什么参考资料...这都是我在工作中摸索出来的经验。 - Tom
    一个客户端服务器应用程序中不能忘记服务器实现策略(每个连接1个进程,每个连接1个线程等)和处理所有可能的情况。所有这些都包含在Unix网络编程中。http://www.amazon.com/Unix-Network-Programming-Addison-Wesley-Professional/dp/0131411551/ref=sr_1_1?ie=UTF8&s=books&qid=1244659765&sr=1-1 - Reginaldo

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