網絡編程是什麼?
熟悉Socket編程,熟悉Tcp/Ip協議棧;
熟悉TCP/IP協議、UDP協議,有相關的協議開發經驗;
熟悉網絡編程/多線程編程技術;
tcp/ip協議分析
socket編程
局域網
我們這個項目主要針對局域網用戶,相比廣域網的網絡環境,幾乎可以忽略帶寬考慮,用戶併發數也相對較小,對性能和效率要求較低,另外業務較複雜。在這種情況下最合適的就是採用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,離企業及應用還有許多需要自己完善的)。
擴展話題
UDP
UDP也屬於socket編程的範疇,把他單拿出來是因爲他的使用範圍相比較TCP還是有侷限性的。在做可靠信息傳輸這種應用中,騰訊QQ的技術讓我們體會到了他的可靠和高效。業界也有相應的對UDP可靠傳輸的包裝,我仔細研究過的是UDT。在我們的產品應用中,主要是使用UDP來進行NAT穿透,我和同事一起使用過UDP和UDT進行NAT穿透,很有效,但依然有侷限性:比如針對對稱nat。另外使用UDP來進行相對可靠的視頻傳輸,現在我的一個同事在專心搞這塊,我想以後從他那一定可以學到不少更深的技術。多線程
如果搞網絡編程不掌握多線程就好像你只有一條腿一般。比如我前面說所的master——worker模型,一個事件循環一個線程,一些涉及到IO bound、CPU bound、心跳包、客戶端搶帶寬都可以利用線程來進行相應的解決。Python
用python來寫網絡測試腳本,事半功倍。
推薦書籍
《UNIX網絡編程》
這兩本書不用多說,大家肯定都鐵鐵的知道經典程度。《Linux多線程服務端編程》
這本陳碩老師的書籍實戰性很強,講述的思維和問題都是和實戰緊密相聯的。我感覺代碼部分比較複雜,用了不少我不熟悉的c++特性,還需進一步學習理解