因此,我正在使用Boost :: Asio(或者只是Asio)进行大量高性能网络编程,并且非常可靠地掌握TCP和UDP协议的基本要素.我想知道,因为尽管我知道,我仍然不认为自己是网络专家,有什么方法可以构建网络程序员应该知道的基本要素,特别是那些试图推动其大型网络性能的人应用程序?
关于程序员以及他们应该了解的内存(见下文),有一篇很棒的文章,所以我想知道是否有人为网络做了类似的事情.
每个程序员应该了解内存
有些项目指出了我应该知道的事情:
TCP的工作原理和原因... 3路握手,确认,延迟确认,唠叨,滑动窗口协议.这些功能中的每一个都有一个具体的原因......如果处理不当,它们都会破坏应用程序的性能.
UDP多播...即使你从未想过你会使用它,你需要知道它为什么存在,这样你就可以在设计系统时做出明智的决定.
IP碎片,以及MTU的影响.
二进制序列化和网络字节排序(即使您只是要使用Google原型缓冲区,也很高兴了解它们为什么有效).
Ascii序列化和消息框架(\r\n\r\n
在HTTP 中意味着什么?)
不同的I/O调度模型:Apache样式的preforking,每个连接的线程,基于事件的单线程,基于事件的工作线程等.
网络应用程序中缓冲区溢出漏洞的影响
基于协议的设计,与基于API或库的设计相反
异步与同步协议.许多高性能系统都是异步的.HTTP是同步的,除非你使用流水线技术,即便如此,对可能的内容有很多限制......例如,没有无序响应.
更新:基于协议的设计意味着什么?
考虑HTTP,即网络协议.Apache,IIS,Lighttpd,Firefox,Opera,WebKit等......所有这些软件都讲HTTP.很可能他们都没有共享代码来这样做.当然,缺点是由于代码净量导致的错误可能性增加.有许多好处:
无论实现语言如何,任何程序都可以通过HTTP进行通信
轻量级/嵌入式环境可以选择协议的一个子集,而不是使用整个协议
可以针对特定情况优化协议处理程序.在不牺牲普遍性的情况下优化库是不可能的.
各种不同的实现迫使库提供程序解决错误(而不是仅仅将它们删除,因为每个人都使用相同的库).
HTTP用户没有组织或合同负担,没有许可费用.
在设计网络协议时,您可以自己构建几个API,每个API都针对特定的用例进行定制.或者你可以建立一个,这取决于你.网络化软件组件可以相互独立升级.基本上,您听到的所有内容都与Java/C#接口和C++抽象类有关,但应用于网络层而不是编程语言层.