电子发烧友网 > 通信网络 > 通信设计应用 > 正文

基于Linux的Socket网络编程的性能优化

2009年10月22日 20:48 次阅读

基于Linux的Socket网络编程的性能优化

随着Intenet的日益发展和普及,网络在嵌入式系统中应用非常广泛,越来越多的嵌入式设备采用Linux操作系统。Linux是一个源代码公开的免费操作系统,具有强移植性,所以对基于Linux的Socket网络编程的研究越来越重要。

    Socket实际是网络传输层供给应用层的编程接口。传输层则在网络层的基础上提供进程到进程问的逻辑通道,而应用层的进程则利用传输层向另一台主机的某一进程通信。Socket就是应用层与传输层之间的桥梁。如图2所示。

    使用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的编程流程图。


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的多路复用。
    其函数原型如下:
  

    该函数监视一系列文件描述符,特别是readfds、writefds和exceptfds。如果想知道是否能从标准输入和套接字描述符sockfd读入数据,只要将文件描述符“0”和“sockfd”加入集合readfds中。参数numfds应等于最高文件描述符的值加1,设置该值为sockfd+ 1。因为它一定大于标准输入的文件描述符“0”。当函数select()返回时,readfds的值修改为反映选择的哪个文件描述符可读。重新编译和运行客户端的程序后,服务器端允许多个客户端接入,服务器端运行结果如图6所示。

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算法。

  
    使用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选项来调整发送和接收缓冲区的大小。

  
    在Linux 2.6内核中.发送缓冲区的大小由调用用户定义,而接收缓冲区会自动加倍。通过计算合理设置缓冲区的大小,Socket网络传输带宽的资源将得到充分利用,从而提高了传输性能。

5 结束语
    设计和实现一个基于Linux的Socket网络编程,通过在服务器端运行预先编译的可执行文件serv,和在客户端运行预先编译的可执行文件clt,服务器端和客户端建立通信连接。加入select()函数以后,服务器端可以允许多个客户端接入服务器端,解决了I/O多路复用问题,更加接近实际应用。利用TCP socket禁用Nagle算法实现了最小化报文传输的延时,提高了Socket的性能。在网络带宽非常珍贵的现实中。提出了为Bandwidth Delay Product调节TCP窗口,修改socket的发送和接收缓冲区的大小,完全利用可用的带宽。达到较好的网络传输效果。实际网络传输环境复杂多变,如何达到最理想的网络传输,还需进一步的分析和研究。

技术专区

关注电子发烧友微信

有趣有料的资讯及技术干货

下载发烧友APP

打造属于您的人脉电子圈

关注发烧友课堂

锁定最新课程活动及技术直播
收藏 人收藏
分享:

评论

相关推荐

一切皆Socket!Socket是什么?

socket函数对应于普通文件的打开操作。普通文件的打开操作返回一个文件描述字,而socket()用...

发表于 2018-03-30 13:59 131次阅读
一切皆Socket!Socket是什么?

Socket采用C/S模型进行设计的服务器模型

数据报套接字定义了一种无连接的服务。所谓无连接服务,简单来说,即在发送数据时,无需在收发两端建立类似...

发表于 2018-03-24 11:20 1256次阅读
Socket采用C/S模型进行设计的服务器模型

嵌入式Linux下的Socket CAN驱动理解

CAN是ControllerArea Network(控制器局域网)的缩写。CAN通信协议在1986...

发表于 2018-03-23 11:43 354次阅读
嵌入式Linux下的Socket CAN驱动理解

网络数据传输socket和http优缺点

超文本传输协议是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。网络上的两个...

发表于 2018-02-06 16:06 1060次阅读
网络数据传输socket和http优缺点

基于Socket的java通信编程详解

Java最初是作为网络编程语言出现的,其对网络提供了高度的支持,使得客户端和服务器的沟通变成了现实,...

发表于 2017-12-28 17:37 201次阅读
基于Socket的java通信编程详解

socket是什么意思_socket编程是什么意...

从编程语言的角度,socket是一个无符号整型变量,用来标识一个通信进程。两个进程通信,总要知道这几...

发表于 2017-12-28 17:21 321次阅读
socket是什么意思_socket编程是什么意...

AliOS Things网络适配框架 - SAL

发表于 2017-12-26 17:36 189次阅读
AliOS Things网络适配框架 - SAL

udp的socket是怎样实现数据传输

UDP: User Datagram Protocol的简称, 中文名是用户数据包协议,是 OSI ...

发表于 2017-12-08 09:38 436次阅读
udp的socket是怎样实现数据传输

基于Linux操作系统的电子收款机税源数据采集...

税收是国家财政的重要组成部分,但是在税收领域依法纳税意识淡薄,偷税逃税现象依然比较严重,尤其是对财...

发表于 2017-12-02 07:44 158次阅读
 基于Linux操作系统的电子收款机税源数据采集...

嵌入式编程常见的3种socket接口类型解析

在Linux中的网络编程是通过socket接口来进行的,是一种文件描述符。socket也有一个类似于...

发表于 2017-11-02 05:36 2464次阅读
嵌入式编程常见的3种socket接口类型解析

工厂加工定制直销主板连接器 CPU SOCKET PGA 478 ​​​​

发表于 2017-09-29 15:40 547次阅读
工厂加工定制直销主板连接器 CPU SOCKET PGA 478 ​​​​

Socket 370插槽

Socket 370插槽        ...

发表于 2009-12-24 13:53 231次阅读
Socket 370插槽

Socket 423插槽

Socket 423插槽        ...

发表于 2009-12-24 13:53 222次阅读
Socket 423插槽

Socket 478插槽

Socket 478插槽        ...

发表于 2009-12-24 13:51 194次阅读
Socket 478插槽

Socket 603

Socket 603        &n...

发表于 2009-12-24 13:50 274次阅读
Socket 603

Socket AM2

Socket AM2        &n...

发表于 2009-12-24 13:49 291次阅读
Socket AM2

Socket 479

Socket 479        &n...

发表于 2009-12-24 13:49 438次阅读
Socket 479

Socket S1

Socket S1        &nb...

发表于 2009-12-24 13:47 568次阅读
Socket S1

Socket F

Socket F        ...

发表于 2009-12-24 13:47 302次阅读
Socket F

Socket 604

Socket 604      &nbs...

发表于 2009-12-24 13:46 203次阅读
Socket 604

Socket 771

Socket 771      &nbs...

发表于 2009-12-24 13:44 221次阅读
Socket 771

Socket 940

Socket 940       &nb...

发表于 2009-12-24 13:43 251次阅读
Socket 940

Socket 775

Socket 775 Socket 775又称为Socket T,目前采用此种插槽的有LGA7...

发表于 2009-12-24 13:42 417次阅读
Socket 775

Socket 939

Socket 939 Socket 939是AMD公司2004年6月才发布的64位桌面平台插槽标准...

发表于 2009-12-24 13:41 320次阅读
Socket 939

Socket 754

Socket 754 Socket 754是2003年9月AMD64位桌面平台最初发布时的标准插槽...

发表于 2009-12-24 13:40 229次阅读
Socket 754

Socket 939插槽CPU是什么

Socket 939插槽是什么 Socket 939是AMD公司2004年6月才发布的64位桌面平...

发表于 2009-04-26 09:10 1049次阅读
Socket 939插槽CPU是什么

Socket 7插槽是什么

Socket 7插槽是什么 Socket 7:Socket在英文里就是插槽的意思,Socket 7...

发表于 2009-04-26 09:09 310次阅读
Socket 7插槽是什么

SLOT A接口

SLOT A接口 SLOT A接口类似于英特尔公司的SLOT 1接口,供AMD公司的K7 Athl...

发表于 2009-04-26 09:08 398次阅读
SLOT A接口

SLOT 2插槽是什么

SLOT 2插槽是什么 SLOT 2用途比较专业,都采用于高端服务器及图形工作站的系统。所用的CP...

发表于 2009-04-26 09:07 550次阅读
SLOT 2插槽是什么

SLOT 1插槽是什么

SLOT 1插槽是什么 SLOT 1是英特尔公司为取代Socket 7而开发的CPU接口,并申请的...

发表于 2009-04-26 09:07 1165次阅读
SLOT 1插槽是什么

Socket 370插槽是什么

Socket 370插槽是什么 Socket 370架构是英特尔开发出来代替SLOT架构,外观上与...

发表于 2009-04-26 09:06 306次阅读
Socket 370插槽是什么

Socket 423插槽是什么

Socket 423插槽是什么 Socket 423插槽是最初Pentium 4处理器的标准接口,...

发表于 2009-04-26 09:06 309次阅读
Socket 423插槽是什么

Socket A插槽是什么

Socket A插槽是什么 Socket A接口,也叫Socket 462,是目前AMD公司Ath...

发表于 2009-04-26 09:05 420次阅读
Socket A插槽是什么

Socket 478插槽是什么

Socket 478插槽是什么 Socket 478插槽是目前Pentium 4系列处理器所采用的...

发表于 2009-04-26 09:04 445次阅读
Socket 478插槽是什么

Socket 604是什么

Socket 604是什么 与Socket 603相仿,Socket 604仍然是应用于Intel...

发表于 2009-04-26 09:03 265次阅读
Socket 604是什么

Socket 603是什么

Socket 603是什么 Socket 603的用途比较专业,应用于Intel平...

发表于 2009-04-26 09:03 403次阅读
Socket 603是什么

Socket 940是什么

Socket 940是什么 Socket 940是最早发布的AMD64位平台标准,具有940个CP...

发表于 2009-04-26 09:03 269次阅读
Socket 940是什么

Socket 939是什么意思

Socket 939是什么意思 Socket 939是AMD公司2004年6月才发布的64位桌面平...

发表于 2009-04-26 09:02 649次阅读
Socket 939是什么意思

Socket 754是什么

Socket 754是什么 Socket 754是2003年9月AMD64位桌面平台最初发布时的标...

发表于 2009-04-26 09:01 303次阅读
Socket 754是什么

Socket 775是什么?Socket T介绍

Socket 775是什么 Socket 775又称为Socket T,目前采用此种插槽的有LGA...

发表于 2009-04-26 09:01 638次阅读
Socket 775是什么?Socket T介绍

Socket 479是什么

Socket 479是什么 Socket 479的用途比较专业,是2003年3月发布的Intel移...

发表于 2009-04-26 08:59 379次阅读
Socket 479是什么

Socket 771是什么

Socket 771是什么 Socket 771是Intel2005年底发布的双路服务器/工作站C...

发表于 2009-04-26 08:59 480次阅读
Socket 771是什么

Socket F是什么

Socket F是什么 Socket F是AMD于2006年第三季度发布的支持DDR2内存的AMD...

发表于 2009-04-26 08:58 261次阅读
Socket F是什么

Socket S1是什么

Socket S1是什么 Socket S1是2006年5月底发布的支持DDR2内存的AMD64位...

发表于 2009-04-26 08:58 559次阅读
Socket S1是什么

Socket AM2是什么?

Socket AM2是什么? Socket AM2是2006年5月底发布的支持DDR2内存的AMD...

发表于 2009-04-26 08:57 816次阅读
Socket AM2是什么?