基于Linux的Socket网络编程的性能优化.pdf
-
资源ID:70014558
资源大小:201.43KB
全文页数:3页
- 资源格式: PDF
下载积分:15金币
快捷下载
会员登录下载
微信登录下载
三方登录下载:
微信扫一扫登录
友情提示
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
|
基于Linux的Socket网络编程的性能优化.pdf
第1 7 卷第9 期V 0 1 1 7N o 9电子设计工程E l e c t r o n i cD e s i g nE n g i n e e r i n g2 0 0 9 年9 月S e p t 2 0 0 9基才L i n u x 的S o c k e t 网络编程的性能优化王雷1 王子淘2(1 太原理工大学信息和通信工程学院。山西太原0 3 0 0 2 4;2 天津大学计算机学院,天津3 0 0 0 7 2)摘要:介绍在L i n u x 操作系统环境下S o c k e t 网络编程的原理、流程和最终实现。编程采用客户端服务器模式。提出解决多个客户端连接服务器时无法处理!O 多路复用问题的方法。提出通过最小化报文传输来减少传输时延,为B a n d w i d t hD e l a yP r o d u c t 调节T C P 窗口。实现充分利用带宽提高L i n u x 的S o c k e t 性能。在实际网络传输环境复杂多变的情况下。达到优化网络传榆性能的目的。关键词:L i n u x;性能优化;S o c k e t;s e l e c t()中图分类号:7 r P 3 9 3 0 9文献标识码:A文件编号:1 6 7 4 6 2 3 6(2 0 0 9)0 9-0 1 0 1-0 3P e r f o r m a n c eo p t i m i z a t i o no fS o c k e tn e t w o r kp r o g r a m m i n gb a s e do nL i n u xW A N GL e i l,W A N GZ i-t a 0 2(1 S c h o o lo f I n f o r m a t i o na n dC o m m u n i c a t i o nE n g i n e e r i n g,T a i y u a nU n i v e r s 蚵o fT e c h n o l o g y,T a i y u a n0 3 0 0 2 4,C h i n a,-2 S c h o o lo f C o m p u t e r,T i a n j i nU n i v e r s i t y,T i a n j i n3 0 0 0 7 2,C h i n a)A b s t r a c t:T h i sp a p e rd e s c r i b e st h ep r i n c i p l ep r o c e s sa n du l t i m a t eo fs o c k e tn e t w o r kp r o g r a m m i n gi nt h ee n v i r o n m e n to fL i n u x T h ep r o g r a m m i n ga d o p t sC l i e n t S e r v e rm o d e,i ts h o w sam e t h o dt os o l v et h ep r o b l e mt h a ti su n a b l et od e a lw i t hm u l-t i p l e x i n go fI Ow h e ns e v e r a lc l i e n t sc o n n e c tt os e r v e ra tt h es a m et i m e T h i sp a p e rp r o p o s e st oi m p r o v et h ep e r f o r m a n c eo fS o c k e tb a s e do nL i n u xb ym i n i m i z i n gm e s s a g et r a n s m i s s i o nt or e d u c et h ed e l a y,a n da d j u s t sT C Pw i n d o wf o rB a n d w i d t hD e l a yP r o d u c tt om a k ef u l lu s eo fb a n d w i d t h A tl a s t,w ea c h i e v et h ep u r p o s eo fp e r f o r m a n c eo p t i m i z a t i o no fn e t w o r ki nm o r ec o m p l e x i t yn e t w o r ke n v i r o n m e n t K e yw o r d s:L i n u x;p e r f o r m a n c eo p t i m i z a t i o n;S o c k e t;s e l e c t()1 引言随着I n t e m e t 的日益发展和普及网络在嵌入式系统中应用非常广泛,越来越多的嵌入式设备采用L i n u x 操作系统。L i n u x 是一个源代码公开的免费操作系统,具有强移植性,所以对基于L i n u x 的S o c k e t 网络编程的研究越来越重要。2S o c k e t 简介在L i n u x 中的网络编程通过S o c k e t 接1 3 进行是一种特殊的I O,也是一种特殊的文件描述符。S o c k e t 是使用标准L i n u x 文件符(f i l ed e s c r i p t o r)和其他程序通信的方式。这里S o c k e t 编程采用客户服务器模式如图l 所示。匪巫口匝互囵图l 客户端,服务器模式S o c k e t 实际是网络传输层供给应用层的编程接口。传输层则在网络层的基础上提供进程到进程间的逻辑通道而应用层的进程则利用传输层向另一台主机的某一进程通信。S o c k e t 就是应用层与传输层之间的桥梁。如图2 所示。S e r y e rC l i e n t应用层l f s。k e t传输层网络屡数据铹路层物理层应用层l f s o c k。t传输层网络层数据锚路层物理层图2S o c k e t 是应用层与传输层之间的桥梁使用S o c k e t 编程时可以开发客户机和服务器应用程序,它们可以在本地网络上进行通信。也可以通过I n t e r a c t 在全球范围内进行通信。编写并运行S o c k e t 的客户端和服务器端程序,双方通过套接字建立了服务连接请求,并且通过一些方法提高S o c k e t 的性能。3S o c k e t 编程3 1S o c k e t 类型常见的S o c k e t 有3 种类型1 2 1:(1)流式S o c k e t(S O C K-s 1 R E A M)它提供可靠的通信流。使用匝向连接的T C P 协议从而保证数据传输的正确性和顺序性:收稿日期:2 0 0 9-0 4 1 7m t q m 号-:2 0 0 9 0 4 0 4 0(2)数据报S o c k e t(S O C K _ D G R A M)数据通过相互独立作者简介:王雷(1 9 8 4 一),男。江苏徐州人,硕士研究生。研究方向:嵌入式流媒体技术。1 0 1-万方数据电子设计工程 2 0 0 9 年第9 期的报文进行传输,是无序的,并且小保证i r 靠,无差错,它定义一种面向无连接的服务,使用数据报胁议U D P;(3)原始S o c k e t(S O C K _ R A M)它允许直接访问底层协议,功能强大但使用较为不便,主要用于一些协议的开发。本编写的S o c k e t 属于流式S o c k e t。3 2S o c k e t 编程流程S o c k e t 编程采用客户朋艮务器模式 3 1。因此编程分为服务器端和客户端两部分。每一个S o c k e t 都用一个半相关描述(协议,本地地址,本地端口)来表示S o c k e t 也有一个类似于文件打开的函数该函数返回一个整型的S o c k e t 描述符,随后建立连接,数据传输等操作都通过S o c k e t 来实现。编程流程如下:服务器端首先建立S o c k e t,返回该S o c k e t的描述符;配置S o c k e t 的端口和I P 地址;建立监听函数,检测是否有客户端向服务器发送请求,若有则接收该请求。将其放到接收队列中;从接收队列中接受一个请求:并向客户端发送确认连接信息。客户端建屯一个S o c k e t 返回该S o c k e t 的描述符:配置S o c k e t 端口和I P 地址;向服务器发送连接请求,并接收服务器发回的确认连接信息。双方通信结束后,关闭其S o c k e t。进行S o c k e t 编程的基本函数有s o c k e t(),b i n d(),l i s t e n(),a c c e p t(),c o n n e c t(),s e n d(),r e c v(),c l o s e(o 图3 为S o c k e t 的编程流程图。服务器端S o c k e t()建立流式套接字客户端B i n d()S 建立流式套接字接I 字Il 目B 置本地端口和I PL is t e l l()I l 配置本地的端口和)口和I Pl 监听和接收服务器请求l 接受版瓣娃连接H 与霈刍妥姿接lR e c v()和S e n d()卜_ 叫S e n d()和R e c v()ll 接收信息和发送信息I*-l 发送信息和接收信息lC I o s eIc l o s e关闭套接字l关闭套接字图3S o c k e t 编程流程图3 3 程序的编译和运行结果(1)在L i n u x 的V I 编辑器下编写服务器端程序s e r v c 和客户端程序c l t C。运用交叉编译T 具a r n l 1 i n u x g c c l 4 I。执行编译指令生成可执行文件。其指令为:#g c cs e r v c-os e r v#g c cc h C-Oc l t编译没有错误则会生成可执行文件s e r v 和c l t。(2)配置服务器和客户端的I P。保证网络畅通,在s e n r c中已将服务器的I P 设置为:1 9 2 1 6 8 2 1 l l。在客户端的“网络设置”中设置I P 为:1 9 2 1 6 8 2 2 2,可以通过p i n g 命令检测网络是否畅通。(3)在一台计算机的终端先运行服务器程序(s e r v),再1 0 2-在客户端的计算机终端上运行客户端程序(c I t1 9 2 1 6 8 2 1 1 1)就会看到结果(H e l l o,W a n gL e i!Y o ua r ec o n n e c t e d!):运行结果如网4 和图5 所示。如果未运行服务器程序而先运行客户端程序将立即提示“C o n n e c t:C o a n e c t i o nr e f u s e d”。r o o t w lw 1 8 0 1】#s e r 7r e c e i r e daC O n O C C t i o nf r o m1 9 2 1 6 8 2 2 2图4 服务器端运行结果【r o o t z h a n g k u n p e n g】#e l t1 9 2 16 8 2 1 1 1R e c e i r e d:l t e l1 0 W a n g L e i!Y o ua r ec o,f l e e t e d!图5 客户端运行结果4S o c k e t 的性能优化4 1 解决多路复用上面的运行过程仅实现了一个客户端接入在实际情况中。人们往往遇到多个客户端连接服务器端的情况。由于c o n n e c t(),r e c v(),s e n d()都是阻塞性函数。若资源没有准备好,则调用该函数的进程将进入睡眠状态无法处理I O 多路复用。在服务器端的s e r v e 中加入s e l e c t()函数它可同时监听多个套接字,实现I,0 的多路复用。其函数原型如下:#i n c l u d e;#i n c l u d e;i n ts e l e c t(i n tn u m f d s,f d _ s e t*r e a d f d s,f d _ s e t*w r i t e f d s,f d _ s e t 4 e x c e p f f d s,s t r u c tt i m e v a l*t i m e o u t);该函数监视一系列文件描述符特别是r e a d f d s、w r i t e f d s和e x e e p f f d s。如果想知道是否能从标准输入和套接字描述符s o c k f d 读人数据,只要将文件描述符0 和“s o c k f d”加入集合r e a d f d s 中。参数n u m f d s 应等于最高文件描述符的值加1。设置该值为s o c k f d+l。因为它一定大于标准输入的文件描述符“0”。当函数s e l e c t()返同时。r e a d f d s 的值修改为反映选择的哪个文件描述符可读。重新编译和运行客户端的程序后,服务器端允许多个客户端接入,服务器端运行结果如图6 所示。r o o t w lw 1 8 0 1】#s e r vr e c ei r e dac o l l f i e c ti 0 1 1f r o m1 9 2 1 6 8 2 2 2r e c e i v e dac o n n e c t i o nfr o m1 9 2 1 6 8 2 12 3图6服务器端运行结果4 2 最小化报文传输的延时通过T C Ps o c k e t 进行通信时数据都被拆分成数据块,这样它们就可以封装到给定连接的T C Pp a y r l o a d(指T C P 数据包中的有效负荷)中。T C Pp a y l o a d 的大小取决于几个因素(如最大报文长度和路径),为了达到较好的性能,应使用尽可能多的可用数据来填充每个报文。当没有足够的数据来填充p a y l o a d 时(也称为最大报文段长度m a x i m u ms e g m e n ts i z e或M S S)。T C P 将采用N a g l e 算法自动将一些小缓冲区连接到一个报文段中。这样可以通过最小化所发送的报文的数量来提高应用程序的效率,并减轻整体的网络拥塞。由于这种算法对数据进行合并试图构成一个完整的T C P 报文段。因此会引入一些延时。S o c k e t 网络传输很长时间只发送一些较小的报文,比如t e l n e t 程序。它让用户可以与万方数据王雷,等基于L i n u x 的S o c k e t 网络编程的性能优化远程系统进行交互,通常通过一个s h e l l 来进行,如果用户被要求用发送报文之前输入的字符来填充某个报文段,该方法绝对不能满足需要。再比如H r r P 协议,通常客户机浏览器会产生一个小请求(一条H r I T I P 请求消息),然后W e b 服务器就会返回一个更大的响应(W e b 页面)。最小化传输延时是首要的。在这种情况中S o c k e t 可以提供一种解决方案即禁用N a g l e 算法1 5 1 可设置T C P _ N O D E L A Ys o c k e t 选项T C Ps o c k e t禁用N a g l e 算法。i n ts o c k,f l a g,r e t;净C r e a t en e ws t r e a ms o c k e t|s o c k=s o c k e t(A F _ I N E T,S O C K _ S T R E A M,0);pD i s a b l et h eN a g l e(T C PN oD e l a y)a l g o r i t h m 宰,f l a g=l:陀t=s e t s o c k o p t(s o c k,I P P R O T O _ T C P,T C P j V O D E L A Y,(c h a r8)&f l a g,s i z e o f(f l a g);i f(m t=一1)lp f i n f f(”C o u l d n 7ts e t s o c k o p t(T C P _ N O D E L A Y)n”):e x i t(-1);l使用S a m b a 的实验表明,在服务器上的S a m b a 驱动器上读取数据时,禁用N a g h 算法几乎可以加倍提高读性能。4 3 为B a n d w i d t hD e l a yP r o d u c t 调节T C P 窗口T C P 的性能取决于几方面因素最重要的是链接带宽(1 i n kb a n d w i d t h)(报文在网络上传输的速率)和往返时间(r o u n d t r i pt i m e)或R 1,I (发送报文与接收到另一端的响应之间的延时)。这两个值确定称为B D P(B a n d w i d t hD e l a yP r o d u e t)的内容。B D P 给出一种简单的方法计算理论上最优的T c PS o c k e t 缓冲大小(其中保存排队等待传输和等待应用程序接收的数据)。缓冲太小,T C P 窗1 3 就不能完全打开,这会限制性能;缓冲区太大则会浪费宝贵的内存资源:设置的缓冲区大小合适。就可完全利用可用带宽。B D P 计箅公式:B D P=l i n kb a n d w i d t h R 1 叩若应用程序通过一个1 0 0 M B s 的局域网通信,其R R T 为5 0 0 m s。则B D P 为:5 0 M 蝴5 0 娟6 2 5 M B-6 2 5 K B。L i n u x 2 6 默认的T C P 窗口大小是1 1 0 K B,这将连接的带宽限制为2 2 M B 岛计算方法如下:t h r o u g h p u t=w i n d o w _ s i z e R T r11 0K B 0 0 5 0=2 2M B 8使用上面计算的窗口大小,得到带宽为1 2 _ 5M 跳即:差别很大,并且可以为S o c k e t 提供更大的吞吐量。可以根据自己的S o c k e t 计算最优的缓冲区大小。S o c k e t 提供几个S o c k e t 选项。其中两个可以用于修改S o c k e t 的发送和接收缓冲区的大小。使用S O _ S N D B U F 和S O _ R C V B U F 选项来调整发送和接收缓冲区的大小。i n tr e t,s o c k,s o c k _ b u f _ s i z e;s o c k=s o c k e t(A F _ I N E T,S O C K _ S T R E A M,0);s o c k _ b u f _ s i z e=B D P:l e t=s e t s o c k o p t(s o c k,S O L-s O C K E T,S O _ S N D B U F,(c h a r)&s o c k b u f s i z e,s i z e o f(s o c k _ b u f _ s i z e);l e t=s e t s o c k o p t(s o c k,S O L-_ s O C K E T,S O _ R C V B U F,(c h a r+)&s o c k _ b u f _ s i z e,s i z e o f(s o c k _ b u f _ s i z e);在L i n u x2 6 内核中发送缓冲区的大小由调用用户定义。而接收缓冲区会自动加倍。通过计算合理设置缓冲区的大小。S o c k e t 网络传输带宽的资源将得到充分利用,从而提高了传输性能。5 结束语设计和实现一个基于L i n u x 的S o c k e t 网络编程通过在服务器端运行预先编译的可执行文件s e r v,和在客户端运行预先编译的可执行文件c l t 服务器端和客户端建立通信连接。加入s e l e c t()函数以后。服务器端可以允许多个客户端接入服务器端,解决了I O 多路复用问题,更加接近实际应用。利用r C Ps o c k e t 禁用N a g l e 算法实现了最小化报文传输的延时,提高了S o c k e t 的性能。在网络带宽非常珍贵的现实中。提出了为B a n d w i d t hD e l a yP r o d u c t 调节T C P 窗1 3 修改s o c k e t 的发送和接收缓冲区的大小完全利用可用的带宽。达到较好的网络传输效果。实际网络传输环境复杂多变。如何达到最理想的网络传输,还需进一步的分析和研究。参考文献:【I】陈莉君,康华L i n u x 操作系统原理和应用【M】北京:清华大学出版社。2 0 0 6【2】孙琼嵌入式L i n u x 应用程序开发详解f M】北京:人民邮电出版社2 0 0 6【3 1B r u c eM o l a y U n d e r s t a n d i n gu n i x L i n u xp m g r a n n n i n g【M】北京:清华大学出版2 0 0 4【4】韦东山嵌入式L i n u x 应用开发完全手册【M】北京:人民邮电出版社2 0 0 8【5】高波L i n u x 网络编程【M】北京:清华大学出版社。2 0 0 0【6】李会艳,胡荣强基于嵌入式L i n u x 2 4 1 8 的C S 8 9 0 0 A 网卡6 2 5K B 0 0 5 0=1 2 5M B s驱动的实现叨电子设计-a S,2 0 0 7,1 5(1 2):5 8-6 1 欢迎订阅2 0 1 0 年度电子设计工程(月刊)国内邮发代号:5 2-1 4 2联系电话:0 2 9 8 8 2 2 2 9 9 l国际发行代号:M 2 9 9 68 8 2 2 2 9 9 2订价:6 0 0 元期7 2 0 0 元年传真:0 2 9-8 8 2 1 4 5 6 3-1 0 3-万方数据