網絡編程之旅

首先給大家推薦下Markdown,我想用過github的同僚一定很熟悉了,這篇文章的排版就是使用的markdown,以後我們不必再去適應各個博客系統自己繁雜的排版方式了。


網絡編程是什麼?

給大家從招聘信息上截取幾段內容:

  • 熟悉Socket編程,熟悉Tcp/Ip協議棧;

  • 熟悉TCP/IP協議、UDP協議,有相關的協議開發經驗;

  • 熟悉網絡編程/多線程編程技術;

大家應該很清晰了吧,關鍵詞就是TCP/IP,Socket,我再附加一個多線程。下面開始我的網絡編程之旅。

tcp/ip協議分析

其實協議分析並不是大衆認爲的網絡編程的範疇,現在網絡編程已經完全和socket等同了。socket是表面,TCP/IP協議是裏,有了協議分析的經歷更會讓你的網絡編程之路更加平坦。

想必有些童鞋經歷過這樣的公司吧,對公司內部的上網行爲進行監控:你訪問過哪些域名,上傳下載過哪些資源,你佔用了多少帶寬流量,甚至你的郵件正文,附件都會呈現在監控系統上。這就是協議分析的傑作。經典的網絡四層模型構成了協議分析的基礎。


瞭解TCP/IP協議一本書足矣《TCP/IP詳解 卷1:協議》,進行協議分析並也不需要我們自己從頭做起,我們完全可以站在巨人的肩膀上,這個巨人就是pcap,另外還有非常知名的基於pcap實現的開源項目供我們參考,比如snorttcpdumpwireshark特別是snort的功能模塊化設計和實現非常經典,應用在大型協議分析項目中極爲合適。至於作爲協議分析工具的tcpdump和wireshark,不會使用的話咱就別好意思說咱是幹這行的了。

socket編程

socket的掃盲書籍及文章太多太多,咱在這就不廢話了。起初我有個疑問,對很多公司招聘信息上寫的熟悉Socket編程感到很不解,因爲我覺得是很簡單的事情,無非就是調用幾個API,理解下三次握手、listen...等等幾個狀態。之後在真正做企業級的牽扯到多Client對單Server網絡編程和具體的網絡環境時才慢慢理解了那些招聘信息的含義和需求深度。(以下如不特殊指定均指TCP協議)

  • 局域網
    我們這個項目主要針對局域網用戶,相比廣域網的網絡環境,幾乎可以忽略帶寬考慮,用戶併發數也相對較小,對性能和效率要求較低,另外業務較複雜。在這種情況下最合適的就是採用RFC(遠程過程調用),於是我們首先想到了開源的RFC框架,經他人嘗試推薦採用了RCF,相當於我們只需要在此框架上套上業務邏輯即可,起初在我們實踐和小規模的測試中並未發現有問題,但是真正模擬到高併發情況時卻在網絡層出現了不可控的錯誤,初步判斷是RCF的線程模型和我們的使用場景不一致,於是決定開發一套自己的網絡庫,於是在一位以前有過網遊經驗的研發人員的指導下,我們一起開發了一個基於boost asio的遠程過程調用框架,boost asio的網絡模型在windows下采用的完成端口,在類unix系統下采用的是相應的多路複用接口,由於在局域網環境下,用戶併發數也不多,也就是用好boost asio,設計好網絡傳輸協議,處理好數據封包解包就好了,並未遇到太大的問題。

  • 廣域網
    首先拋開廣域網複雜的網絡環境不談,這個產品是個互聯網項目,面向普通用戶,有些類似於IM軟件,由於有QQ這個優秀的採用UDP協議的例子,我們也曾經在TCP和UDP協議間猶豫過,但是鑑於UDP實現的難度太大,還是採用了TCP來實現C/S通信。客戶端(windows,linux,android),服務端(linux)網絡庫的設計編寫都由我負責,考慮到以後可能出現的海量併發,在服務端我採用了master——worker模型,一個事件循環一個線程的多線程網絡模型,這樣可以充分利用服務器的多核資源,客戶端和服務端的網絡庫都採用了libevent。服務端的設計思路及代碼實現可以參考我的github:highPerformanceNetworkServer(這只是個演示demo,離企業及應用還有許多需要自己完善的)。

前面說到了socket編程的簡單VS深度,其實你需要了解、注意、掌握的東西有很多,比如MTU,MSS,SO_LINGER,TCPNODELAY,TIMEWAIT,keepalive(最好用應用層心跳包),串話...,在實際的編寫和使用中你會慢慢知道的。

另外很重要的一點就是網絡傳輸協議的設計,這也進行socket編程的重中之重,可以參考我曾經的文章網絡傳輸數據格式的選擇

擴展話題

  • UDP
    UDP也屬於socket編程的範疇,把他單拿出來是因爲他的使用範圍相比較TCP還是有侷限性的。在做可靠信息傳輸這種應用中,騰訊QQ的技術讓我們體會到了他的可靠和高效。業界也有相應的對UDP可靠傳輸的包裝,我仔細研究過的是UDT。在我們的產品應用中,主要是使用UDP來進行NAT穿透,我和同事一起使用過UDP和UDT進行NAT穿透,很有效,但依然有侷限性:比如針對對稱nat。另外使用UDP來進行相對可靠的視頻傳輸,現在我的一個同事在專心搞這塊,我想以後從他那一定可以學到不少更深的技術。

  • 多線程
    如果搞網絡編程不掌握多線程就好像你只有一條腿一般。比如我前面說所的master——worker模型,一個事件循環一個線程,一些涉及到IO bound、CPU bound、心跳包、客戶端搶帶寬都可以利用線程來進行相應的解決。

  • Python
    用python來寫網絡測試腳本,事半功倍。

推薦書籍



本文出自 “永遠的朋友” 博客,請務必保留此出處http://yaocoder.blog.51cto.com/2668309/1193313


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章