一种socket网络通信的优化方法、系统及介质与流程
- 国知局
- 2024-11-21 11:53:04
本发明涉及socket(套接字)网络通信的优化,具体涉及一种socket网络通信的优化方法、系统及介质。
背景技术:
1、linux系统随着技术的发展,已经在各大领域占据着重要的地位,特别是在工控、服务器、金融、安防等领域行业。而网络通信作为数据传输提供了不可或缺的一种技术,而网络通信的速率、低延迟、大吞吐量则作为网络通信质量好坏的重要标准。socket(套接字)是一种用于网络通信的编程接口,它提供了一种机制,使不同计算机上或同一台计算机的进程(或线程)能够通过网络进行通信和交换数据。目前linux系统在socket网络通信上,对于网络小包的发送处理并不优秀,导致网络的速率和吞吐量较低,从而影响了网络的传输速率,目前是通过linux的内核驱动底层的提供nagle算法来对网络小包的优化,但其网络通信速率和吞吐量还是非常低效。网络小包指的是在tcp协议(transmission controlprotocol,传输控制协议)中传输的较小的数据包,网络小包通常指的是数据包的大小相对于mtu(maximum transmission unit,mtu)较小的数据包,当数据包的大小较小时,tcp协议可能会出现较高的开销、延迟增加以及未充分利用网络带宽等问题。
2、nagle算法是一种用于改善网络传输效率的算法,它在tcp协议中起作用。该算法的目标是减少网络上的小数据包数量,以提高网络的吞吐量和效率。nagle算法对于小包的处理,且是在tcp协议层进行处理,如果需要基于nagle算法进行优化,则需要修改内核代码,或者调整nagle算法对外提供的系统参数。这种调优的方法对于大多数linux系统的使用者来说是很困难的,大多数使用者并不熟悉网络协议,也不熟悉nagle算法的底层原理。此外,也可以通过调整传输队列缓冲(tx queue buff,用于存储待发送数据的缓冲区,用于在网络上排队等待发送的数据包)的缓存区大小来达到可以在底层缓冲更多的网络数据包,调整网卡的传输速率等来优化网络通信,这些优化措施对于不熟悉linux内核开发、不熟悉网络协议栈和网卡驱动人员带来极大的困难。
技术实现思路
1、本发明要解决的技术问题:针对现有技术的上述问题,提供一种socket网络通信的优化方法、系统及介质,本发明旨在不修改linux系统的nagle算法、linux网卡驱动、不调整网络通信参数、不修改原有socket网络通信的应用程序的基础上达到网络通信优化的目的。
2、为了解决上述技术问题,本发明采用的技术方案为:
3、一种socket网络通信的优化方法,包括下述步骤:
4、s1,采用hook技术拦截socket网络编程接口函数的调用;
5、s2,利用重写的socket网络编程接口函数结合应用层提供的数据包重组算法将数据包在应用层重组后再发送到内核层、而不是立即发送到linux内核协议栈的传输队列缓冲中以优化socket网络通信的发送速率和吞吐量。
6、可选地,步骤s1中采用hook技术拦截socket网络编程接口函数的调用包括采用hook技术拦截服务端的接受连接请求函数accept、写函数write和发送数据函数sendto的调用,步骤s2中重写的socket网络编程接口函数包括接受连接请求函数accept、写函数write和发送数据函数sendto,其中重写的接受连接请求函数accept执行的步骤包括:
7、s101,获取服务端的接受连接请求函数accept的调用中的文件描述符socket_fd;
8、s102,根据文件描述符socket_fd判断当前的socket网络通信的协议类型为tcp协议或uds协议,若为tcp协议则判断是否已开启nagle算法,若已开启nagle算法则跳转步骤s103;若为uds协议则跳转步骤s103;
9、s103,把文件描述符socket_fd插入到初始化好的文件描述符链表fd_list中;
10、其中重写的写函数write用于提取输入参数中的文件描述符参数fd,若文件描述符参数fd和在接受连接请求函数accept插入的文件描述符链表fd_list中的文件描述符socket_fd对比且匹配后,则把需要写入的数据包在应用层利用重组算法进行重组后发送到内核层、而不是立即发送到linux内核协议栈的传输队列缓冲中以优化socket网络通信的发送速率和吞吐量;
11、其中重写的发送数据函数sendto用于提取输入参数中的文件描述符参数fd,若文件描述符参数fd和在接受连接请求函数accept插入的文件描述符链表fd_list中的文件描述符socket_fd对比且匹配后,则把需要发送的数据包在应用层利用重组算法进行重组后发送到内核层、而不是立即发送到linux内核协议栈的传输队列缓冲中以优化socket网络通信的发送速率和吞吐量。
12、可选地,步骤s1中采用hook技术拦截socket网络编程接口函数的调用包括采用hook技术拦截客户端的创建连接请求函数connect、写函数write和发送数据函数sendto的调用,步骤s2中重写的socket网络编程接口函数包括创建连接请求函数connect、写函数write和发送数据函数sendto,其中重写的创建连接请求函数connect执行的步骤包括:
13、s201,获取客户端的创建连接请求函数connect的调用中的文件描述符socket_fd;
14、s202,根据文件描述符socket_fd判断当前的socket网络通信的协议类型为或uds协议,若为tcp协议则判断是否已开启nagle算法,若已开启nagle算法则跳转步骤s103;若为uds协议则跳转步骤s103;
15、s203,把文件描述符socket_fd插入到初始化好的文件描述符链表fd_list中;
16、其中重写的写函数write用于提取输入参数中的文件描述符参数fd,若文件描述符参数fd和在创建连接请求函数connect插入的文件描述符链表fd_list中的文件描述符socket_fd对比且匹配后,则把需要写入的数据包在应用层利用重组算法进行重组后发送到内核层、而不是立即发送到linux内核协议栈的传输队列缓冲中以优化socket网络通信的发送速率和吞吐量;
17、其中重写的发送数据函数sendto用于提取输入参数中的文件描述符参数fd,若文件描述符参数fd和在创建连接请求函数connect插入的文件描述符链表fd_list中的文件描述符socket_fd对比且匹配后,则把需要发送的数据包在应用层利用重组算法进行重组后发送到内核层、而不是立即发送到linux内核协议栈的传输队列缓冲中以优化socket网络通信的发送速率和吞吐量。
18、可选地,所述重写的写函数write的调用的格式为:write(fd,buf,count),其中fd为文件描述符,buf为数据包缓冲地址,count为计数值。
19、可选地,步骤s2中利用重写的socket网络编程接口函数结合应用层提供的数据包重组算法将数据包在应用层重组后再发送到内核层时,针对写函数write的调用,利用重写的写函数write结合应用层提供的数据包重组算法将数据包在应用层重组后再发送到内核层包括:
20、s301,通过hook技术拦截写函数write的调用,若拦截到写函数write的调用,则跳转步骤s302;
21、s302,判断写函数write的调用中的文件描述符fd在文件描述符链表fd_list中是否存在,如果不存在,则直接执行hook拦截并重命名后的原始的写函数original_write,结束并退出;否则,跳转步骤s303;其中,原始的写函数original_write的调用的格式为:original_write (fd,buf,count),其中fd为文件描述符,buf为数据包缓冲地址,count为计数值;
22、s303,判断写函数write的调用的计数值count小于预设的合并长度merge_len是否成立,若成立则跳转步骤s304;否则,执行原始的写函数original_write将合并缓冲merge_buff中的合并数据发送给内核的传输队列缓冲区、并将合并缓冲merge_buff清空,重启定时器,跳转步骤s304;所述定时器用于定时检查合并缓冲merge_buff,若定时器到期发现合并缓冲merge_buff中有数据,则执行原始的写函数original_write将合并缓冲merge_buff中的合并数据发送给内核的传输队列缓冲区、并将合并缓冲merge_buff清空,重启定时器,跳转步骤s304;若定时器到期发现合并缓冲merge_buff中没有数据,则重启定时器;
23、s304,将写函数write的调用的数据包缓冲地址buf中的内存拷贝到合并缓冲merge_buff中,返回写函数write的调用的计数值count。
24、可选地,所述重写的发送数据函数sendto的调用的格式为:sendto(fd, buf,len, flags, to, tolen),其中fd为文件描述符,buf为数据包缓冲地址,len为计数值,flags为控制标志,to为目标地址,tolen为目标地址的长度。
25、可选地,步骤s2中利用重写的socket网络编程接口函数结合应用层提供的数据包重组算法将数据包在应用层重组后再发送到内核层时,针对发送数据函数sendto的调用,利用重写的socket网络编程接口函数结合应用层提供的数据包重组算法将数据包在应用层重组后再发送到内核层包括:
26、s401,通过hook技术拦截发送数据函数sendto的调用,若拦截到发送数据函数sendto的调用,则跳转步骤s402;
27、s402,判断发送数据函数sendto的调用的文件描述符fd在文件描述符链表fd_list中是否存在,如果不存在,则直接调用hook拦截并重命名后的原始的发送数据函数original_sendto直接把数据发送到内核层,结束并退出;否则,跳转步骤s403;其中,原始的发送数据函数original_sendto的调用的格式为:original_sendto (fd, buf, len,flags, to, tolen),其中fd为文件描述符,buf为数据包缓冲地址,len为计数值,flags为控制标志,to为目标地址,tolen为目标地址的长度;
28、s403,判断发送数据函数sendto的调用的计数值len小于预设的合并长度merge_len是否成立,若成立则跳转步骤s404;否则,执行原始的发送数据函数original_sendto将合并缓冲merge_buff中的合并数据发送给内核的传输队列缓冲区、并将合并缓冲merge_buff清空,重启定时器,跳转步骤s404;所述定时器用于定时检查合并缓冲merge_buff,若定时器到期发现合并缓冲merge_buff中有数据,则执行原始的发送数据函数original_sendto将合并缓冲merge_buff中的合并数据发送给内核的传输队列缓冲区、并将合并缓冲merge_buff清空,重启定时器,跳转步骤s404;若定时器到期发现合并缓冲merge_buff中没有数据,则重启定时器;
29、s404,将发送数据函数sendto的调用的数据包缓冲地址buf中的内存拷贝到合并缓冲merge_buff中,返回发送数据函数sendto的调用的计数值len。
30、此外,本发明还提供一种socket网络通信的优化系统,包括相互连接的微处理器和存储器,所述微处理器被编程或配置以执行所述socket网络通信的优化方法。
31、此外,本发明还提供一种计算机可读存储介质,该计算机可读存储介质中存储有计算机程序或指令,该计算机程序或指令被编程或配置以通过处理器执行所述socket网络通信的优化方法。
32、此外,本发明还提供一种计算机程序产品,包括计算机程序或指令,该计算机程序或指令被编程或配置以通过处理器执行所述socket网络通信的优化方法。
33、和现有技术相比,本发明主要具有下述优点:本发明旨在不修改linux系统的nagle算法、linux网卡驱动、不调整网络通信参数、不修改原有socket网络通信的应用程序的基础上达到网络通信优化的目的,本发明socket网络通信的优化方法包括,采用hook技术拦截socket网络编程接口函数的调用;利用重写的socket网络编程接口函数结合应用层提供的数据包重组算法将数据包在应用层重组后再发送到内核层、而不是立即发送到linux内核协议栈的传输队列缓冲中以优化socket网络通信的发送速率和吞吐量,从而能够减少每次进入到linux内核层申请内存的时间,减少每次网络数据从用户层拷贝到内存层的时间,也减少系统调用的次数,从而减少系统调用开销的时间,从而实现了不修改linux系统的nagle算法、linux网卡驱动、不调整网络通信参数、不修改原有socket网络通信的应用程序的基础上达到网络通信优化的目的,具体而言具有下述优点:1、不需要修改内核和socket的通信应用来提高网络的性能。2、通过hook技术提高网络的传输速率、降低延迟、提高吞吐量。3、通过hook技术降低系统的资源占用,从而达到优化网络性能的目的。4、使用hook技术对socket应用发送的网络包在应用层进行重组,减少系统调用和内核网络底层申请内存次数的时间来达到网络优化的目的。
本文地址:https://www.jishuxx.com/zhuanli/20241120/333182.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 YYfuon@163.com 举报,一经查实,本站将立刻删除。