基于Linux的Socket网络编程的性能优化-基础电子_第1页
基于Linux的Socket网络编程的性能优化-基础电子_第2页
基于Linux的Socket网络编程的性能优化-基础电子_第3页
基于Linux的Socket网络编程的性能优化-基础电子_第4页
基于Linux的Socket网络编程的性能优化-基础电子_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

精品文档-下载后可编辑基于Linux的Socket网络编程的性能优化-基础电子1引言

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

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

使用Socket编程时可以开发客户机和服务器应用程序,它们可以在本地网络上进行通信,也可以通过Internet在范围内进行通信。编写并运行Socket的客户端和服务器端程序,双方通过套接字建立了服务连接请求,并且通过一些方法提高Socket的性能。

3Socket编程

3.1Socket类型

常见的Socket有3种类型:

(1)流式Socket(SOCK_STREAM)它提供可靠的通信流,使用面向连接的TCP协议,从而保证数据传输的正确性和顺序性:

(2)数据报Socket(SOCK_DGRAM)数据通过相互独立的报文进行传输,是无序的,并且不保证可靠,无差错,它定义一种面向无连接的服务,使用数据报协议UDP;

(3)原始Socket(SOCK_RAM)它允许直接访问底层协议,功能强大但使用较为不便,主要用于一些协议的开发。本编写的Socket属于流式Socket。

3.2Socket编程流程

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,执行编译指令生成可执行文件。

其指令为:

#gccserv.c=0serv

#gccclt.c-0clt

编译没有错误则会生成可执行文件serv和clt。

(2)配置服务器和客户端的IP,保证网络畅通,在serv.c中已将服务器的IP设置为:192.168.2.111。在客户端的“网络设置”中设置IP为:192.168.2.22,可以通过ping命令检测网络是否畅通。

(3)在一台计算机的终端先运行服务器程序(./serv),再在客户端的计算机终端上运行客户端程序(./clt192.:168.2.1l1)就会看到结果(Hello,WangLei!Youareconnected!);运行结果如图4和图5所示。如果未运行服务器程序而先运行客户端程序将立即提示“Connect:Connectionrefused”。

4SOCket的性能优化

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化报文传输的延时

通过TCPsocket进行通信时,数据都被拆分成数据块,这样它们就可以封装到给定连接的TCPpayload(指TCP数据包中的有效负荷)中。TCPpayload的大小取决于几个因素(如报文长度和路径),为了达到较好的性能,应使用尽可能多的可用数据来填充每个报文。当没有足够的数据来填充payload时(也称为报文段长度maximumsegmentsize或MSS),TCP将采用Nagle算法自动将一些小缓冲区连接到一个报文段中。这样可以通过化所发送的报文的数量来提高应用程序的效率,并减轻整体的网络拥塞。

由于这种算法对数据进行合并,试图构成一个完整的TCP报文段,因此会引入一些延时。Socket网络传输很长时间只发送一些较小的报文,比如telnet程序,它让用户可以与远程系统进行交互,通常通过一个shell来进行,如果用户被要求用发送报文之前输入的字符来填充某个报文段,该方法不能满足需要。再比如HTTP协议,通常客户机浏览器会产生一个小请求(一条HTTP请求消息),然后Web服务器就会返回一个更大的响应(Web页面)。化传输延时是首要的。在这种情况中,Socket可以提供一种解决方案,即禁用Nagle算法,可设置TCP_NODELAYsocket选项TCPsocket禁用Nagle算法。

使用Samba的实验表明,在服务器上的Samba驱动器上读取数据时,禁用Nagle算法几乎可以加倍提高读性能。

4.3为BandwidthDelayProduct调节TCP窗口

TCP的性能取决于几方面因素,重要的是链接带宽(linkbandwidth)(报文在网络上传输的速率)和往返时间(round-triptime)或RTT(发送报文与接收到另一端的响应之间的延时)。这两个值确定称为BDP(BandwidthDelayProd-uct)的内容。BDP给出一种简单的方法计算理论上的TCPSocket缓冲区大小(其中保存排队等待传输和等待应用程序接收的数据)。缓冲区太小,TCP窗口就不能完全打开,这会限制性能;缓冲区太大,则会浪费宝贵的内存资源;设置的缓冲区大小合适,就可完全利用可用带宽。

BDP计算公式:

BDP=linkbandwidth×RTT

若应用程序通过一个100MB/s的局域网通信,其RRT为500ms,则BDP为:50MB/sx0.050/8625M=625KB。Linux2.6默认的TCP窗口大小是110KB,这将连接的带宽限制为22M/S,计算方法如下:

throughput=window_size/RTT

110KB/0.050=2.2MB/s

使用上面计算的窗口大小,得到带宽为12.5MB/s,即:

625KB/0050=12.5MB/s

差别很大,并且可以为Socket提供更大的吞吐量。可以根据自己的Socket计算的缓冲区大小。Socket提供几个Socket选项,其中两个可以用于修改Socket的发送和接收缓冲区的大小。使用SO_SNDBUF和SO_RCVBUF选项来调整发送和接收缓冲区的大小。

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

5结束语

设计和实现一个基于Linux的Socket网络编程,通过在服务器端运行预先编译的可执行文件serv,和在客户端运行预先编译的可执行文件clt,服务器端和客户端建立通信连接。加入select()函数以后,服务器端可以允许多个客户端

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论