我的网络编程之旅
網絡編程是什么?
-
熟悉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來寫網絡測試腳本,事半功倍。
推薦書籍
-
《TCP/IP詳解 卷1:協議》
-
《UNIX網絡編程》
這兩本書不用多說,大家肯定都鐵鐵的知道經典程度。 -
《Linux多線程服務端編程》
這本陳碩老師的書籍實戰性很強,講述的思維和問題都是和實戰緊密相聯的。我感覺代碼部分比較復雜,用了不少我不熟悉的c++特性,還需進一步學習理解
總結
- 上一篇: 《TCP/IP详解:卷1》之TCP/UD
- 下一篇: 网络编程释疑之:同步,异步,阻塞,非阻塞