<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 基于Linux的Socket網(wǎng)絡(luò )編程的性能優(yōu)化

基于Linux的Socket網(wǎng)絡(luò )編程的性能優(yōu)化

作者: 時(shí)間:2010-04-09 來(lái)源:網(wǎng)絡(luò ) 收藏

  1 引言

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

客戶(hù)端/服務(wù)端模式

  實(shí)際是網(wǎng)絡(luò )傳輸層供給應用層的編程接口。傳輸層則在網(wǎng)絡(luò )層的基礎上提供進(jìn)程到進(jìn)程問(wèn)的邏輯通道,而應用層的進(jìn)程則利用傳輸層向另一臺主機的某一進(jìn)程通信。就是應用層與傳輸層之間的橋梁。如圖2所示。

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

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

  2 Socket編程

  2.1 Socket類(lèi)型

  常見(jiàn)的Socket有3種類(lèi)型:

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

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

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

  2.2 Socket編程流程

  Socket編程采用客戶(hù)/服務(wù)器模式。因此編程分為服務(wù)器端和客戶(hù)端兩部分。

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

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

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

Socket的編程流程圖

  2.3 程序的編譯和運行結果

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

  其指令為:

  #gcc serv.c=0 serv

  #gcc clt.c-0 clt

  編譯沒(méi)有錯誤則會(huì )生成可執行文件serv和clt。

  (2)配置服務(wù)器和客戶(hù)端的IP,保證網(wǎng)絡(luò )暢通,在serv.c中已將服務(wù)器的IP設置為:192.168.2.111。在客戶(hù)端的“網(wǎng)絡(luò )設置”中設置IP為:192.168.2.22,可以通過(guò)ping命令檢測網(wǎng)絡(luò )是否暢通。

  (3)在一臺計算機的終端先運行服務(wù)器程序(./serv),再在客戶(hù)端的計算機終端上運行客戶(hù)端程序(./clt 192.:168.2.1l 1)就會(huì )看到結果(Hello,Wang Lei!You are connected!);運行結果如圖4和圖5所示。如果未運行服務(wù)器程序而先運行客戶(hù)端程序將立即提示“Connect:Connection refused”。

運行結果

  3 Socket的

  3.1 解決多路復用

  上面的運行過(guò)程僅實(shí)現了一個(gè)客戶(hù)端接人,在實(shí)際情況中,人們往往遇到多個(gè)客戶(hù)端連接服務(wù)器端的情況。由于connect(),recv(),send() 都是阻塞性函數,若資源沒(méi)有準備好,則調用該甬數的進(jìn)程將進(jìn)入睡眠狀態(tài),無(wú)法處理I/O多路復用。在服務(wù)器端的serv.c中加入

  其函數原型如下:

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

服務(wù)器端運行結果

  3.2 最小化報文傳輸的延時(shí)

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

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

程序

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

  3.3 為Bandwidth Delay Product調節TCP窗口

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

  BDP計算公式:

BDP=link bandwidth×RTT

  若應用程序通過(guò)一個(gè)100MB/s的局域網(wǎng)通信,其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提供更大的吞吐量??梢愿鶕约旱腟ocket計算最優(yōu)的緩沖區大小。Socket提供幾個(gè)Socket選項,其中兩個(gè)可以用于修改Socket的發(fā)送和接收緩沖區的大小。使用SO_SNDBUF和SO_RCVBUF選項來(lái)調整發(fā)送和接收緩沖區的大小。

程序

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

  4 結束語(yǔ)

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

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)

linux相關(guān)文章:linux教程




評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>