【C++】網絡編程小總結

這幾天抽空看了boost.asio,對網絡編程有個大概的瞭解,記錄如下:

網絡庫

C++常用編寫網絡項目的庫有ACE,boost.asio,libev,libevent,libuv,POCO,cpp-netlibe,等等。按照大衆認知,ACE是很重量、複雜、難用的庫,超大型項目可能要用,普通的應該沒必要。輕型的、要造很多額外輪子就是用libev,libevent等幾個作爲網絡項目基礎,這幾個其實是做併發用的,對網絡功能沒多少包裝。boost是C++準標準庫,asio是其中一個子項目,asio也有獨立項目。cpp-netlib主要是基於asio構建的網絡庫。asio部分內容可能要進入C++標準庫,網上對asio的評價比較正面,使用asio做業界項目的也有不少。

套接字

套接字將對外連接的操作變得和普通IO操作一樣,類比文件IO操作,就是網絡IO操作API系列。用的最多的套接字接口類型是TCP,UDP和ICMP,網上有更清晰的概念解讀。TCP獲取穩定、長期的連接;UDP發了消息就不管;ICMP用來做網絡測試,比如PING命令。

網絡併發

服務端軟件要解決的一大問題是,成千上萬的用戶發來服務申請怎麼辦。併發就爲了讓很多用戶服務申請能夠及時處理而不再長時間等待。併發的實現方式有很多,比如協程,多線程、多進程。很多網絡庫的基礎就是如何實現高性能併發,測試基準是併發速度。

協程

協程是僅在單線程下實現多任務進行的方式。多任務ABC並沒有同步進行,而是一會兒執行A任務的一部分,然後執行B任務的一部分。。。再轉過頭來執行A任務的下一部分,與CPU輪轉操作很像。協程並不能提升任務的執行速度,它的目標是,在接受服務申請後,將網絡任務及時分發給後端真正的worker,這樣保證後端worker總是滿負荷運作來滿足大量用戶的服務申請。

異步

我們不知道用戶服務連接什麼時候會到來,如果使用循環代碼不斷查詢,就會導致CPU使用率100%,白白消耗CPU資源。異步就能實現這個功能:當有用戶服務申請到來的時候,就喚醒開始工作,不然就處於等待狀態,不佔用CPU。這一過程可以類比系統中斷服務,有中斷信號來了就執行相應的操作,不然就歇着。另外有一種是多線程實現的異步,是主線程可以歇着或者執行其他任務,子線程接着完成任務而不影響主線程。

服務端基礎

服務端的基礎就是一個併發程序,包括接收器和任務處理器。接收器等待新連接的到來,然後調用任務處理器進行異步處理。網絡部分由套接字完成。需要處理的任務,可以在多線程或者多進程中完成。
具體的操作,比如登錄、查詢,就是任務處理器連接到數據庫進行讀取,然後利用套接字把信息返回給客戶端。註冊,修改資料,就是就是任務處理器連接到數據庫進行寫入。看網頁看APP,就是客戶端發送申請,任務處理器解析客戶端的申請,從硬盤中讀取網頁、APP內容數據,然後發送給客戶端。此外還有日誌,用於記錄歷史操作;內存管理;

協議

套接字對應的協議主要是TCP和UDP,用來進行數據傳輸。TCP和UDP傳輸的數據主要是二進制流或者一堆字符串,而我們要用這些字符串內容來表徵複雜的數據。結構化數據比如表單,可以用json/xml來存儲,json/xml文件可以用記事本打開,說明本質上就是一堆字符串。此外還有protobuf,可以將數據結構變成字符串,再在接收端還原爲數據結構。
如何解析傳輸的字符串,還原爲豐富多樣的原始數據,需要遵從一定的規則,這就是HTTP協議等協議,與TCP.UDP不在一個層面。HTTP包含HTTP頭和富文本內容,寫進字符串就非常複雜,需要專門的解析庫。如果要自己設計一個協議,同樣需要設計數據頭和內容編碼,比如我們傳輸的字符串有多少,讀取到哪裏纔算讀取完,用戶配置信息等,這都是協議需要考慮的東西,而不是網絡庫API做好的。

安全

常見的網絡安全策略有加密和證書。
加密常用的庫用OpenSSL。套接字傳輸的數據是字符串,那麼可以用OpenSSL加密之後再發送出去,保障安全。
證書用來鑑別用戶身份,傳輸過程中同步發送一串證書加密文本用來驗證。

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