當(dāng)前位置:首頁(yè) > 通信技術(shù) > 通信技術(shù)
[導(dǎo)讀]1 引言 隨著Intenet的日益發(fā)展和普及,網(wǎng)絡(luò)在嵌入式系統(tǒng)中應(yīng)用非常廣泛,越來(lái)越多的嵌入式設(shè)備采用Linux操作系統(tǒng)。Linux是一個(gè)源代碼公開(kāi)的免費(fèi)操作系統(tǒng),具有強(qiáng)移植性,所以對(duì)基于Linux的Socket網(wǎng)絡(luò)編程的研究

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

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

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

3 Socket編程
3.1 Socket類型
    常見(jiàn)的Socket有3種類型:
    (1)流式Socket(SOCK_STREAM)它提供可靠的通信流,使用面向連接的TCP協(xié)議,從而保證數(shù)據(jù)傳輸?shù)恼_性和順序性:
    (2)數(shù)據(jù)報(bào)Socket(SOCK_DGRAM)數(shù)據(jù)通過(guò)相互獨(dú)立的報(bào)文進(jìn)行傳輸,是無(wú)序的,并且不保證可靠,無(wú)差錯(cuò),它定義一種面向無(wú)連接的服務(wù),使用數(shù)據(jù)報(bào)協(xié)議UDP;
    (3)原始Socket(SOCK_RAM)它允許直接訪問(wèn)底層協(xié)議,功能強(qiáng)大但使用較為不便,主要用于一些協(xié)議的開(kāi)發(fā)。本編寫(xiě)的Socket屬于流式Socket。


3.2 Socket編程流程
    Socket編程采用客戶/服務(wù)器模式。因此編程分為服務(wù)器端和客戶端兩部分。
    每一個(gè)Socket都用一個(gè)半相關(guān)描述(協(xié)議,本地地址,本地端口)來(lái)表示,Socket也有一個(gè)類似于文件打開(kāi)的函數(shù),該函數(shù)返回一個(gè)整型的Socket描述符,隨后建立連接,數(shù)據(jù)傳輸?shù)炔僮鞫纪ㄟ^(guò)Socket來(lái)實(shí)現(xiàn)。
    編程流程如下:服務(wù)器端首先建立Socket,返回該Socket的描述符:配置Socket的端口和IP地址;建立監(jiān)聽(tīng)甬?dāng)?shù),檢測(cè)是否有客戶端向服務(wù)器發(fā)送請(qǐng)求,若有則接收該請(qǐng)求,將其放到接收隊(duì)列中:從接收隊(duì)列中接受一個(gè)請(qǐng)求;并向客戶端發(fā)送確認(rèn)連接信息。
    客戶端建立一個(gè)Socket,返回該Socket的描述符;配置Socket端口和IP地址;向服務(wù)器發(fā)送連接請(qǐng)求,并接收服務(wù)器發(fā)回的確認(rèn)連接信息。雙方通信結(jié)束后,關(guān)閉其Socket。進(jìn)行Socket編程的基本函數(shù)有socket(),bind(),listen(),accept(), connect(),send(),recv(),close()。圖3為Socket的編程流程圖。

3.3 程序的編譯和運(yùn)行結(jié)果
    (1)在Linux的VI編輯器下編寫(xiě)服務(wù)器端程序serv.c和客戶端程序clt.c。運(yùn)用交叉編譯工具arm-linux-gcc,執(zhí)行編譯指令生成可執(zhí)行文件。
    其指令為:
    #gcc serv.c=0 serv
    #gcc clt.c-0 clt
    編譯沒(méi)有錯(cuò)誤則會(huì)生成可執(zhí)行文件serv和clt。
    (2)配置服務(wù)器和客戶端的IP,保證網(wǎng)絡(luò)暢通,在serv.c中已將服務(wù)器的IP設(shè)置為:192.168.2.111。在客戶端的“網(wǎng)絡(luò)設(shè)置”中設(shè)置IP為:192.168.2.22,可以通過(guò)ping命令檢測(cè)網(wǎng)絡(luò)是否暢通。
    (3)在一臺(tái)計(jì)算機(jī)的終端先運(yùn)行服務(wù)器程序(./serv),再在客戶端的計(jì)算機(jī)終端上運(yùn)行客戶端程序(./clt 192.:168.2.1l 1)就會(huì)看到結(jié)果(Hello,Wang Lei!You are connected!);運(yùn)行結(jié)果如圖4和圖5所示。如果未運(yùn)行服務(wù)器程序而先運(yùn)行客戶端程序?qū)⒘⒓刺崾尽癈onnect:Connection refused”。


4 SOCket的性能優(yōu)化
4.1 解決多路復(fù)用
    上面的運(yùn)行過(guò)程僅實(shí)現(xiàn)了一個(gè)客戶端接人,在實(shí)際情況中,人們往往遇到多個(gè)客戶端連接服務(wù)器端的情況。由于connect(),recv(),send() 都是阻塞性函數(shù),若資源沒(méi)有準(zhǔn)備好,則調(diào)用該甬?dāng)?shù)的進(jìn)程將進(jìn)入睡眠狀態(tài),無(wú)法處理I/O多路復(fù)用。在服務(wù)器端的serv.c中加入select()函數(shù),它可同時(shí)監(jiān)聽(tīng)多個(gè)套接字,實(shí)現(xiàn)I/O的多路復(fù)用。
    其函數(shù)原型如下:
  

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

4.2 最小化報(bào)文傳輸?shù)难訒r(shí)
    通過(guò)TCP socket進(jìn)行通信時(shí),數(shù)據(jù)都被拆分成數(shù)據(jù)塊,這樣它們就可以封裝到給定連接的TCP payload(指TCP數(shù)據(jù)包中的有效負(fù)荷)中。TCP payload的大小取決于幾個(gè)因素(如最大報(bào)文長(zhǎng)度和路徑),為了達(dá)到較好的性能,應(yīng)使用盡可能多的可用數(shù)據(jù)來(lái)填充每個(gè)報(bào)文。當(dāng)沒(méi)有足夠的數(shù)據(jù)來(lái)填充 payload時(shí)(也稱為最大報(bào)文段長(zhǎng)度maximum segment size或MSS),TCP將采用Nagle算法自動(dòng)將一些小緩沖區(qū)連接到一個(gè)報(bào)文段中。這樣可以通過(guò)最小化所發(fā)送的報(bào)文的數(shù)量來(lái)提高應(yīng)用程序的效率,并減輕整體的網(wǎng)絡(luò)擁塞。
    由于這種算法對(duì)數(shù)據(jù)進(jìn)行合并,試圖構(gòu)成一個(gè)完整的TCP報(bào)文段,因此會(huì)引入一些延時(shí)。Socket網(wǎng)絡(luò)傳輸很長(zhǎng)時(shí)間只發(fā)送一些較小的報(bào)文,比如 telnet程序,它讓用戶可以與遠(yuǎn)程系統(tǒng)進(jìn)行交互,通常通過(guò)一個(gè)shell來(lái)進(jìn)行,如果用戶被要求用發(fā)送報(bào)文之前輸入的字符來(lái)填充某個(gè)報(bào)文段,該方法絕對(duì)不能滿足需要。再比如HTTP協(xié)議,通??蛻魴C(jī)瀏覽器會(huì)產(chǎn)生一個(gè)小請(qǐng)求(一條HTTP請(qǐng)求消息),然后Web服務(wù)器就會(huì)返回一個(gè)更大的響應(yīng)(Web頁(yè)面)。最小化傳輸延時(shí)是首要的。在這種情況中,Socket可以提供一種解決方案,即禁用Nagle算法,可設(shè)置TCP_NODELAY socket選項(xiàng)TCP socket禁用Nagle算法。

  
    使用Samba的實(shí)驗(yàn)表明,在服務(wù)器上的Samba驅(qū)動(dòng)器上讀取數(shù)據(jù)時(shí),禁用Nagle算法幾乎可以加倍提高讀性能。
4.3 為Bandwidth Delay Product調(diào)節(jié)TCP窗口
    TCP的性能取決于幾方面因素,最重要的是鏈接帶寬(link bandwidth)(報(bào)文在網(wǎng)絡(luò)上傳輸?shù)乃俾?和往返時(shí)間(round-trip time)或RTT(發(fā)送報(bào)文與接收到另一端的響應(yīng)之間的延時(shí))。這兩個(gè)值確定稱為BDP(Bandwidth Delay Prod-uct)的內(nèi)容。BDP給出一種簡(jiǎn)單的方法計(jì)算理論上最優(yōu)的TCP Socket緩沖區(qū)大小(其中保存排隊(duì)等待傳輸和等待應(yīng)用程序接收的數(shù)據(jù))。緩沖區(qū)太小,TCP窗口就不能完全打開(kāi),這會(huì)限制性能;緩沖區(qū)太大,則會(huì)浪費(fèi)寶貴的內(nèi)存資源;設(shè)置的緩沖區(qū)大小合適,就可完全利用可用帶寬。
    BDP計(jì)算公式:
    BDP=link bandwidth×RTT
    若應(yīng)用程序通過(guò)一個(gè)100MB/s的局域網(wǎng)通信,其RRT為500ms,則BDP為:50MB/sx0.050/ 8625M=625KB。Linux2.6默認(rèn)的TCP窗口大小是110KB,這將連接的帶寬限制為22M/S,計(jì)算方法如下:
    throughput=window_size/RTT
    110 KB/0.050=2.2 MB/s
    使用上面計(jì)算的窗口大小,得到帶寬為12.5 MB/s,即:
    625 KB/0 050=12.5 MB/s
    差別很大,并且可以為Socket提供更大的吞吐量??梢愿鶕?jù)自己的Socket計(jì)算最優(yōu)的緩沖區(qū)大小。Socket提供幾個(gè)Socket選項(xiàng),其中兩個(gè)可以用于修改Socket的發(fā)送和接收緩沖區(qū)的大小。使用SO_SNDBUF和SO_RCVBUF選項(xiàng)來(lái)調(diào)整發(fā)送和接收緩沖區(qū)的大小。

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

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

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉