c ++开发人员应该了解网络编程的一切吗?

时间:2008-12-14 07:03:10

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

因此,我正在使用Boost :: Asio(或者只是Asio)进行大量高性能网络编程,并且非常可靠地掌握TCP和UDP协议的基本要素。我想知道,因为尽管我知道,我仍然不认为自己是网络专家,什么是构建网络程序员应该知道的基本要素的好方法,特别是那些试图推动其大型网络性能的人应用

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

What every programmer should know about memory

1 个答案:

答案 0 :(得分:14)

有些项目指出了我应该知道的事情:

  • TCP的工作原理和原因... 3路握手,确认,延迟确认,唠叨,滑动窗口协议。每个功能都有一个具体原因......如果处理不当,它们都会破坏应用程序的性能。
  • UDP多播......即使你从未想过你会使用它,你需要知道它为什么存在,以便你在设计系统时做出明智的决定。
  • IP碎片,以及MTU的影响。
  • 二进制序列化和网络字节排序(即使您只是要使用Google原型缓冲区,也很高兴理解为什么它们是有效的)。
  • 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 ++抽象类有关,但应用于网络层而不是编程语言层。