基於Linux的Socket網路編程的效能最佳化

來源:互聯網
上載者:User

隨著Intenet的日益發展和普及,網路在嵌入式系統中應用非常廣泛,越來越多的嵌入式裝置採用Linux作業系統。Linux是一個原始碼公開的免費作業系統,具有強移植性,所以對基於Linux的Socket網路編程的研究越來越重要。
[attach]900[/attach]
 Socket實際是網路傳輸層供給應用程式層的編程介面。傳輸層則在網路層的基礎上提供進程到進程問的邏輯通道,而應用程式層的進程則利用傳輸層向另一台主機的某一進程通訊。Socket就是應用程式層與傳輸層之間的橋樑。2所示。
[attach]901[/attach]
 使用Socket編程時可以開發客戶機和伺服器應用程式,它們可以在本網上進行通訊,也可以通過Internet在全球範圍內進行通訊。編寫並運行 Socket的用戶端和伺服器端程式,雙方通過通訊端建立了服務串連請求,並且通過一些方法提高Socket的效能。

  3 Socket編程

  3.1 Socket類型

  常見的Socket有3種類型:

  (1)流式Socket(SOCK_STREAM)它提供可靠的通訊流,使用連線導向的TCP協議,從而保證資料轉送的正確性和順序性:

  (2)資料報Socket(SOCK_DGRAM)資料通過相互獨立的報文進行傳輸,是無序的,並且不保證可靠,無差錯,它定義一種面向不需連線的服務,使用資料報協議UDP;

  (3)原始Socket(SOCK_RAM)它允許直接存取底層協議,功能強大但使用較為不便,主要用於一些協議的開發。本編寫的Socket屬於流式Socket。

  3.2 Socket編程流程

  Socket編程採用客戶/伺服器模式。因此編程分為伺服器端和用戶端兩部分。

  每一個Socket都用一個半相關描述(協議,本地地址,本地連接埠)來表示,Socket也有一個類似於檔案開啟的函數,該函數返回一個整型的Socket描述符,隨後建立串連,資料轉送等操作都通過Socket來實現。

  編程流程如下:伺服器端首先建立Socket,返回該Socket的描述符:配置Socket的連接埠和IP地址;建立*甬數,檢測是否有用戶端向伺服器發送請求,若有則接收該請求,將其放到接收隊列中:從接收隊列中接受一個請求;並向用戶端發送確認串連資訊。

  用戶端建立一個Socket,返回該Socket的描述符;配置Socket連接埠和IP地址;向伺服器發送串連請求,並接收伺服器發回的確認串連資訊。雙方通訊結束後,關閉其Socket。進行Socket編程的基本函數有socket(),bind(),listen(),accept(), connect(),send(),recv(),close()。圖3為Socket的編程流程圖。
[attach]902[/attach]
3.3 程式的編譯和運行結果

  (1)在Linux的VI編輯器下編寫伺服器端程式serv.c和用戶端程式clt.c。運用交叉編譯工具arm-linux-gcc,執行編譯指令產生可執行檔。

  其指令為:

  #gcc serv.c=0 serv

  #gcc clt.c-0 clt

  編譯沒有錯誤則會產生可執行檔serv和clt。

  (2)設定管理員和用戶端的IP,保證網路暢通,在serv.c中已將伺服器的IP設定為:192.168.2.111。在用戶端的“網路設定”中設定IP為:192.168.2.22,可以通過ping命令檢測網路是否暢通。

  (3)在一台電腦的終端先運行伺服器程式(./serv),再在用戶端的電腦終端上運行用戶端程式(./clt 192.:168.2.1l 1)就會看到結果(Hello,Wang Lei!You are connected!);運行結果4和圖5所示。如果未運行伺服器程式而先運行用戶端程式將立即提示“Connect:Connection refused”。

  4 SOCket的效能最佳化

  4.1 解決多工

  上面的運行過程僅實現了一個用戶端接人,在實際情況中,人們往往遇到多個用戶端串連伺服器端的情況。由於 connect(),recv(),send() 都是阻塞性函數,若資源沒有準備好,則調用該甬數的進程將進入睡眠狀態,無法處理I/O多工。在伺服器端的serv.c中加入select()函數,它可同時*多個通訊端,實現I/O的多工。

  其函數原型如下:
[attach]903[/attach]
該函數監視一系列檔案描述符,特別是readfds、writefds和exceptfds。如果想知道是否能從標準輸入和通訊端描述符sockfd讀入資料,只要將檔案描述符“0”和“sockfd”加入集合readfds中。參數numfds應等於最高檔案描述符的值加1,設定該值為sockfd+ 1。因為它一定大於標準輸入的檔案描述符“0”。當函數select()返回時,readfds的值修改為反映選擇的哪個檔案描述符可讀。重新編譯和運行用戶端的程式後,伺服器端允許多個用戶端接入,伺服器端運行結果6所示。
[attach]904[/attach]
 4.2 最小化報文傳輸的延時

  通過TCP socket進行通訊時,資料都被拆分成資料區塊,這樣它們就可以封裝到給定串連的TCP payload(指TCP資料包中的有效負荷)中。TCP payload的大小取決於幾個因素(如最大報文長度和路徑),為了達到較好的效能,應使用儘可能多的可用資料來填充每個報文。當沒有足夠的資料來填充 payload時(也稱為最大報文段長度maximum segment size或MSS),TCP將採用Nagle演算法自動將一些小緩衝區串連到一個報文段中。這樣可以通過最小化所發送的報文的數量來提高應用程式的效率,並減輕整體的網路擁塞。

  由於這種演算法對資料進行合并,試圖構成一個完整的TCP報文段,因此會引入一些延時。Socket網路傳輸很長時間只發送一些較小的報文,比如 telnet程式,它讓使用者可以與遠程系統進行互動,通常通過一個shell來進行,如果使用者被要求用發送報文之前輸入的字元來填充某個報文段,該方法絕對不能滿足需要。再比如HTTP協議,通常客戶機瀏覽器會產生一個小請求(一條HTTP請求訊息),然後Web伺服器就會返回一個更大的響應(Web頁面)。最小化傳輸延時是首要的。在這種情況中,Socket可以提供一種解決方案,即禁用Nagle演算法,可設定TCP_NODELAY socket選項TCP socket禁用Nagle演算法。
[attach]905[/attach]
使用Samba的實驗表明,在伺服器上的Samba磁碟機上讀取資料時,禁用Nagle演算法幾乎可以加倍提高讀效能。

  4.3 為Bandwidth Delay Product調節TCP視窗

  TCP的效能取決於幾方面因素,最重要的是連結頻寬(link bandwidth)(報文在網路上傳輸的速率)和往返時間(round-trip time)或RTT(發送報文與接收到另一端的響應之間的延時)。這兩個值確定稱為BDP(Bandwidth Delay Prod-uct)的內容。BDP給出一種簡單的方法計算理論上最優的TCP Socket緩衝區大小(其中儲存排隊等待傳輸和等待應用程式接收的資料)。緩衝區太小,TCP視窗就不能完全開啟,這會限制效能;緩衝區太大,則會浪費寶貴的記憶體資源;設定的緩衝區大小合適,就可完全利用可用頻寬。

  BDP計算公式:

  BDP=link bandwidth×RTT

  若應用程式通過一個100MB/s的區域網路通訊,其RRT為500ms,則BDP為:50MB/sx0.050/ 8625M=625KB。Linux2.6預設的TCP視窗大小是110KB,這將串連的頻寬節流設定為22M/S,計算方法如下:

  throughput=window_size/RTT

  110 KB/0.050=2.2 MB/s

  使用上面計算的視窗大小,得到頻寬為12.5 MB/s,即:

  625 KB/0 050=12.5 MB/s

  差別很大,並且可以為Socket提供更大的輸送量。可以根據自己的Socket計算最優的緩衝區大小。Socket提供幾個Socket選項,其中兩個可以用於修改Socket的發送和接收緩衝區的大小。使用SO_SNDBUF和SO_RCVBUF選項來調整發送和接收緩衝區的大小。
[attach]906[/attach]
 在Linux 2.6核心中.發送緩衝區的大小由調用使用者定義,而接收緩衝區會自動加倍。通過計算合理設定緩衝區的大小,Socket網路傳輸頻寬的資源將得到充分利用,從而提高了傳輸效能。

  5 結束語

  設計和實現一個基於Linux的Socket網路編程,通過在伺服器端運行預先編譯的可執行檔serv,和在用戶端運行預先編譯的可執行檔 clt,伺服器端和用戶端建立通訊串連。加入select()函數以後,伺服器端可以允許多個用戶端接入伺服器端,解決了I/O多工問題,更加接近實際應用。利用TCP socket禁用Nagle演算法實現了最小化報文傳輸的延時,提高了Socket的效能。在網路頻寬非常珍貴的現實中。提出了為Bandwidth Delay Product調節TCP視窗,修改socket的發送和接收緩衝區的大小,完全利用可用的頻寬。達到較好的網路傳輸效果。實際網路傳輸環境複雜多變,如何達到最理想的網路傳輸,還需進一步的分析和研究。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.