基于Linux的Socket网络编程的性能优化
发布日期:2011-04-11
1 小序
随着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的发送和吸取缓冲区的大小,完全利用可用的带宽。到达较好的网络传输结果。实际网络传输环境巨大多变,怎样到达最抱负的网络传输,还需进一步的阐发和研究。