《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 設計應用 > 基于Linux的Socket網絡編程的性能優(yōu)化
基于Linux的Socket網絡編程的性能優(yōu)化
摘要: 隨著Intenet的日益發(fā)展和普及,,網絡在嵌入式系統(tǒng)中應用非常廣泛,越來越多的嵌入式設備采用Linux操作系統(tǒng)。Linux是一個源代碼公開的免費操作系統(tǒng),,具有強移植性,,所以對基于Linux的Socket網絡編程的研究越來越重要,。
Abstract:
Key words :

  1 引言

  隨著Intenet的日益發(fā)展和普及,,網絡在嵌入式系統(tǒng)中應用非常廣泛,越來越多的嵌入式設備采用Linux操作系統(tǒng),。Linux是一個源代碼公開的免費操作系統(tǒng),,具有強移植性,所以對基于Linux的Socket網絡編程的研究越來越重要,。

客戶端/服務端模式

  Socket實際是網絡傳輸層供給應用層的編程接口,。傳輸層則在網絡層的基礎上提供進程到進程問的邏輯通道,而應用層的進程則利用傳輸層向另一臺主機的某一進程通信,。Socket就是應用層與傳輸層之間的橋梁,。如圖2所示。

Socket就是應用層與傳輸層之間的橋梁

  使用Socket編程時可以開發(fā)客戶機和服務器應用程序,,它們可以在本地網絡上進行通信,也可以通過Internet在全球范圍內進行通信,。編寫并運行 Socket的客戶端和服務器端程序,,雙方通過套接字建立了服務連接請求,并且通過一些方法提高Socket的性能,。

  2 Socket編程

  2.1 Socket類型

  常見的Socket有3種類型:

  (1)流式Socket(SOCK_STREAM)它提供可靠的通信流,,使用面向連接的TCP協(xié)議,,從而保證數據傳輸的正確性和順序性:

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

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

  2.2 Socket編程流程

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

  每一個Socket都用一個半相關描述(協(xié)議,本地地址,,本地端口)來表示,,Socket也有一個類似于文件打開的函數,該函數返回一個整型的Socket描述符,,隨后建立連接,,數據傳輸等操作都通過Socket來實現(xiàn)。

  編程流程如下:服務器端首先建立Socket,,返回該Socket的描述符:配置Socket的端口和IP地址,;建立監(jiān)聽甬數,檢測是否有客戶端向服務器發(fā)送請求,,若有則接收該請求,,將其放到接收隊列中:從接收隊列中接受一個請求;并向客戶端發(fā)送確認連接信息,。

  客戶端建立一個Socket,,返回該Socket的描述符;配置Socket端口和IP地址,;向服務器發(fā)送連接請求,,并接收服務器發(fā)回的確認連接信息。雙方通信結束后,,關閉其Socket,。進行Socket編程的基本函數有socket(),bind(),,listen(),,accept(), connect(),,send(),,recv(),,close()。圖3為Socket的編程流程圖,。

Socket的編程流程圖

  2.3 程序的編譯和運行結果

  (1)在Linux的VI編輯器下編寫服務器端程序serv.c和客戶端程序clt.c,。運用交叉編譯工具arm-linux-gcc,執(zhí)行編譯指令生成可執(zhí)行文件。

  其指令為:

  #gcc serv.c=0 serv

  #gcc clt.c-0 clt

  編譯沒有錯誤則會生成可執(zhí)行文件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”,。

運行結果

  3 Socket的性能優(yōu)化

  3.1 解決多路復用

  上面的運行過程僅實現(xiàn)了一個客戶端接人,在實際情況中,,人們往往遇到多個客戶端連接服務器端的情況,。由于connect(),recv(),,send() 都是阻塞性函數,,若資源沒有準備好,則調用該甬數的進程將進入睡眠狀態(tài),,無法處理I/O多路復用,。在服務器端的serv.c中加入select()函數,它可同時監(jiān)聽多個套接字,,實現(xiàn)I/O的多路復用,。

  其函數原型如下:

  該函數監(jiān)視一系列文件描述符,特別是readfds,、writefds和exceptfds,。如果想知道是否能從標準輸入和套接字描述符sockfd讀入數據,只要將文件描述符“0”和“sockfd”加入集合readfds中,。參數numfds應等于最高文件描述符的值加1,,設置該值為sockfd+ 1。因為它一定大于標準輸入的文件描述符“0”,。當函數select()返回時,,readfds的值修改為反映選擇的哪個文件描述符可讀。重新編譯和運行客戶端的程序后,,服務器端允許多個客戶端接入,,服務器端運行結果如圖6所示。

 

服務器端運行結果

  3.2 最小化報文傳輸的延時

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

  由于這種算法對數據進行合并,,試圖構成一個完整的TCP報文段,因此會引入一些延時,。Socket網絡傳輸很長時間只發(fā)送一些較小的報文,,比如 telnet程序,它讓用戶可以與遠程系統(tǒng)進行交互,,通常通過一個shell來進行,,如果用戶被要求用發(fā)送報文之前輸入的字符來填充某個報文段,該方法絕對不能滿足需要,。再比如HTTP協(xié)議,,通常客戶機瀏覽器會產生一個小請求(一條HTTP請求消息),,然后Web服務器就會返回一個更大的響應(Web頁面),。最小化傳輸延時是首要的。在這種情況中,,Socket可以提供一種解決方案,,即禁用Nagle算法,可設置TCP_NODELAY socket選項TCP socket禁用Nagle算法,。

程序

  使用Samba的實驗表明,,在服務器上的Samba驅動器上讀取數據時,禁用Nagle算法幾乎可以加倍提高讀性能,。

  3.3 為Bandwidth Delay Product調節(jié)TCP窗口

  TCP的性能取決于幾方面因素,,最重要的是鏈接帶寬(link bandwidth)(報文在網絡上傳輸的速率)和往返時間(round-trip time)或RTT(發(fā)送報文與接收到另一端的響應之間的延時)。這兩個值確定稱為BDP(Bandwidth Delay Prod-uct)的內容,。BDP給出一種簡單的方法計算理論上最優(yōu)的TCP Socket緩沖區(qū)大小(其中保存排隊等待傳輸和等待應用程序接收的數據),。緩沖區(qū)太小,TCP窗口就不能完全打開,,這會限制性能,;緩沖區(qū)太大,,則會浪費寶貴的內存資源;設置的緩沖區(qū)大小合適,,就可完全利用可用帶寬,。

  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計算最優(yōu)的緩沖區(qū)大小,。Socket提供幾個Socket選項,,其中兩個可以用于修改Socket的發(fā)送和接收緩沖區(qū)的大小。使用SO_SNDBUF和SO_RCVBUF選項來調整發(fā)送和接收緩沖區(qū)的大小,。

程序

  在Linux 2.6內核中.發(fā)送緩沖區(qū)的大小由調用用戶定義,,而接收緩沖區(qū)會自動加倍。通過計算合理設置緩沖區(qū)的大小,,Socket網絡傳輸帶寬的資源將得到充分利用,,從而提高了傳輸性能。

  4 結束語

  設計和實現(xiàn)一個基于Linux的Socket網絡編程,,通過在服務器端運行預先編譯的可執(zhí)行文件serv,,和在客戶端運行預先編譯的可執(zhí)行文件clt,服務器端和客戶端建立通信連接,。加入select()函數以后,,服務器端可以允許多個客戶端接入服務器端,解決了I/O多路復用問題,,更加接近實際應用,。利用TCP socket禁用Nagle算法實現(xiàn)了最小化報文傳輸的延時,提高了Socket的性能,。在網絡帶寬非常珍貴的現(xiàn)實中,。提出了為Bandwidth Delay Product調節(jié)TCP窗口,修改socket的發(fā)送和接收緩沖區(qū)的大小,,完全利用可用的帶寬,。達到較好的網絡傳輸效果。實際網絡傳輸環(huán)境復雜多變,如何達到最理想的網絡傳輸,,還需進一步的分析和研究,。

此內容為AET網站原創(chuàng),未經授權禁止轉載,。