【问题标题】:Everything a c++ developer should know about network programming?C++ 开发人员应该知道的关于网络编程的一切?
【发布时间】:2010-09-26 20:18:39
【问题描述】:

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

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

What every programmer should know about memory

【问题讨论】:

    标签: c++ network-programming network-protocols


    【解决方案1】:

    你应该知道的一些要点:

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

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

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

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

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

    【讨论】:

    • 谢谢,很棒的清单。你能扩展一下这一点吗? “基于协议的设计,而不是基于 API 或库的设计”
    • 啊,明白了,这完全有道理。感谢您的澄清。关于在哪里阅读这些东西的任何建议?除了多卷 TCP 丛书之外,还有什么更精简、更面向开发人员的吗?
    • 抱歉,我真的不知道有什么参考资料……这些都是我在工作中捡到的。
    • 不能忘记服务器实现策略(每个连接 1 个进程,每个连接 1 个线程等)和处理客户端服务器应用程序中所有可能的场景。所有这些都包含在 Unix 网络编程amazon.com/Unix-Network-Programming-Addison-Wesley-Professional/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    • 2011-05-11
    • 1970-01-01
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多