CN101282300B - 一种基于非阻塞机制的http报文处理方法 - Google Patents

一种基于非阻塞机制的http报文处理方法 Download PDF

Info

Publication number
CN101282300B
CN101282300B CN2008101012439A CN200810101243A CN101282300B CN 101282300 B CN101282300 B CN 101282300B CN 2008101012439 A CN2008101012439 A CN 2008101012439A CN 200810101243 A CN200810101243 A CN 200810101243A CN 101282300 B CN101282300 B CN 101282300B
Authority
CN
China
Prior art keywords
message
data buffering
data
thread
http
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.)
Expired - Fee Related
Application number
CN2008101012439A
Other languages
English (en)
Other versions
CN101282300A (zh
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.)
Beihang University
Original Assignee
Beihang University
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 Beihang University filed Critical Beihang University
Priority to CN2008101012439A priority Critical patent/CN101282300B/zh
Publication of CN101282300A publication Critical patent/CN101282300A/zh
Application granted granted Critical
Publication of CN101282300B publication Critical patent/CN101282300B/zh
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Computer And Data Communications (AREA)

Abstract

一种基于非阻塞机制的HTTP报文处理方法,包括以下步骤:A)当读事件触发,读取HTTP报文,将其存放于数据缓冲中;B)判断该报文是否需要解析报文头,是则转C),否则转D);C)判断报文头是否已经完整到达,是则解析报文头,否则转A);D)判断报文体是否已经完整到达,是则解析报文体,否则转A);E)解析完毕,将数据缓冲回收至数据缓冲池。本发明糅合了多线程和事件驱动两者的优点,在HTTP报文的处理过程中,实现了真正的非阻塞机制,使得HTTP报文在解析过程中达到零拷贝和一次遍历,大大的提高了HTTP报文的处理效率。

Description

一种基于非阻塞机制的HTTP报文处理方法
技术领域
本发明涉及一种基于非阻塞机制的HTTP报文处理方法,主要是用于HTTP服务器***。
背景技术
大型的HTTP服务器必须能够以不可预期的规模来处理并发请求。并发的网络请求和大规模的网络负载,要求实现一个并发性能高、可伸缩性强的服务器***。
目前,构建一个高性能的HTTP服务器***,最为普遍的方式有两种:基于多线程的实现方式和基于事件驱动的实现方式。基于多线程的实现方式,虽然能够解决阻塞所导致的等待、有效的利用***的并发性、缩短用户响应时间,但是线程是一种重要的***资源,分配的线程越多,***的开销也就越大。对于一个给定的***,它能支持的线程有一个阈值,超过这个阈值,其性能就会有大幅度的降低。一个解决的办法就是采用线程池,这样就能有效的节省线程创建、切换和回收的***开销,然而,如果面对大规模的网络负载,显然,超过线程数量的请求只能等待,而且***花在线程调度上的时间会大于网络操作的时间。
基于事件驱动的实现方式,有效的利用了Reactor模式和非阻塞IO,当各种IO事件一旦准备就绪,就触发应用程序接收并做相应处理,处理完毕立即返回,应用程序不再等待IO请求,这样就可以用单一线程来模拟多线程并发。这种方法,被称之为传统的非阻塞方法。它虽然避免了由于阻塞而导致的线程创建、切换和回收的***开销,但是没有能够利用SMP(Symmetrical Multi-Processing)***多处理器的并发能力。同时,由于一个线程需要处理所有请求,从而增加了单点失效的可能性,也相应的提高了编程的复杂度。
一个有效的办法是结合多线程和事件驱动两者的优势,设计出一种混合的模型。这方面,Matt Welsh在它的高并发网络框架SandStorm及其应用Haboob服务器中早有体现。但是他并没有充分利用非阻塞的特点,尽量做到零拷贝和一次遍历,从一定意义上讲,它只是基于非阻塞IO的混合式HTTP服务器。
发明内容
本发明的目的是:提供一种基于非阻塞机制的HTTP报文处理方法,该方法规定了HTTP服务器中如何以非阻塞的方式处理HTTP报文,从而达到零拷贝和一次遍历的效果,以大大提高HTTP报文的处理效率。
为实现上述目的,本发明采取以下技术方案:其前提是建立起基于非阻塞机制的HTTP服务器的线程模型,如图1所示,该服务器的线程模型包括四个组件,即select线程,负责侦听各种非阻塞IO事件的发生并负责和客户端建立连接;线程池,它由多个工作线程组成,每个工作线程包含有一个事件队列,每一个事件队列存放多种类型的事件即任务,即在实现上糅合了多线程和事件驱动两者的优点;连接——线程映射表,其key值为连接,其value值为线程,根据该映射表,从而使得一个连接的所有任务在一个线程中执行,从而避免了因为不同步所导致的错误;数据缓冲池,是存放报文的数据结构,它由两个数据缓冲链组成,其一为busy链,表示正在使用的数据缓冲的集合,其二为free链,表示已经存在但当时未被使用的缓冲集合。因此,数据缓冲池由多个数据缓冲组成,每一个数据缓冲在某一个时刻只保存一个连接的报文,当读取分配数据缓冲的过程报文处理完毕,该缓冲池回收相应的数据缓冲,避免了下次再分配和销毁的开销。在此线程模型基础上,一个数据报文的处理过程包括以下步骤:
A、当读事件触发,读取HTTP报文,将其存放于数据缓冲中;
B、判断该报文是否需要解析报文头,是则转C,否则转D;
C、判断报文头是否已经完整到达,是则解析报文头,否则转A;
D、判断报文体是否已经完整到达,是则解析报文体,否则转A;
E、解析完毕,将数据缓冲回收至数据缓冲池。
本发明与现有技术相比的优点在于:本发明通过线程池和事件队列,糅合了多线程和事件驱动两者的优点,通过连接——线程的映射表,保证了一个连接的报文读取、报文解析、报文响应在一个线程中完成,从而为非阻塞的HTTP报文处理方法奠定了基础。另外,数据缓冲描述符即指向数据缓冲的指针、解析进度标示、m-position、p-position以及f-position的定义,使得HTTP报文在解析的过程中,尽量做到零拷贝和一次遍历,实现了真正的非阻塞机制,大大的提高了HTTP报文的处理效率。
附图说明
图1为本发明基于非阻塞机制的HTTP服务器线程模型。
图2为本发明HTTP报文的非阻塞处理方法;
具体实施方式
本发明公开的非阻塞机制,不仅仅是指在请求的建立、数据的读取以及响应的发送过程中不再等待IO请求的完成而是直接返回此即非阻塞IO,还包括在数据的解析过程中的非阻塞方法即异步解析算法。
本发明公开的基于非阻塞机制的HTTP报文处理方法,是基于图1所示的基于非阻塞机制的HTTP服务器的线程模型,即HTTP服务器如何以非阻塞机制来处理HTTP报文的过程。select线程和传统的listener线程不一样,它不仅用来侦听各种非阻塞IO事件的发生诸如accept、read、write等,同时它还负责和客户端建立连接即处理accept事件以及部分的write事件。和Haboob一样,本发明融合了基于事件驱动的非阻塞IO和多线程的优势,设计出了一种复合的模型,所不同的是,本发明的每一个线程都有一个事件队列,而这个事件队列中可以存放多种类型的事件。当它接受到read事件时,将其***到工作线程的事件队列,由工作线程来读取数据,数据读取完毕,如果当前工作线程还未切换,接着解析数据,否则生成解析事件,***到事件队列中。当一个请求解析完毕,工作线程开始构造其响应报文并发送,在发送的过程中,如果数据无法一次发送完,那么则需要向select线程注册写事件,由select线程完成剩下的发送工作。因此,工作线程所维护的事件队列可以有read、parse、response三种类型的事件。这样,一个连接的处理过程,被分为不同的事件来进行,这样的事件定义为任务。因此,本发明可以用一个线程来并发处理多个连接,而一个连接的所有任务则在事件队列中以不相邻的方式进行。为了提高并发性,本发明依旧采用了线程池,线程的调度必须根据连接——线程的映射表,以确保一个连接的上述三种类型的事件在一个线程中完成,从而避免了因为不同步所导致的错误。
由于非阻塞IO的原因,服务器端一次收到的报文有可能不是一个完整地HTTP报文,为了尽量避免数据的多次拷贝和多次遍历的***开销,本发明用大小动态变化的数据缓冲来保存读取到的数据,该数据缓冲来源于数据缓冲区,同时定义三个位置和一个解析进度标识,三个位置即m-position,p-position和f-position,分别记录已经有效解析的位置,当前正在解析的位置和当前报文片断的结束位置。如图2所示,本发明公开的基于非阻塞机制HTTP报文处理方法,具体包括以下步骤:
1、当读事件触发,读取HTTP报文,将其存放于数据缓冲中;
2、判断该报文是否需要解析报文头,是则转3,否则转4;
3、判断报文头是否已经完整到达,是则解析报文头,否则转1;
4、判断报文体是否已经完整到达,是则解析报文体,否则转1;
5、解析完毕,将数据缓冲回收至数据缓冲池;
以下进一步详细说明。
1.在上述第1步中,当读事件触发时,select线程获取读事件,由工作线程完成报文数据的读取,并保存至缓冲中。
数据缓冲的分配方法如下:
a.若free链中存在着缓冲节点,则从free链中删除队尾节点,同时在busy链的队尾添加一个节点。
b.若free链中不存在缓冲节点,则从当前内存中获取一个数据缓冲,并在busy链的队尾添加一个节点。
数据缓冲的使用方法如下:
a.当一个连接的报文片断第一次到达时,分配一个初始大小的数据缓冲,并初始化m-position、p-position和f-position位置为0;
c.若当前缓冲足够容纳该报文片断,将数据读入数据缓冲中,附在从f-position开始的缓冲区内,读取完毕修改当前报文片断的结束位置为f-position;
d.若当前缓冲不够容纳该报文片断,则分配另外一个数据缓冲形成缓冲链,以存放剩下的报文片断,转b;
e.数据解析完毕,将数据缓冲链回收至数据缓冲池中。
判断当前请求报文的处理进度,并调用与之相对应的报文处理方法。
2.根据解析进度标示判断该HTTP报文是否需要解析报文头,若解析进度标示显示报文头还未解析完毕则转步骤3,若解析进度标示显示报文头已经解析完毕,则转步骤4;
3、报文头的处理方法
如果当前报文的处理进度显示还未处理报文头,则报文头的处理过程如下:
a.如果报文中含有“/r/n/r/n”,则报文头读取完整,则进行下一步;
b.从缓冲中读取报文;
c.如果当前字符为空格,则将m-position和p-position之间的报文取出,将其保存在解析结果中,最后将m-position修改为p-position并返回b);
d.如果m-position<=p-position,而且p-position<=f-position,重复进行b、c操作,直到报文头中的请求行解析完毕;
e.如果当前字符为“:”,则将m-position和p-position之间的报文取出,将其保存至name中,同时将m-position修改为p-position并返回b;
f.如果当前字符为“/r/n”,则将m-position和p-position之间的报文取出,将其保存至value中,同时将(name,value)属性对保存至header中,最后将m-position修改为p-position并返回b;其中步骤e和f所涉及的name为保存报文头属性名字段的变量,value为保存报文头属性值字段的变量,而header为name和value的映射表;
g.重复执行b、e、f操作,直到当前字符的下一个位置为“/r/n”即报文头解析完毕,修改解析进度标示;
HTTP报文处理程序判断当前请求报文的处理进度,并调用与之相对应的报文处理方法。
4、报文体的处理方法
如果当前报文的处理进度显示还未处理报文体,则报文体的处理过程如下:
a.初始化p-position为m-position;
b.如果f-position和p-position之间的报文片断小于Content-length所指示的长度,则报文头不完整,程序返回,否则进行下一步;
c.将p-position和f-position之间的报文取出,保存至解析结果中,解析完毕,修改解析进度标示。
5、解析完毕,将数据缓冲回收至数据缓冲池。即删除busy链中的相应节点,并在free链中的队尾添加一个节点。因此,当下次有报文读取,需要数据缓冲时,可直接从free链中获取,避免了多次从内存分配的***开销,同时也避免了内存回收的***开销。

Claims (3)

1.一种基于非阻塞机制的HTTP报文处理方法,其特征在于:前提是建立起基于非阻塞机制的HTTP服务器的线程模型,该服务器的线程模型包括四个组件,select线程,负责侦听各种非阻塞IO事件的发生并负责和客户端建立连接;线程池,它由多个工作线程组成,每个工作线程包含有一个事件队列,每一个事件队列存放多种类型的事件即任务;连接——线程映射表,其key值为连接,其value值为线程,根据该映射表,使得一个连接的所有任务在一个线程中执行;数据缓冲池,是存放报文的数据结构,它由两个数据缓冲链组成,其一为busy链,表示正在使用的数据缓冲的集合,其二为free链,表示已经存在但当时未被使用的数据缓冲集合,因此,数据缓冲池由多个数据缓冲组成,每一个数据缓冲在某一个时刻只保存一个连接的报文,当读取分配数据缓冲的过程报文处理完毕,该缓冲池回收相应的数据缓冲,避免了下次再分配和销毁的开销;在此线程模型基础上,一个数据报文的处理过程包括以下步骤:
(1)当读事件触发时,select线程获取读事件,由工作线程完成HTTP报文的读取,并保存至数据缓冲中;
(2)判断该HTTP报文是否需要解析报文头,是则转步骤(3),否则转步骤(4);
(3)判断该HTTP报文头是否已经完整到达,是则解析报文头,否则转步骤(1);
(4)判断该HTTP报文体是否已经完整到达,是则解析报文体,否则转步骤(1);
(5)解析完毕,将数据缓冲回收至数据缓冲池。
2.根据权利要求1所述的一种基于非阻塞机制的HTTP报文处理方法,其特征在于:所述步骤(1)的数据缓冲的使用方法如下:
a.当一个连接的报文片断第一次到达时,分配一个初始大小的数据缓冲,并初始化m-position、p-position和f-position位置为0,其中m-position,p-position和f-position分别记录已经有效解析的位置、当前正在解析的位置和当前报文片断的结束位置;
b.若当前缓冲足够容纳该报文片断,将数据读入数据缓冲中,附在从f-position开始的缓冲区内,读取完毕修改当前报文片断的结束位置为f-position;
c.若当前缓冲不够容纳该报文片断,则分配另外一个数据缓冲形成缓冲链,以存放剩下的报文片断,转步骤b;
d.报文解析完毕,将数据缓冲链回收至数据缓冲池中。
3.根据权利要求1所述的一种基于非阻塞机制的HTTP报文处理方法,其特征在于:所述步骤(3)中报文头的处理过程如下:
a.如果报文中含有“/r/n/r/n”,则报文头读取完整,则进行下一步;
b.从缓冲中读取报文;
c.如果当前字符为空格,则将m-position和p-position之间的报文取出,将其保存在解析结果中,最后将m-position修改为p-position并返回b;其中m-position,p-position和f-position分别记录已经有效解析的位置、当前正在解析的位置和当前报文片断的结束位置;
d.如果m-position<=p-position,而且p-position<=f-position,重复进行步骤b、c操作,直到报文头中的请求行解析完毕;
e.如果当前字符为“:”,则将m-position和p-position之间的报文取出,将其保存至name中,同时将m-position修改为p-position并返回b;
f.如果当前字符为“/r/n”,则将m-position和p-position之间的报文取出,将其保存至value中,同时将name和value属性对保存至header中,最后将m-position修改为p-position并返回b;其中步骤e和f所涉及的name为保存报文头属性名字段的变量,value为保存报文头属性值字段的变量,而header为name和value的映射表;
g.重复执行b、e、f操作,直到当前字符的下一个位置为“/r/n”即报文头解析完毕,修改解析进度标示。
CN2008101012439A 2008-03-03 2008-03-03 一种基于非阻塞机制的http报文处理方法 Expired - Fee Related CN101282300B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN2008101012439A CN101282300B (zh) 2008-03-03 2008-03-03 一种基于非阻塞机制的http报文处理方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN2008101012439A CN101282300B (zh) 2008-03-03 2008-03-03 一种基于非阻塞机制的http报文处理方法

Publications (2)

Publication Number Publication Date
CN101282300A CN101282300A (zh) 2008-10-08
CN101282300B true CN101282300B (zh) 2010-12-08

Family

ID=40014583

Family Applications (1)

Application Number Title Priority Date Filing Date
CN2008101012439A Expired - Fee Related CN101282300B (zh) 2008-03-03 2008-03-03 一种基于非阻塞机制的http报文处理方法

Country Status (1)

Country Link
CN (1) CN101282300B (zh)

Families Citing this family (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101714991B (zh) * 2009-10-30 2012-06-20 清华大学 心跳机制的实现方法
CN102075583A (zh) * 2011-01-30 2011-05-25 杭州华三通信技术有限公司 一种http请求报文处理方法及其设备
CN103327128A (zh) * 2013-07-23 2013-09-25 百度在线网络技术(北京)有限公司 用于MapReduce的中间数据传输方法及***
CN103513990B (zh) * 2013-10-11 2017-01-25 科大讯飞股份有限公司 一种用于分布式处理的高性能通用网络框架的设计方法
CN104796395A (zh) * 2014-06-11 2015-07-22 合肥星服信息科技有限责任公司 一种瞬间大规模网络连接的处理方法
CN104506490A (zh) * 2014-11-27 2015-04-08 北京极科极客科技有限公司 一种路由器内核下的代理方法及装置
CN105991676B (zh) * 2015-01-30 2019-04-09 阿里巴巴集团控股有限公司 数据的获取方法和装置
CN108631947B (zh) * 2018-05-21 2021-06-25 南京大学 一种基于纠删码的rdma网络数据传输方法
CN112003767A (zh) * 2020-08-14 2020-11-27 上海许继电气有限公司 一种模拟报文发送方法
CN114827035A (zh) * 2022-05-05 2022-07-29 浪潮通信信息***有限公司 一种网元通信方法、装置及计算机介质
CN116962512B (zh) * 2023-09-20 2024-01-05 北京信安世纪科技股份有限公司 报文处理方法、设备、存储介质和装置

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1440167A (zh) * 2003-03-28 2003-09-03 北京港湾网络有限公司 宽带通信数据传输方法
CN1997030A (zh) * 2006-12-13 2007-07-11 武汉虹旭信息技术有限责任公司 用于http数据还原的方法

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1440167A (zh) * 2003-03-28 2003-09-03 北京港湾网络有限公司 宽带通信数据传输方法
CN1997030A (zh) * 2006-12-13 2007-07-11 武汉虹旭信息技术有限责任公司 用于http数据还原的方法

Also Published As

Publication number Publication date
CN101282300A (zh) 2008-10-08

Similar Documents

Publication Publication Date Title
CN101282300B (zh) 一种基于非阻塞机制的http报文处理方法
DE60030767T2 (de) Datenzuweisung zu threads in einem multi-threaded netzwerkprozessor
DE69606648T2 (de) Verfahren und vorrichtung zur ablauffolgen von multiprozessoren mit starker affinität
Larson et al. Memory allocation for long-running server applications
DE68927375T2 (de) Arbitrierung von Übertragungsanforderungen in einem Multiprozessor-Rechnersystem
DE60006270T2 (de) Parallele prozessorarchitektur
DE112012003961T5 (de) Gleichzeitige Verarbeitung von eingereihten Nachrichten
CN110908788A (zh) 基于Spark Streaming的数据处理方法、装置、计算机设备及存储介质
CN102662725B (zh) 一种事件驱动的高并发流程虚拟机实现方法
DE102012210895A1 (de) Vorhersage der ungeordneten Parallelverarbeitung der Befehle von Threads in einem Multithread-Prozessor
US20110145312A1 (en) Server architecture for multi-core systems
CN106454354B (zh) 一种avs2并行编码处理***及方法
CN108268468B (zh) 一种大数据的分析方法及***
CN109857565A (zh) 数据处理方法、装置、计算机设备及存储介质
CN111416858B (zh) 一种媒体资源的处理平台、方法、装置和服务器
Hruby et al. On Sockets and System Calls: Minimizing Context Switches for the Socket {API}
Liu et al. Optimizing shuffle in wide-area data analytics
Li et al. {MilliSort} and {MilliQuery}:{Large-Scale}{Data-Intensive} Computing in Milliseconds
CN113342839A (zh) 数据处理方法、装置、终端设备和存储介质
CN112613276A (zh) 一种流式文档解析的并行执行方法及***
CA2382728A1 (en) Efficient event waiting
CN112486996B (zh) 面向对象的内存数据存储***
Denis Scalability of the NewMadeleine communication library for large numbers of MPI point-to-point requests
DE102023105563A1 (de) Arrays kooperativer gruppen
CN111131243B (zh) Dpi***策略处理方法及装置

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant
C17 Cessation of patent right
CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20101208

Termination date: 20140303