2008-12-14 50 views
10

因此,我正在使用Boost :: Asio(或者只是Asio,如果你願意的話)做很多高性能網絡編程,並且對TCP和UDP協議的基本要素有非常牢固的把握。我想知道,儘管我知道自己仍然不認爲自己是網絡的專家,但是確定網絡程序員應該知道的基本要素的一種好方法是什麼,特別是那些試圖推動基於大型網絡的性能的人應用程序?C++開發人員應該瞭解的有關網絡編程的一切?

關於程序員和他們應該知道的關於內存的一篇很好的文章(見下文),所以我想知道是否有人爲網絡組合了類似的東西。

What every programmer should know about memory

回答

14

一些要點關我的事的頭頂,你應該知道:

  • 如何以及爲什麼TCP工程... 3次握手,確認,延遲的ACK的Nagling,滑動窗口協議。這些功能中的每一個都有一個具體原因......如果處理不當,它們都會破壞應用程序的性能。
  • UDP組播...即使你從來不認爲你會使用它,你也需要知道它爲什麼存在,所以你可以在設計系統時作出明智的決定。
  • IP分片,以及MTU的影響。
  • 二進制序列化和網絡字節排序(即使您只是要使用Google proto緩衝區,很高興能夠理解爲什麼它們是有效的)。
  • Ascii碼序列化和消息框(這是什麼\r\n\r\n在HTTP的意思嗎?)
  • 不同的I/O調度模型:Apache風格preforking,線程每連接,基於事件的單線程,基於事件與工人線程等
  • 緩衝區溢出漏洞的在聯網的應用程序的影響
  • 基於協議的設計,相對於API-或庫爲基礎的設計
  • 異步VS同步協議。許多高性能系統是異步的。除非使用流水線,否則HTTP是同步的,即使如此,對可能的內容也有許多限制...例如沒有亂序響應。

更新:什麼是基於協議的設計是什麼意思?

考慮HTTP,網絡的協議。 Apache,IIS,Lighttpd,Firefox,Opera,WebKit等等......所有這些軟件都會講HTTP。很可能他們都沒有共享代碼來這樣做。不利的一面是,由於代碼的淨數量增加了錯誤的可能性增加。有許多上升空間:

  • 任何程序都可以通過HTTP進行通信,不論實現語言的
  • 輕型/嵌入式環境可以挑選該協議的一個子集,而不是使用整個事情
  • 這是可能的爲特定情況優化協議處理程序。在不犧牲普遍性的情況下優化圖書館是不可能的。
  • 各種不同的實現迫使圖書館提供商解決錯誤(而不是因爲每個人都使用相同的圖書館而把它們吹掉)。
  • 對HTTP用戶沒有組織或合同負擔,沒有許可費用。

當您設計網絡協議時,您可以自己構建多個API,每個API都針對特定用例進行定製。或者你可以建立一個,這取決於你。聯網軟件組件可以獨立升級。基本上,您聽到的所有內容都適用於Java/C#Interfaces和C++抽象類,但應用於網絡層而不是編程語言層。

+0

謝謝,很好的名單。你可以擴展這一點嗎? 「基於協議的設計,而不是基於API或基於庫的設計」 – ApplePieIsGood 2008-12-14 14:22:53

相關問題