CN113556331A - 一种tcp粘包处理方法、系统及存储介质 - Google Patents

一种tcp粘包处理方法、系统及存储介质 Download PDF

Info

Publication number
CN113556331A
CN113556331A CN202110772488.XA CN202110772488A CN113556331A CN 113556331 A CN113556331 A CN 113556331A CN 202110772488 A CN202110772488 A CN 202110772488A CN 113556331 A CN113556331 A CN 113556331A
Authority
CN
China
Prior art keywords
message
tcp
data
length
read
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN202110772488.XA
Other languages
English (en)
Inventor
付庆
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Shenzhen Huazhen Information Technology Co ltd
Original Assignee
Shenzhen Huazhen Information Technology Co ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Shenzhen Huazhen Information Technology Co ltd filed Critical Shenzhen Huazhen Information Technology Co ltd
Priority to CN202110772488.XA priority Critical patent/CN113556331A/zh
Publication of CN113556331A publication Critical patent/CN113556331A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L69/00Network arrangements, protocols or services independent of the application payload and not provided for in the other groups of this subclass
    • H04L69/16Implementation or adaptation of Internet protocol [IP], of transmission control protocol [TCP] or of user datagram protocol [UDP]
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L69/00Network arrangements, protocols or services independent of the application payload and not provided for in the other groups of this subclass
    • H04L69/22Parsing or analysis of headers
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04WWIRELESS COMMUNICATION NETWORKS
    • H04W28/00Network traffic management; Network resource management
    • H04W28/02Traffic management, e.g. flow control or congestion control
    • H04W28/06Optimizing the usage of the radio link, e.g. header compression, information sizing, discarding information
    • H04W28/065Optimizing the usage of the radio link, e.g. header compression, information sizing, discarding information using assembly or disassembly of packets

Landscapes

  • Engineering & Computer Science (AREA)
  • Computer Networks & Wireless Communication (AREA)
  • Signal Processing (AREA)
  • Computer Security & Cryptography (AREA)
  • Communication Control (AREA)

Abstract

本发明公开了一种TCP粘包处理方法、系统及存储介质,所述方法包括:在接收到TCP消息时,对所述TCP消息进行MSG_PEEK标记,所述TCP消息包括消息头;采用MSG_PEEK机制从TCP消息接收队列中预先读取所述TCP消息的数据;当预先读取到的TCP消息的数据长度大于或等于所述消息头时,从所述TCP消息的消息头中获取消息长度;清除所述MSG_PEEK标记;从所述TCP消息接收队列中再次读取与所述消息长度相对应的数据;当再次读取到的数据等于所述消息长度时,接收完整的数据包,并对所述数据包进行处理。本发明能保证每次读取到的消息边界清晰,均是完整的应用层消息,从而巧妙的解决了TCP粘包问题。

Description

一种TCP粘包处理方法、系统及存储介质
技术领域
本发明涉及TCP粘包处理领域,尤其涉及一种TCP粘包处理方法、系统及存储介质。
背景技术
目前,基站系统普遍采用分布式架构,对于宏站主要由基带处理单元、射频单元组成,对于室分系统由基带单元、扩展单元、射频单元组成,不同网元之间物理上通过光纤连接,可以实现灵活组网;基带单元和扩展单元需要支持多光口,根据组网场景基带单元可以接射频单元,也可以接扩展单元,扩展单元再接射频单元。基带单元需要控制所连接的扩展单元、射频单元,不同网元之间需要采用一种通信机制实现基带单元对网元的管理与控制,比如配置下发、状态查询,升级等操作。
由于TCP(传输控制协议)自身特性,发送端可能会将多次间隔较小且数据量较小的应用层数据,合并成一个大的数据块,然后进行封包发送到接收端,接收端难以区分,需要应用层采用合适的拆包策略。
其中,现有技术中常见的方法是接收端将每次接收到的数据放到缓冲区,其中,每次接收到的数据可能是一个完整的数据包,也可能是多个完整数据包,也可能包含多个数据包但最后一包数据不完整,接收端再从缓冲区中根据消息头找到消息边界处理每一包数据,不完整的数据包保留到缓冲区下下一个接收周期再进行解析,需要考虑的场景与异常处理比较多。
发明内容
本发明的主要目的在于提供一种TCP粘包处理方法、系统及存储介质,旨在保证每次读取到的消息均是完整的应用层消息,从而巧妙的解决TCP粘包问题。
为实现上述目的,本发明提供一种TCP粘包处理方法,所述方法包括以下步骤:
在接收到TCP消息时,对所述TCP消息进行MSG_PEEK标记,所述TCP消息包括消息头;
采用MSG_PEEK机制从TCP消息接收队列中预先读取所述TCP消息的数据;
当预先读取到的TCP消息的数据长度大于或等于所述消息头时,从所述TCP消息的消息头中获取消息长度;
清除所述MSG_PEEK标记;
从所述TCP消息接收队列中再次读取与所述消息长度相对应的数据;
当再次读取到的数据等于所述消息长度时,接收完整的数据包,并对所述数据包进行处理。
本发明进一步的技术方案是,所述当预先读取到的TCP消息的数据长度大于或等于所述消息头时,从所述TCP消息的消息头中获取消息长度的步骤之前还包括:
判断读取到的TCP消息的数据长度是否大于或等于消息头的消息长度;
若否,则返回执行所述采用MSG_PEEK机制从TCP消息接收队列中预先读取所述TCP消息的数据的步骤;
若是,则执行所述当预先读取到的TCP消息的数据长度大于或等于所述消息头时,从所述TCP消息的消息头中获取消息长度的步骤。
本发明进一步的技术方案是,所述当再次读取到的数据等于所述消息长度时,接收完整的数据包,并对所述数据包进行处理的步骤之前还包括:
判断再次读取到的数据是否等于所述消息长度;
若否,则返回执行从所述TCP消息接收队列中再次读取与所述消息长度相对应的数据的步骤;
若是,则执行所述当再次读取到的数据等于所述消息长度时,接收完整的数据包,并对所述数据包进行处理的步骤。
本发明进一步的技术方案是,所述消息头还包括消息类型和物理地址信息。
本发明进一步的技术方案是,所述物理地址信息至少包括基带单元光口号、扩展单元级数和扩展单元光口号中的一种或几种。
为实现上述目的,本发明还提出一种TCP粘包处理系统,所述系统包括存储器、处理器、以及存储在所述处理器上的TCP粘包处理程序,所述TCP粘包处理程序被所述处理器调用时执行以下步骤:
在接收到TCP消息时,对所述TCP消息进行MSG_PEEK标记,所述TCP消息包括消息头;
采用MSG_PEEK机制从TCP消息接收队列中预先读取所述TCP消息的数据;
当预先读取到的TCP消息的数据长度大于或等于所述消息头时,从所述TCP消息的消息头中获取消息长度;
清除所述MSG_PEEK标记;
从所述TCP消息接收队列中再次读取与所述消息长度相对应的数据;
当再次读取到的数据等于所述消息长度时,接收完整的数据包,并对所述数据包进行处理。
本发明进一步的技术方案是,所述TCP粘包处理程序被所述处理器调用时还执行以下步骤:
判断读取到的TCP消息的数据长度是否大于或等于消息头的消息长度;
若否,则返回执行所述采用MSG_PEEK机制从TCP消息接收队列中预先读取所述TCP消息的数据的步骤;
若是,则执行所述当预先读取到的TCP消息的数据长度大于所述消息头时,从所述TCP消息的消息头中获取消息长度的步骤。
本发明进一步的技术方案是,所述TCP粘包处理程序被所述处理器调用时还执行以下步骤:
判断再次读取到的数据是否等于所述消息长度;
若否,则返回执行从所述TCP消息接收队列中再次读取与所述消息长度相对应的数据的步骤;
若是,则执行所述当再次读取到的数据等于所述消息长度时,接收完整的数据包,并对所述数据包进行处理的步骤。
本发明进一步的技术方案是,所述消息头还包括消息类型和物理地址信息。
为实现上述目的,本发明还提出一种计算机可读存储介质,所述计算机可读存储介质上存储有TCP粘包处理程序,所述TCP粘包处理程序被处理器调用时执行如上所述的方法的步骤。
本发明TCP粘包处理方法、系统及存储介质的有益效果是:本发明通过上述技术方案,在接收到TCP消息时,对所述TCP消息进行MSG_PEEK标记,所述TCP消息包括消息头;采用MSG_PEEK机制从TCP消息接收队列中预先读取所述TCP消息的数据;当预先读取到的TCP消息的数据长度大于或等于所述消息头时,从所述TCP消息的消息头中获取消息长度;清除所述MSG_PEEK标记;从所述TCP消息接收队列中再次读取与所述消息长度相对应的数据;当再次读取到的数据等于所述消息长度时,接收完整的数据包,并对所述数据包进行处理,利用TCP自身特性,使用MSG_PEEK机制,在不实际从套接字接收队列接收完整数据的情况下预先读取消息头信息,如果读取到的数据长度小于消息头,则一直反复读取直到读到完整的消息头信息,从消息头中获取消息长度信息后再从套接字接收队列读取一条完整的应用层消息,采用此机制能保证每次读取到的消息边界清晰,均是完整的应用层消息,从而巧妙的解决了TCP粘包问题。
附图说明
图1是本发明TCP粘包处理方法第一实施例的流程示意图;
图2是室分系统组网示意图;
图3是TCP建链示意图;
图4是数据包组成示意图;
图5是TCP接收端接收到的一个完整的数据包示意图;
图6是TCP接收端接收到的数据小于消息头的数据包示意图;
图7是TCP接收端接收到的一个不完整的数据包示意图;
图8是TCP接收端接收到第一个数据包,最后一个数据包不完整的示意图;
图9是本发明TCP粘包处理方法第二实施例的流程示意图;
图10是本发明TCP粘包处理方法第三实施例的流程示意图。
具体实施方式
应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
本发明目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。
考虑到现有技术中常见是接收端先将每次接收到的数据放到缓冲区,其中,每次接收到的数据可能是一个完整的数据包,也可能是多个完整数据包,也可能包含多个数据包但最后一包数据不完整,然后再从缓冲区中根据消息头找到消息边界处理每一包数据,不完整的数据包保留到缓冲区下下一个接收周期再进行解析,需要考虑的场景与异常处理比较多,由此,本发明提出一种解决方案。
具体地,本发明提出一种TCP粘包处理方法、系统及存储介质,本发明考虑到应用层从套接字接收消息时可以使用不同的标志参数,MSG_PEEK标志使接收操作从套接字接收队列的开头开始返回数据,不会删除接收队列中的数据,后续再次接收时可以获取到完整的数据,因此,本发明利用TCP自身特性,使用MSG_PEEK机制,在不实际从套接字接收队列接收完整数据的情况下预先读取消息头信息,如果读取到的数据长度小于消息头,则一直反复读取直到读到完整的消息头信息,从消息头中获取消息长度信息后再从套接字接收队列读取一条完整的应用层消息,采用此机制能保证每次读取到的消息边界清晰,均是完整的应用层消息,从而巧妙的解决了TCP粘包问题。
如图1所示,图1是本发明TCP粘包处理方法第一实施例的流程示意图。本实施例包括以下步骤:
步骤S10,在接收到TCP消息时,对所述TCP消息进行MSG_PEEK标记,所述TCP消息包括消息头。
需要说明的是,本发明TCP粘包处理方法应用于TCP粘包处理系统,以下主要从组网形式、数据包组成和收包处理三个方面对本发明TCP粘包处理方法展开说明。
1、组网形式
如图2和图3所示,所述TCP粘包处理系统支持一个基带单元连接多个扩展单元,每一个扩展单元可以连接多个射频单元,其中,基带单元与扩展单元之间基带单元为TCP服务端,扩展单元为TCP客户端;扩展单元与射频单元之间扩展单元为TCP服务端、射频单元为客户端,即一个基带单元管理多个扩展单元、一个扩展单元管理多个射频单元。网元之间采用两级客户机/服务器架构分层管理,可以避免基带单元与射频单元之间直接的消息交互,两级客户机/服务器架构相互独立且便于扩展,支持扩展单元级联功能。
2、数据包组成
如图4所示,数据包由消息头与消息体组成,消息头中包含消息标识、消息长度、物理地址信息等信息,其中,物理地址信息主要包括基带单元端口号、扩展单元的级数、扩展单元对应的射频单元光口号等,物理地址信息可以唯一标识整个系统中的一个网元。
TCP是面向连接的,提供稳定可靠的服务,但TCP本身是无消息保护边界的,所以需要增加消息头,利用消息头来提取消息边界信息;消息头中的物理地址信息还可以用来寻址,在基带单元与扩展单元、射频单元交互时,只需在消息头中指明物理地址信息即可实现寻址功能,扩展单元在收到消息后比较消息头中的物理地址信息即可知是自身消息还是需要转发的消息。
3、收包机制及粘包处理
由于TCP自身特性,发送端可能会将多次间隔较小且数据量小的应用层数据,合并成一个大的数据块,然后进行封包发送到接收端,接收端难以区分,需要应用层采用合适的拆包策略。
常见的方法是接收端将每次接收到的数据放到缓冲区,如图5至图8所示,每次接收到的数据可能是一个完整的数据包、也可能是多个完整数据包、也可能包含多个数据包但最后一包数据不完整,接收端再冲缓冲区中根据消息头找到消息边界处理每一包数据,不完整的数据包保留到缓冲区下下一个接收周期再进行解析,需要考虑的场景与异常处理很多。
本实施例考虑到应用层从套接字接收消息时可以使用不同的标志参数,MSG_PEEK标志使接收操作从套接字接收队列的开头开始返回数据,不会删除接收队列中的数据,后续再次接收时可以获取到完整的数据。
因此,本实施例利用TCP自身特性,使用MSG_PEEK机制,在不实际从套接字接收队列接收完整数据的情况下预先读取消息头信息,如果读取到的数据长度小于消息头,则一直反复读取直到读到完整的消息头信息,从消息头中获取消息长度信息后再从套接字接收队列读取一条完整的应用层消息,采用此机制能保证每次读取到的消息边界清晰,均是完整的应用层消息,从而巧妙的解决了TCP粘包问题。
步骤S20,采用MSG_PEEK机制从TCP消息接收队列中预先读取所述TCP消息的数据。
步骤S30,当预先读取到的TCP消息的数据长度大于或等于所述消息头时,从所述TCP消息的消息头中获取消息长度。
本实施例中,在采用MSG_PEEK机制从TCP消息接收队列中预先读取所述TCP消息的数据后,如果预先读取到的TCP消息的数据长度大于或等于所述消息头时,从所述TCP消息的消息头中获取消息长度,如果TCP消息的数据长度小于所述消息头时,则返回继续从TCP消息接收队列中预先读取TCP消息的数据,一直反复读取直到读到完整的消息头消息。
步骤S40,清除所述MSG_PEEK标记。
可以理解的是,MSG_PEEK标志使接收操作从套接字接收队列的开头开始返回数据,不会删除接收队列中的数据,因此,本实施例在从所述TCP消息的消息头中获取消息长度后,清除所述MSG_PEEK标记,以便于后续再次接收时可以获取到完整的数据。
步骤S50,从所述TCP消息接收队列中再次读取与所述消息长度相对应的数据。
本实施例在清除所述MSG_PEEK标记后,可根据所述消息长度从所述TCP消息接收队列中再次读取与所述消息长度相对应的数据。
步骤S60,当再次读取到的数据等于所述消息长度时,接收完整的数据包,并对所述数据包进行处理。
可以理解的是,当再次读取到的数据等于所述消息长度时,即说明此次读取到的数据是一个完整的数据包,因此可以接收该完整的数据包,并将该完整的数据包转发给相应的数据处理模块进行处理。
本实施例的有益效果是:本实施例通过上述技术方案,在接收到TCP消息时,对所述TCP消息进行MSG_PEEK标记,所述TCP消息包括消息头;采用MSG_PEEK机制从TCP消息接收队列中预先读取所述TCP消息的数据;当预先读取到的TCP消息的数据长度大于或等于所述消息头时,从所述TCP消息的消息头中获取消息长度;清除所述MSG_PEEK标记;从所述TCP消息接收队列中再次读取与所述消息长度相对应的数据;当再次读取到的数据等于所述消息长度时,接收完整的数据包,并对所述数据包进行处理,利用TCP自身特性,使用MSG_PEEK机制,在不实际从套接字接收队列接收完整数据的情况下预先读取消息头信息,如果读取到的数据长度小于消息头,则一直反复读取直到读到完整的消息头信息,从消息头中获取消息长度信息后再从套接字接收队列读取一条完整的应用层消息,采用此机制能保证每次读取到的消息边界清晰,均是完整的应用层消息,从而巧妙的解决了TCP粘包问题。
进一步地,请参照图9,图9是本发明TCP粘包处理方法第二实施例的流程示意图,本实施例与图1所示的第一实施例的区别在于,本实施例中,上述步骤S30,当预先读取到的TCP消息的数据长度大于或等于所述消息头时,从所述TCP消息的消息头中获取消息长度的步骤之前还包括:
步骤S301,判断读取到的TCP消息的数据长度是否大于或等于消息头的消息长度。
本实施例考虑到接收到的TCP信息的数据可能是一个完整的数据包,也可能是多个完整的数据包,也可能是包含多个数据包但最后一包数据不完整,因此,本实施例在采用MSG_PEEK机制从TCP消息接收队列中预先读取所述TCP消息的数据之后,在当预先读取到的TCP消息的数据长度大于或等于所述消息头时,从所述TCP消息的消息头中获取消息长度之前还判断读取到的TCP消息的数据长度是否大于或等于消息头的消息长度。
若否,则返回执行所述采用MSG_PEEK机制从TCP消息接收队列中预先读取所述TCP消息的数据的步骤。
本实施例中,如果读取到的TCP消息的数据长度小于消息头的消息长度,则返回继续采用MSG_PEEK机制从TCP消息接收队列中预先读取所述TCP消息的数据,一直反复读取直到读到完整的消息头消息。
若是,则执行所述当预先读取到的TCP消息的数据长度大于或等于所述消息头时,从所述TCP消息的消息头中获取消息长度的步骤。
如果读取到的TCP消息的数据长度大于或等于消息头的消息长度,则所述TCP消息的消息头中获取消息长度。
本实施例的有益效果是:本实施例通过上述技术方案,在接收到TCP消息时,对所述TCP消息进行MSG_PEEK标记,所述TCP消息包括消息头;采用MSG_PEEK机制从TCP消息接收队列中预先读取所述TCP消息的数据;判断读取到的TCP消息的数据长度是否大于或等于消息头的消息长度;若否,则返回执行所述采用MSG_PEEK机制从TCP消息接收队列中预先读取所述TCP消息的数据的步骤;若是,则从所述TCP消息的消息头中获取消息长度;清除所述MSG_PEEK标记;从所述TCP消息接收队列中再次读取与所述消息长度相对应的数据;当再次读取到的数据等于所述消息长度时,接收完整的数据包,并对所述数据包进行处理,利用TCP自身特性,使用MSG_PEEK机制,在不实际从套接字接收队列接收完整数据的情况下预先读取消息头信息,如果读取到的数据长度小于消息头,则一直反复读取直到读到完整的消息头信息,从消息头中获取消息长度信息后再从套接字接收队列读取一条完整的应用层消息,采用此机制能保证每次读取到的消息边界清晰,均是完整的应用层消息,从而巧妙的解决了TCP粘包问题。
进一步地,请参照图10,图10是本发明TCP粘包处理方法第三实施例的流程示意图,本实施例与图1所示的第一实施例的区别在于,本实施例中,上述步骤S60,当再次读取到的数据等于所述消息长度时,接收完整的数据包,并对所述数据包进行处理的步骤之前还包括:
步骤S601,判断再次读取到的数据是否等于所述消息长度。
若否,则返回执行从所述TCP消息接收队列中再次读取与所述消息长度相对应的数据的步骤;
若是,则执行所述当再次读取到的数据等于所述消息长度时,接收完整的数据包,并对所述数据包进行处理的步骤。
可以理解的是,当再次读取到的数据等于所述消息长度时,即说明此次读取到的数据是一个完整的数据包,因此可以接收该完整的数据包,并将该完整的数据包转发给相应的数据处理模块进行处理。
本实施例的有益效果是:本实施例通过上述技术方案,在接收到TCP消息时,对所述TCP消息进行MSG_PEEK标记,所述TCP消息包括消息头;采用MSG_PEEK机制从TCP消息接收队列中预先读取所述TCP消息的数据;当预先读取到的TCP消息的数据长度大于或等于所述消息头时,从所述TCP消息的消息头中获取消息长度;清除所述MSG_PEEK标记;从所述TCP消息接收队列中再次读取与所述消息长度相对应的数据;判断再次读取到的数据是否等于所述消息长度;若否,则返回执行从所述TCP消息接收队列中再次读取与所述消息长度相对应的数据的步骤;若是,则接收完整的数据包,并对所述数据包进行处理,利用TCP自身特性,使用MSG_PEEK机制,在不实际从套接字接收队列接收完整数据的情况下预先读取消息头信息,如果读取到的数据长度小于消息头,则一直反复读取直到读到完整的消息头信息,从消息头中获取消息长度信息后再从套接字接收队列读取一条完整的应用层消息,采用此机制能保证每次读取到的消息边界清晰,均是完整的应用层消息,从而巧妙的解决了TCP粘包问题。
为实现上述目的,本发明还提出一种TCP粘包处理系统,所述系统包括存储器、处理器、以及存储在所述处理器上的TCP粘包处理程序,所述TCP粘包处理程序被所述处理器调用时执行以下步骤:
在接收到TCP消息时,对所述TCP消息进行MSG_PEEK标记,所述TCP消息包括消息头;
采用MSG_PEEK机制从TCP消息接收队列中预先读取所述TCP消息的数据;
当预先读取到的TCP消息的数据长度大于或等于所述消息头时,从所述TCP消息的消息头中获取消息长度;
清除所述MSG_PEEK标记;
从所述TCP消息接收队列中再次读取与所述消息长度相对应的数据;
当再次读取到的数据等于所述消息长度时,接收完整的数据包,并对所述数据包进行处理。
进一步地,所述TCP粘包处理程序被所述处理器调用时还执行以下步骤:
判断读取到的TCP消息的数据长度是否大于或等于消息头的消息长度;
若否,则返回执行所述采用MSG_PEEK机制从TCP消息接收队列中预先读取所述TCP消息的数据的步骤;
若是,则执行所述当预先读取到的TCP消息的数据长度大于或等于所述消息头时,从所述TCP消息的消息头中获取消息长度的步骤。
进一步地,所述TCP粘包处理程序被所述处理器调用时还执行以下步骤:
判断再次读取到的数据是否等于所述消息长度;
若否,则返回执行从所述TCP消息接收队列中再次读取与所述消息长度相对应的数据的步骤;
若是,则执行所述当再次读取到的数据等于所述消息长度时,接收完整的数据包,并对所述数据包进行处理的步骤。
本实施例中,所述消息头还包括消息类型和物理地址信息。
本发明TCP粘包处理系统的有益效果是:本发明通过上述技术方案,在接收到TCP消息时,对所述TCP消息进行MSG_PEEK标记,所述TCP消息包括消息头;采用MSG_PEEK机制从TCP消息接收队列中预先读取所述TCP消息的数据;当预先读取到的TCP消息的数据长度大于或等于所述消息头时,从所述TCP消息的消息头中获取消息长度;清除所述MSG_PEEK标记;从所述TCP消息接收队列中再次读取与所述消息长度相对应的数据;当再次读取到的数据等于所述消息长度时,接收完整的数据包,并对所述数据包进行处理,利用TCP自身特性,使用MSG_PEEK机制,在不实际从套接字接收队列接收完整数据的情况下预先读取消息头信息,如果读取到的数据长度小于消息头,则一直反复读取直到读到完整的消息头信息,从消息头中获取消息长度信息后再从套接字接收队列读取一条完整的应用层消息,采用此机制能保证每次读取到的消息边界清晰,均是完整的应用层消息,从而巧妙的解决了TCP粘包问题。
为实现上述目的,本发明还提出一种计算机可读存储介质,所述计算机可读存储介质上存储有TCP粘包处理程序,所述TCP粘包处理程序被处理器调用时执行如上实施例所述的方法的步骤,这里不再赘述。
以上仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。

Claims (10)

1.一种TCP粘包处理方法,其特征在于,所述方法包括以下步骤:
在接收到TCP消息时,对所述TCP消息进行MSG_PEEK标记,所述TCP消息包括消息头;
采用MSG_PEEK机制从TCP消息接收队列中预先读取所述TCP消息的数据;
当预先读取到的TCP消息的数据长度大于或等于所述消息头时,从所述TCP消息的消息头中获取消息长度;
清除所述MSG_PEEK标记;
从所述TCP消息接收队列中再次读取与所述消息长度相对应的数据;
当再次读取到的数据等于所述消息长度时,接收完整的数据包,并对所述数据包进行处理。
2.根据权利要求1所述的TCP粘包处理方法,其特征在于,所述当预先读取到的TCP消息的数据长度大于或等于所述消息头时,从所述TCP消息的消息头中获取消息长度的步骤之前还包括:
判断读取到的TCP消息的数据长度是否大于或等于消息头的消息长度;
若否,则返回执行所述采用MSG_PEEK机制从TCP消息接收队列中预先读取所述TCP消息的数据的步骤;
若是,则执行所述当预先读取到的TCP消息的数据长度大于或等于所述消息头时,从所述TCP消息的消息头中获取消息长度的步骤。
3.根据权利要求1所述的TCP粘包处理方法,其特征在于,所述当再次读取到的数据等于所述消息长度时,接收完整的数据包,并对所述数据包进行处理的步骤之前还包括:
判断再次读取到的数据是否等于所述消息长度;
若否,则返回执行从所述TCP消息接收队列中再次读取与所述消息长度相对应的数据的步骤;
若是,则执行所述当再次读取到的数据等于所述消息长度时,接收完整的数据包,并对所述数据包进行处理的步骤。
4.根据权利要求1至3任意一项所述的TCP粘包处理方法,其特征在于,所述消息头还包括消息类型和物理地址信息。
5.根据权利要求4所述的TCP粘包处理方法,其特征在于,所述物理地址信息至少包括基带单元光口号、扩展单元级数和扩展单元光口号中的一种或几种。
6.一种TCP粘包处理系统,其特征在于,所述系统包括存储器、处理器、以及存储在所述处理器上的TCP粘包处理程序,所述TCP粘包处理程序被所述处理器调用时执行以下步骤:
在接收到TCP消息时,对所述TCP消息进行MSG_PEEK标记,所述TCP消息包括消息头;
采用MSG_PEEK机制从TCP消息接收队列中预先读取所述TCP消息的数据;
当预先读取到的TCP消息的数据长度大于或等于所述消息头时,从所述TCP消息的消息头中获取消息长度;
清除所述MSG_PEEK标记;
从所述TCP消息接收队列中再次读取与所述消息长度相对应的数据;
当再次读取到的数据等于所述消息长度时,接收完整的数据包,并对所述数据包进行处理。
7.根据权利要求6所述的TCP粘包处理系统,其特征在于,所述TCP粘包处理程序被所述处理器调用时还执行以下步骤:
判断读取到的TCP消息的数据长度是否大于或等于消息头的消息长度;
若否,则返回执行所述采用MSG_PEEK机制从TCP消息接收队列中预先读取所述TCP消息的数据的步骤;
若是,则执行所述当预先读取到的TCP消息的数据长度大于所述消息头时,从所述TCP消息的消息头中获取消息长度的步骤。
8.根据权利要求6所述的TCP粘包处理系统,其特征在于,所述TCP粘包处理程序被所述处理器调用时还执行以下步骤:
判断再次读取到的数据是否等于所述消息长度;
若否,则返回执行从所述TCP消息接收队列中再次读取与所述消息长度相对应的数据的步骤;
若是,则执行所述当再次读取到的数据等于所述消息长度时,接收完整的数据包,并对所述数据包进行处理的步骤。
9.根据权利要求6至8任意一项所述的TCP粘包处理系统,其特征在于,所述消息头还包括消息类型和物理地址信息。
10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有TCP粘包处理程序,所述TCP粘包处理程序被处理器调用时执行如权利要求1至5任意一项所述的方法的步骤。
CN202110772488.XA 2021-07-08 2021-07-08 一种tcp粘包处理方法、系统及存储介质 Pending CN113556331A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202110772488.XA CN113556331A (zh) 2021-07-08 2021-07-08 一种tcp粘包处理方法、系统及存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202110772488.XA CN113556331A (zh) 2021-07-08 2021-07-08 一种tcp粘包处理方法、系统及存储介质

Publications (1)

Publication Number Publication Date
CN113556331A true CN113556331A (zh) 2021-10-26

Family

ID=78102956

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202110772488.XA Pending CN113556331A (zh) 2021-07-08 2021-07-08 一种tcp粘包处理方法、系统及存储介质

Country Status (1)

Country Link
CN (1) CN113556331A (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN114125081A (zh) * 2021-10-27 2022-03-01 桂林长海发展有限责任公司 一种接收数据的处理方法、装置及存储介质

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103024018A (zh) * 2012-12-04 2013-04-03 北京蓝汛通信技术有限责任公司 一种在单台设备运行多cdn服务进程的方法及装置
CN104410613A (zh) * 2014-11-20 2015-03-11 广西大学 一种处理传输控制协议粘包方法及装置
CN104780065A (zh) * 2015-04-01 2015-07-15 福建星网锐捷网络有限公司 一种tcp热备份方法和系统
CN105991223A (zh) * 2015-02-13 2016-10-05 Tcl集团股份有限公司 一种tcp网络传输数据中防粘包的方法及系统
US20210084016A1 (en) * 2019-09-13 2021-03-18 Oracle International Corporation Systems and methods for client collaborated migration of live tls connection

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103024018A (zh) * 2012-12-04 2013-04-03 北京蓝汛通信技术有限责任公司 一种在单台设备运行多cdn服务进程的方法及装置
CN104410613A (zh) * 2014-11-20 2015-03-11 广西大学 一种处理传输控制协议粘包方法及装置
CN105991223A (zh) * 2015-02-13 2016-10-05 Tcl集团股份有限公司 一种tcp网络传输数据中防粘包的方法及系统
CN104780065A (zh) * 2015-04-01 2015-07-15 福建星网锐捷网络有限公司 一种tcp热备份方法和系统
US20210084016A1 (en) * 2019-09-13 2021-03-18 Oracle International Corporation Systems and methods for client collaborated migration of live tls connection

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
WANGXINYU2011: "UDP分两次接收数据包MSG_PEEK", 《CSDN》 *
周迪: "Winsock API选项配置", 《计算机与信息技术》 *

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN114125081A (zh) * 2021-10-27 2022-03-01 桂林长海发展有限责任公司 一种接收数据的处理方法、装置及存储介质
CN114125081B (zh) * 2021-10-27 2023-09-22 桂林长海发展有限责任公司 一种接收数据的处理方法、装置及存储介质

Similar Documents

Publication Publication Date Title
CN103780679A (zh) 基于http协议的长延时远程调用方法
CN113014666B (zh) 一种区块链协议栈架构方法、系统、设备及存储介质
CN113259264B (zh) 数据传输方法、装置、计算机设备和存储介质
CN113014510B (zh) 惯导系统分布式测试中数据缓存方法及装置
CN105389120A (zh) 支持通过活动消息的rma api
CN115174472A (zh) 一种消息转发处理方法及相关装置
CN114035987A (zh) 基于消息队列的数据传输方法、装置、电子设备及介质
CN113556331A (zh) 一种tcp粘包处理方法、系统及存储介质
CN112422485B (zh) 一种传输控制协议的通信方法及装置
US7526420B2 (en) Method and system for virtual injection of network application codes into network simulation
CN113691600A (zh) 设备状态信息的同步方法以及装置、计算机可读存储介质
CN113194494A (zh) 一种空口资源控制方法、装置、网络侧设备及终端
CN112073488A (zh) 处理请求的方法及装置
CN111930482A (zh) 基于节点集群的任务处理方法、装置、设备及存储介质
CN104639379A (zh) 测试代理方法及其装置
CN106713170B (zh) 一种vsm通道的报文分片方法及装置
CN109871277B (zh) 进程间多请求管理方法、装置、终端设备及可读存储介质
CN113626295B (zh) 压测数据的处理方法、系统及计算机可读存储介质
CN111078425B (zh) 消息处理方法、装置、存储介质及电子设备
KR100875912B1 (ko) 개방형 환경에서의 네트워크 이벤트들을 처리하는 통신망이벤트 처리 장치 및 그 방법
CN114079974A (zh) 网络能力开放方法、装置、upf实体及cpe网元
CN111130968A (zh) 一种解决Modbus总线通信粘包的方法及终端
CN110808909A (zh) 跨虚拟系统的报文处理方法和装置
CN115086173B (zh) 网络升级过程中的可靠性保障方法和装置
JP4649461B2 (ja) 端末装置稼動確認方法、稼動確認装置、稼動確認システムおよび稼動確認プログラム

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
RJ01 Rejection of invention patent application after publication
RJ01 Rejection of invention patent application after publication

Application publication date: 20211026