欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

Ssl非阻塞通信方法及用于ssl非阻塞通信的服務(wù)器的制作方法

文檔序號:7682521閱讀:345來源:國知局
專利名稱:Ssl非阻塞通信方法及用于ssl非阻塞通信的服務(wù)器的制作方法
技術(shù)領(lǐng)域
本申請涉及網(wǎng)絡(luò)通信的技術(shù)領(lǐng)域,特別是涉及一種SSL非阻塞通信的方法,以及一種用于SSL非阻塞通信的服務(wù)器。
背景技術(shù)
SSL (Secure Sockets Layer安全套接層)是為網(wǎng)絡(luò)通信提供安全及數(shù)據(jù)完整性的一種安全協(xié)議,用以保障在Internet上數(shù)據(jù)傳輸之安全,其利用數(shù)據(jù)加密(Encryption)技術(shù),可確保數(shù)據(jù)在網(wǎng)絡(luò)上之傳輸過程中不易被截取及竊聽。它已被廣泛地用于Web瀏覽器與服務(wù)器之間的身份認(rèn)證和加密數(shù)據(jù)傳輸。 SSL協(xié)議位于TCP/IP協(xié)議與各種應(yīng)用層協(xié)議之間,為數(shù)據(jù)通訊提供安全支持。SSL協(xié)議可分為兩層第一層SSL記錄協(xié)議(SSL Record Protocol),它建立在可靠的傳輸協(xié)議(如TCP)之上,為高層協(xié)議提供數(shù)據(jù)封裝、壓縮、加密等基本功能的支持。第二層SSL握手協(xié)議(SSL Handshake Protocol),它建立在SSL記錄協(xié)議之上,用于在實(shí)際的數(shù)據(jù)傳輸開始前,通訊雙方進(jìn)行身份認(rèn)證、協(xié)商加密算法、交換加密密鑰等。SSL協(xié)議提供的服務(wù)主要有1)認(rèn)證用戶和服務(wù)器,確保數(shù)據(jù)發(fā)送到正確的客戶機(jī)和服務(wù)器;2)加密數(shù)據(jù)以防止數(shù)據(jù)中途被竊??;3)維護(hù)數(shù)據(jù)的完整性,確保數(shù)據(jù)在傳輸過程中不被改變。目前,基于SSL協(xié)議的通信方式主要包括阻塞通信方式和非阻塞通信方式JDK (Java Development Kit)中的 SSLServerSocket 和 SSLSocket 就提供了 SSL協(xié)議通訊的面向字節(jié)流的阻塞實(shí)現(xiàn)。對于用SSLServerSocket及SSLSocket編寫的服務(wù)器程序和客戶程序,他們在運(yùn)行過程中常常會阻塞。例如,當(dāng)一個(gè)線程執(zhí)行SSLServerSocket的accept ()方法時(shí),假如沒有客戶連接,該線程就會一直等到有客戶連接才從accept ()方法返回;再例如,當(dāng)線程執(zhí)行SSLSocket的readO方法時(shí),如果輸入流中沒有數(shù)據(jù),該線程就會一直等到讀入足夠的數(shù)據(jù)才從readO方法返回。假如服務(wù)器程序需要同時(shí)與多個(gè)客戶通信,就必須分配多個(gè)工作線程,讓他們分別負(fù)責(zé)與一個(gè)客戶通信,當(dāng)然每個(gè)工作線程都有可能經(jīng)常處于長時(shí)間的阻塞狀態(tài)。對于SSL阻塞通信的方式而言,通常需要較大的系統(tǒng)開銷,并且工作線程的許多時(shí)間都浪費(fèi)在阻塞I/o操作上,從而導(dǎo)致性能較慢,通信效率較低。再者,JDK的SSLServerSocket隱藏了 SSL協(xié)議的握手交互過程,將SSL協(xié)議的握手交互過程做了高度的封裝,從而導(dǎo)致相關(guān)技術(shù)人員無法查看具體的握手交互過程,無法獲取到握手交互過程中的相關(guān)報(bào)文。然而,在諸多面向SSL協(xié)議的應(yīng)用中,都需要通過獲知具體的握手交互過程及相關(guān)報(bào)文,來處理基于SSL協(xié)議的握手交互。例如,對電子商務(wù)平臺中使用的秒殺器產(chǎn)生的https請求分析,或者,對其他爬蟲軟件模擬的https請求分析,或者,建立支持SSL協(xié)議的服務(wù)器等。SSL非阻塞通信的方式在JDK的I. 4版被引入Java語言,采用這種方式,服務(wù)器程序接收客戶連接,客戶程序建立與服務(wù)器的連接,以及服務(wù)器程序和客戶程序收發(fā)數(shù)據(jù)的操作都可以按非阻塞的方式進(jìn)行。并且,服務(wù)器程序只需要?jiǎng)?chuàng)建一個(gè)線程,就能完成同時(shí)與多個(gè)客戶通信的任務(wù)。盡管SSL非阻塞通信的方式解決了 SSL阻塞通信方式所存在的系統(tǒng)開銷大、性能較慢、通信效率較低的問題,但是在安全上不支持SSL協(xié)議的握手交互。具體而言,由于JDK的I. 4版中通過新的I/O庫(JavaNIO)實(shí)現(xiàn)非阻塞通信,NIO庫包含了文件、管道以及客戶機(jī)和服務(wù)器套接字的非阻塞功能,然而,庫中缺少的一個(gè)特性是安全的非阻塞套接字連接。在Java NIO庫中沒有建立安全的非阻塞通道類,故不能使用安全的非阻塞通信。因此,目前需要本領(lǐng)域技術(shù)人員迫切解決的一個(gè)技術(shù)問題就是提出一種可以支持SSL協(xié)議握手交互的非阻塞通信機(jī)制,既能保證進(jìn)行SSL協(xié)議非阻塞的高性能通訊,又能控制整個(gè)SSL協(xié)議的握手交互過程,并易于獲取握手交互 過程中的相關(guān)報(bào)文。

發(fā)明內(nèi)容
本申請所要解決的技術(shù)問題是提供一種SSL非阻塞通信的方法,用以保證進(jìn)行SSL協(xié)議非阻塞的高性能通訊,又能控制整個(gè)SSL協(xié)議的握手交互過程,并易于獲取握手交互過程中的相關(guān)報(bào)文。本申請還提供了一種用于SSL非阻塞通信的服務(wù)器,用以保證上述方法在實(shí)際中的應(yīng)用及實(shí)現(xiàn)。為了解決上述問題,本申請公開了一種SSL非阻塞通信的方法,包括步驟S101、服務(wù)器監(jiān)聽網(wǎng)絡(luò)I/O事件,并獲取所監(jiān)聽到網(wǎng)絡(luò)I/O事件的類型;若為連接事件,則執(zhí)行步驟S102 ;若為讀事件,則執(zhí)行步驟S103 ;若為寫事件,則執(zhí)行步驟SllO ;步驟S102、依據(jù)所述連接事件注冊讀事件,返回步驟SlOl ;步驟S103、執(zhí)行從網(wǎng)絡(luò)中獲取第一加密數(shù)據(jù)的讀操作,并將所述第一加密數(shù)據(jù)寫入預(yù)置的緩沖區(qū)中,轉(zhuǎn)步驟S104 ;步驟S104、依據(jù)預(yù)設(shè)的SSL握手過程獲取當(dāng)前握手狀態(tài),若所述握手狀態(tài)為數(shù)據(jù)解密,則執(zhí)行步驟S105 ;若所述握手狀態(tài)為數(shù)據(jù)加密,則執(zhí)行步驟S109 ;步驟S105、對所述緩沖區(qū)中的第一加密數(shù)據(jù)進(jìn)行解密,若解密成功,獲得第一數(shù)據(jù),則執(zhí)行步驟S106,若解密不成功,則執(zhí)行步驟S108 ;步驟S106、判斷解密獲得的第一數(shù)據(jù)是否為客戶端請求原文,若是,則結(jié)束本次SSL握手過程;若否,則執(zhí)行步驟S107 ;步驟S107、將所述第一數(shù)據(jù)寫入緩沖區(qū),并返回步驟S104 ;步驟S108、注冊讀事件,并返回步驟SlOl ;步驟S109、對所述緩沖區(qū)中的第一數(shù)據(jù)進(jìn)行加密,獲得第二加密數(shù)據(jù),注冊寫事件,返回步驟SlOl ;步驟S110、執(zhí)行將所述緩沖區(qū)中的第二加密數(shù)據(jù)寫入網(wǎng)絡(luò)的寫操作,轉(zhuǎn)步驟S104。優(yōu)選的,在所述握手狀態(tài)為任務(wù)執(zhí)行操作時(shí),所述的方法還包括步驟SI 11、執(zhí)行當(dāng)前握手任務(wù),執(zhí)行完后返回步驟S104。
優(yōu)選的,所述第一加密數(shù)據(jù)包括加密的客戶端請求原文或客戶端加密的握手報(bào)文;所述第一數(shù)據(jù)為客戶端請求原文或握手報(bào)文;所述第二加密數(shù)據(jù)為服務(wù)器加密的握手報(bào)文。優(yōu)選的,所述緩沖區(qū)包括輸入緩沖區(qū)和輸出緩沖區(qū),所述步驟S103中的第一加密數(shù)據(jù)寫入輸入緩沖區(qū),所述步驟S107中的第一數(shù)據(jù)寫入輸入緩沖區(qū);
所述步驟S109為對輸出緩沖區(qū)中的第一數(shù)據(jù)進(jìn)行加密,在進(jìn)行加密之前,還包括從輸入緩沖區(qū)中讀出第一數(shù)據(jù)并寫入輸出緩沖區(qū);所述步驟SllO為,執(zhí)行將輸出緩沖區(qū)中的第二加密數(shù)據(jù)寫入網(wǎng)絡(luò)的寫操作。優(yōu)選的,所述步驟S105中對緩沖區(qū)中的第一加密數(shù)據(jù)進(jìn)行解密的步驟具體包括從輸入緩沖區(qū)中讀指針的起始位置開始讀取預(yù)設(shè)大小的第一加密數(shù)據(jù);對所讀取的第一加密數(shù)據(jù)進(jìn)行解密。優(yōu)選的,在所述步驟S107將第一數(shù)據(jù)寫入輸入緩沖區(qū)后,還包括將輸入緩沖區(qū)中的讀指針移至第一數(shù)據(jù)的首位。優(yōu)選的,在所述步驟S108,注冊讀事件之前還包括提示當(dāng)前緩沖區(qū)的數(shù)據(jù)不足,將讀指針移至輸入緩沖區(qū)中經(jīng)過解密處理的第一加密數(shù)據(jù)之后。優(yōu)選的,在所述步驟S109對第一數(shù)據(jù)進(jìn)行加密之前,還包括將寫指針移至寫入輸出緩沖區(qū)中的第一數(shù)據(jù)的首位。優(yōu)選的,所述步驟S109中將第一數(shù)據(jù)寫入輸出緩沖區(qū)的步驟為從輸出緩沖區(qū)中寫指針的起始位置開始在輸出緩沖區(qū)中寫入預(yù)設(shè)大小的第一數(shù)據(jù)。本申請還公開了一種用于SSL非阻塞通信的服務(wù)器,包括監(jiān)聽模塊,用于監(jiān)聽網(wǎng)絡(luò)I/O事件,并獲取所監(jiān)聽到網(wǎng)絡(luò)I/O事件的類型;若為連接事件,則觸發(fā)連接事件處理模塊;若為讀事件,則觸發(fā)讀事件處理模塊;若為寫事件,則觸發(fā)寫事件處理模塊;連接事件處理模塊,用于依據(jù)所述連接事件注冊讀事件,然后調(diào)用所述監(jiān)聽模塊;讀事件處理模塊,用于執(zhí)行從網(wǎng)絡(luò)中獲取第一加密數(shù)據(jù)的讀操作,并將所述第一加密數(shù)據(jù)寫入預(yù)置的緩沖區(qū)中,然后觸發(fā)握手控制模塊;握手控制模塊,用于依據(jù)預(yù)設(shè)的SSL握手過程獲取當(dāng)前握手狀態(tài),若所述握手狀態(tài)為數(shù)據(jù)解密,則觸發(fā)解密操作模塊;若所述握手狀態(tài)為數(shù)據(jù)加密,則觸發(fā)加密操作模塊;解密操作模塊,用于對所述緩沖區(qū)中的第一加密數(shù)據(jù)進(jìn)行解密,若解密成功,獲得第一數(shù)據(jù),則觸發(fā)報(bào)文判斷模塊,若解密不成功,則觸發(fā)讀事件注冊模塊;報(bào)文判斷模塊,用于判斷解密獲得的第一數(shù)據(jù)是否為客戶端請求原文,若是,則觸發(fā)結(jié)束模塊;若否,則觸發(fā)緩存寫入模塊;結(jié)束模塊,用于結(jié)束本次SSL握手過程;緩存寫入模塊,用于將所述第一數(shù)據(jù)寫入緩沖區(qū),并調(diào)用握手控制模塊;讀事件注冊模塊,用于注冊讀事件,并調(diào)用監(jiān)聽模塊;加密操作模塊,用于對所述緩沖區(qū)中的第一數(shù)據(jù)進(jìn)行加密,獲得第二加密數(shù)據(jù),注冊寫事件,然后調(diào)用監(jiān)聽模塊;寫事件處理模塊,用于執(zhí)行將所述緩沖區(qū)中的第二加密數(shù)據(jù)寫入網(wǎng)絡(luò)的寫操作,然后調(diào)用握手控制模塊。與現(xiàn)有技術(shù)相比,本申請具有以下優(yōu)點(diǎn)針對現(xiàn)有的SSL非阻塞通·信的方式在安全上不支持SSL協(xié)議的握手交互的問題,本申請直接面向通信底層提供了一種安全的SSL非阻塞通訊的輪循框架,在該輪循框架中,以事件機(jī)制貫穿SSL握手和NIO無阻塞通訊之間,并利用緩沖區(qū)來傳遞數(shù)據(jù)。具體而言,本申請有效整合了 NIO無阻塞和SSLEngine握手的復(fù)雜事件機(jī)制,解決了握手狀態(tài)和情形引發(fā)的通訊事件的處理。在通訊和握手過程中,將緩沖區(qū)做為共同利用的區(qū)域進(jìn)行操作,通過對緩沖區(qū)的讀寫準(zhǔn)備和壓緊處理,高效支持無阻塞通訊和握手交互。從而既能保證進(jìn)行SSL協(xié)議非阻塞的高性能通訊,又能控制整個(gè)SSL協(xié)議的握手交互過程,并易于獲取握手交互過程中的相關(guān)報(bào)文,解決了諸多面向SSL協(xié)議的應(yīng)用問題。


圖I是本申請的一種SSL非阻塞通信的方法實(shí)施例I的步驟流程圖;圖2是本申請的一種SSL非阻塞通信的方法實(shí)施例2的步驟流程圖;圖3是本申請的一種用于SSL非阻塞通信的服務(wù)器的結(jié)構(gòu)框圖。
具體實(shí)施例方式為使本申請的上述目的、特征和優(yōu)點(diǎn)能夠更加明顯易懂,下面結(jié)合附圖和具體實(shí)施方式
對本申請作進(jìn)一步詳細(xì)的說明。為使本領(lǐng)域技術(shù)人員更好地理解本申請,以下簡單介紹本申請非阻塞通信的基本思想假如要同時(shí)做兩件事燒開水和燒粥。燒開水的步驟如下鍋里放水,打開煤氣爐;等待水燒開;//阻塞關(guān)閉煤氣爐,把開水灌到水壺里。燒粥的步驟如下鍋里放水和米,打開煤氣爐;等待粥燒開;//阻塞調(diào)整煤氣爐,改為小火;等待粥燒熟;//阻塞關(guān)閉煤氣爐。為了同時(shí)完成兩件事,一個(gè)方案是同時(shí)請兩個(gè)人分別做其中的一件事,這相當(dāng)于采用多線程來同時(shí)完成多個(gè)任務(wù)。還有一種方案是讓一個(gè)人同時(shí)完成兩件事,這個(gè)人應(yīng)該善于利用一件事的空閑時(shí)間去做另一件事,一刻也不應(yīng)該閑著鍋?zhàn)永锓潘?,打開煤氣爐'11開始燒水
鍋?zhàn)恿Ψ潘兔?,打開煤氣爐'11開始燒粥while (—直等待,直到有水燒開,粥燒開或粥燒熟事件發(fā)生){//阻塞if (水燒開)關(guān)閉煤氣爐,把開水灌到水壺里;if (粥燒開)調(diào)整煤氣爐,改為小火;if■(粥燒熟)關(guān)閉煤氣爐;if (水已經(jīng)燒開并且粥已經(jīng)燒熟) 退出循環(huán);}//這里的煤氣爐可以理解為每件事就有一個(gè)煤氣爐配給這個(gè)人不斷監(jiān)控?zé)盁嗟臓顟B(tài),如果發(fā)生了"水燒開","粥燒開"或"粥燒熟"事件,就去處理這些事件,處理完一件事后進(jìn)行監(jiān)控?zé)盁嗟臓顟B(tài),直到所有的任務(wù)都完成。以上工作方式也可以運(yùn)用到服務(wù)器程序中,服務(wù)器程序只需要一個(gè)線程就能同時(shí)負(fù)責(zé)接收客戶的連接,接收各個(gè)客戶發(fā)送的數(shù)據(jù),以及向各個(gè)客戶發(fā)送響應(yīng)數(shù)據(jù).服務(wù)器程序的處理流程如下while ( 一直等待,直到有接收連接就緒事件,讀就緒事件或?qū)懢途w事件發(fā)生){//阻塞if (有客戶連接)接收客戶的連接'11非阻塞if (某個(gè)Socket的輸入流中有可讀數(shù)據(jù))從輸入流中讀數(shù)據(jù)'11非阻塞if (某個(gè)Socket的輸出流可以寫數(shù)據(jù))向輸出流寫數(shù)據(jù)'11非阻塞}以上處理流程采用了輪詢的工作方式,當(dāng)某一種操作就緒時(shí),就執(zhí)行該操作,否則就查看是否還有其他就緒的操作可以執(zhí)行。線程不會因?yàn)槟骋粋€(gè)操作還沒有就緒,就進(jìn)入阻塞狀態(tài),一直等待這個(gè)操作就緒。為了使輪詢的工作方式順利進(jìn)行,接收客戶的連接,從輸入流讀數(shù)據(jù),以及,向輸出流寫數(shù)據(jù)的操作都應(yīng)該以非阻塞的方式運(yùn)行。所謂非阻塞,就是指當(dāng)線程執(zhí)行這些方法時(shí),如果操作還沒有就緒,就立即返回,而不會一直等到操作就緒。例如,當(dāng)線程接收客戶連接時(shí),如果沒有客戶連接,就立即返回;再例如,當(dāng)線程從輸入流中讀數(shù)據(jù)時(shí),如果輸入流中還沒有數(shù)據(jù),就立即返回,或者如果輸入流還沒有足夠的數(shù)據(jù),那么就讀取現(xiàn)有的數(shù)據(jù),然后返回。以上while條件中的操作還是按照阻塞方式進(jìn)行的,如果未發(fā)生任何事件,就會進(jìn)入阻塞狀態(tài),直到接收連接事件,讀事件或?qū)懯录兄辽儆幸粋€(gè)事件發(fā)生時(shí),才會執(zhí)行while循環(huán)體中的操作。在while循環(huán)體中,一般會包含在特定條件下退出循環(huán)的操作。本申請的核心構(gòu)思之一在于,直接面向通信底層提供一種實(shí)現(xiàn)SSL非阻塞通訊的輪循框架,在該輪循框架中,以事件機(jī)制貫穿SSL握手和NIO通訊之間,并利用緩沖區(qū)來傳遞數(shù)據(jù),從而既能保證進(jìn)行SSL協(xié)議非阻塞的高性能通訊,又能控制整個(gè)SSL協(xié)議的握手交互過程,并易于獲取握手交互過程中的相關(guān)報(bào)文,解決了諸多面向SSL協(xié)議的應(yīng)用問題。參考圖1,示出了本申請的一種SSL非阻塞通信的方法實(shí)施例I的步驟流程圖,具體可以包括以下步驟步驟S101、服務(wù)器監(jiān)聽網(wǎng)絡(luò)I/O事件,并獲取所監(jiān)聽到網(wǎng)絡(luò)I/O事件的類型;若為連接事件,則執(zhí)行步驟S102 ;若為讀事件,則執(zhí)行步驟S103 ;若為寫事件,執(zhí)則行步驟SllO ;在具體實(shí)現(xiàn)中,可以建立一個(gè)基于java.nio包(新I/O包)的非阻塞服務(wù)器,該服務(wù)器接收客戶端連接,客戶端建立與服務(wù)器的連接,以及服務(wù)器和客戶端收發(fā)數(shù)據(jù)的操作都可以按非阻塞的方式進(jìn)行。非阻塞的通信機(jī)制主要由java.nio包中支持非阻塞通信的類實(shí)現(xiàn),如 Selector 和 SelectionKey 等。
在所述服務(wù)器上可以設(shè)置監(jiān)聽端口,并定義需要監(jiān)聽的網(wǎng)絡(luò)I/O事件,當(dāng)監(jiān)聽到某個(gè)事件發(fā)生時(shí),則處理這個(gè)事件。所述“監(jiān)聽”可以理解為不停地選擇搜索到的事件信息。作為本申請實(shí)施例應(yīng)用的一種示例,可以通過向選擇器Selector注冊網(wǎng)絡(luò)I/0事件來委托Selector監(jiān)控網(wǎng)絡(luò)I/O事件,Selector則會監(jiān)聽這些事件,獲取所監(jiān)聽到網(wǎng)絡(luò)I/O事件的類型,并依據(jù)類型設(shè)置SelectionKey。具體而言,Selector采用了多路復(fù)用(Multiplexing)技術(shù),可在一個(gè)選擇器上處理多個(gè)套接字,通過獲取讀寫通道來進(jìn)行10操作。當(dāng)向Selector注冊事件時(shí),可以在參數(shù)中指定SelectionKey感興趣的事件,從而創(chuàng)建一個(gè)SelectionKey對象,這個(gè)SelectionKey對象是用來跟蹤注冊事件的句柄,SelectionKey對象的有效期間,Selector會一直監(jiān)控與SelectionKey對象相關(guān)的事件。在本申請一種優(yōu)選的實(shí)施例中,所述網(wǎng)絡(luò)1/0事件包括如下三種類型連接事件accept :當(dāng)客戶端請求被服務(wù)器接受后觸發(fā)該事件。該事件表明一個(gè)新的客戶端與服務(wù)器正式建立連接。讀事件read :表示網(wǎng)絡(luò)中已經(jīng)有了可讀數(shù)據(jù),可以執(zhí)行讀操作了 ;以及,寫事件write :表示已經(jīng)可以向網(wǎng)絡(luò)寫數(shù)據(jù)了。相應(yīng)的SelectionKey 為SelectionKey. 0P_ACCEPT :連接事件,SelectionKey.0P_READ :讀事件,以及,SelectionKey. 0P_WRITE :寫事件。步驟S102、依據(jù)所述連接事件注冊讀事件,返回步驟SlOl ;在具體實(shí)現(xiàn)中,當(dāng)檢測到客戶端的HTTPS的訪問請求時(shí),將接受該連接事件響應(yīng),并注冊感興趣事件為讀事件,然后返回由服務(wù)器繼續(xù)監(jiān)聽。其中,HTTPS(Secure HypertextTransfer Protocol,安全超文本傳輸協(xié)議)是以安全為目標(biāo)的HTTP通道,即HTTP下加入SSL層,用于對數(shù)據(jù)進(jìn)行壓縮和解壓操作,并返回網(wǎng)絡(luò)上傳送回的結(jié)果。作為具體應(yīng)用的一種示例,可以通過以下代碼向Selector注冊讀事件SelectionKey key = SSLServerSocket. register (selector, SelectionKey. 0P_READ)步驟S103、執(zhí)行從網(wǎng)絡(luò)中獲取第一加密數(shù)據(jù)的讀操作,并將所述第一加密數(shù)據(jù)寫入預(yù)置的緩沖區(qū)中,轉(zhuǎn)步驟S104 ;當(dāng)服務(wù)器監(jiān)聽到讀事件時(shí),表示網(wǎng)絡(luò)中已經(jīng)有了可讀數(shù)據(jù),可以執(zhí)行讀操作了,于是從網(wǎng)絡(luò)中讀取客戶端發(fā)送的第一加密數(shù)據(jù)。在具體實(shí)現(xiàn)中,所述第一加密數(shù)據(jù)為客戶端加密的客戶端請求原文或客戶端加密的握手報(bào)文,并且通常為字節(jié)流數(shù)據(jù)。在本申請實(shí)施例中,所述網(wǎng)絡(luò)可以理解為通道(channel),即當(dāng)服務(wù)器與某個(gè)客戶端建立連接后,則在該客戶端與服務(wù)器之間打開了一個(gè)通道。通道可以用來連接緩沖區(qū)與數(shù)據(jù)源或數(shù)據(jù)匯(數(shù)據(jù)目的地),也就是說,數(shù)據(jù)源的數(shù)據(jù)可以經(jīng)過通道到達(dá)緩沖區(qū),緩沖區(qū)的數(shù)據(jù)經(jīng)過通道到達(dá)數(shù)據(jù)匯,本步驟即為客戶端(數(shù)據(jù)源)發(fā)送的數(shù)據(jù)經(jīng)過通道到達(dá)緩沖區(qū)。具體可以采用參數(shù)read(ByteBufTerbufTer)來接收第一加密數(shù)據(jù),把它們存放到參數(shù)指定的緩沖區(qū)ByteBuffer 中。在非阻塞模式下,讀操作采用能讀到多少數(shù)據(jù)就讀多少數(shù)據(jù)的原則,具體可以通SreadO方法實(shí)現(xiàn)。read()方法讀取當(dāng)前通道中的可讀數(shù)據(jù),有可能不足r個(gè)字節(jié)(r為完整報(bào)文的字節(jié)),或者為0個(gè)字節(jié),read()方法總是立即返回,而不會等到讀取了 I■個(gè)字節(jié)再返回。步驟S104、依據(jù)預(yù)設(shè)的SSL握手過程獲取當(dāng)前握手狀態(tài),若所述握手狀態(tài)為數(shù)據(jù) 解密,則執(zhí)行步驟S105 ;若所述握手狀態(tài)為數(shù)據(jù)加密,則執(zhí)行步驟S109 ;在具體實(shí)現(xiàn)中,SSL握手過程可以在SSL握手引擎(SSLEngine)中設(shè)置,由SSLEngine控制SSL握手過程,并進(jìn)行握手狀態(tài)檢測和處理。公知的是,一次SSL連接的完整過程包括單向認(rèn)證客戶端向服務(wù)器發(fā)送消息,服務(wù)器接到消息后,用服務(wù)器的密鑰庫中的私鑰對數(shù)據(jù)進(jìn)行加密,然后把加密后的數(shù)據(jù)和服務(wù)器的公鑰一起發(fā)送到客戶端,客戶端用服務(wù)器發(fā)送來的公鑰對數(shù)據(jù)解密,然后再用傳到客戶端的服務(wù)器公鑰對數(shù)據(jù)加密傳給服務(wù)器,服務(wù)器用私鑰對數(shù)據(jù)進(jìn)行解密。雙向認(rèn)證(I)客戶端向服務(wù)器發(fā)送消息,首先把消息用客戶端證書加密然后連同時(shí)把客戶端證書一起發(fā)送到服務(wù)器;(2)服務(wù)器接到消息后首先用客戶端證書把消息解密,然后用服務(wù)器私鑰把消息加密,把服務(wù)器證書和消息一起發(fā)送到客戶端;(3)客戶端用發(fā)來的服務(wù)器證書對消息進(jìn)行解密,然后用服務(wù)器的證書對消息加密,然后在用客戶端的證書對消息在進(jìn)行一次加密,連同加密消息和客戶端證書一起發(fā)送到服務(wù)器;(4)服務(wù)器首先用客戶端傳來的證書對消息進(jìn)行解密,確保消息是這個(gè)客戶發(fā)來的,然后用服務(wù)器的私鑰對消息再進(jìn)行解密這個(gè)便得到了明文數(shù)據(jù)??梢钥闯?,基于SSLEngine檢測到的握手狀態(tài)至少可以包括數(shù)據(jù)加密(如服務(wù)器用私鑰對數(shù)據(jù)進(jìn)行加密)和數(shù)據(jù)解密(如服務(wù)器用私鑰對數(shù)據(jù)進(jìn)行解密)。步驟S105、對所述緩沖區(qū)中的第一加密數(shù)據(jù)進(jìn)行解密,若解密成功,獲得第一數(shù)據(jù),則執(zhí)行步驟S106,若解密不成功,則執(zhí)行步驟S108 ;當(dāng)檢測到的握手狀態(tài)為數(shù)據(jù)解密時(shí),則針對緩沖區(qū)中的第一加密數(shù)據(jù),如加密的客戶端請求原文或加密的握手報(bào)文進(jìn)行解密,若解密成功,則獲得第一數(shù)據(jù)為客戶端請求原文或握手報(bào)文。步驟S106、判斷解密獲得的第一數(shù)據(jù)是否為客戶端請求原文,若是,則結(jié)束本次SSL握手過程;若否,則執(zhí)行步驟S107 ;
步驟S107、將所述第一數(shù)據(jù)寫入緩沖區(qū),并返回步驟S104 ;若解密獲得的第一數(shù)據(jù)為客戶端請求原文,則可以結(jié)束本次SSL握手過程;若解密獲得的第一數(shù)據(jù)為握手報(bào)文,則將該握手報(bào)文寫入緩沖區(qū),返回SSLEngine檢測的步驟以進(jìn)行下一步握手操作,如進(jìn)行數(shù)據(jù)加密操作,即在下一步握手操作中對該握手報(bào)文進(jìn)行服務(wù)器加密。步驟S108、注冊讀事件,并返回步驟SlOl ;如果對所述緩沖區(qū)中的第一加密數(shù)據(jù)解密不成功,通常表示寫入緩沖區(qū)中的第一加密數(shù)據(jù)不是完整的加密報(bào)文,需要繼續(xù)從網(wǎng)絡(luò)中獲得第一加密數(shù)據(jù),因而注冊一個(gè)讀事件,然后返回服務(wù)器監(jiān)聽網(wǎng)絡(luò)I/O事件的步驟。步驟S109、對所述緩沖區(qū)中的第一數(shù)據(jù)進(jìn)行加密,獲得第二加密數(shù)據(jù),注冊寫事件,返回步驟SlOl ;
當(dāng)檢測到的握手狀態(tài)為數(shù)據(jù)加密時(shí),則針對緩沖區(qū)中的第一數(shù)據(jù),如握手報(bào)文進(jìn)行加密,則獲得第二加密數(shù)據(jù)為服務(wù)器加密的握手報(bào)文。由于需要將所述第二加密數(shù)據(jù)寫入網(wǎng)絡(luò),因而注冊一個(gè)寫事件,然后返回服務(wù)器監(jiān)聽網(wǎng)絡(luò)I/O的步驟。步驟S110、執(zhí)行將所述緩沖區(qū)中的第二加密數(shù)據(jù)寫入網(wǎng)絡(luò)的寫操作,轉(zhuǎn)步驟S104。當(dāng)服務(wù)器監(jiān)聽到寫事件時(shí),表示已經(jīng)可以向網(wǎng)絡(luò)寫數(shù)據(jù)了,于是將緩沖區(qū)中的第二加密數(shù)據(jù)寫入網(wǎng)絡(luò)。在具體實(shí)現(xiàn)中,所述第二加密數(shù)據(jù)為服務(wù)器加密的握手報(bào)文,具體可以采用write (ByteBuffer buffer):把指定的緩沖區(qū)ByteBuffer中的第二加密數(shù)據(jù)發(fā)送出去。在非阻塞模式下,寫操作奉行能輸出多少數(shù)據(jù)就輸出多少數(shù)據(jù)的原則,具體可以通過write ()方法實(shí)現(xiàn)。write ()方法向通道輸出數(shù)據(jù),有可能不足r個(gè)字節(jié)(r為完整報(bào)文的字節(jié)),或者為0個(gè)字節(jié),write ()方法總是立即返回,而不會等到輸出r個(gè)字節(jié)后再返回。在具體實(shí)現(xiàn)中,服務(wù)器接受客戶端請求,同時(shí)將讀、寫通道提交由相應(yīng)的讀線程(Reader)和寫服務(wù)線程(Writer),由讀寫線程分別完成對客戶端數(shù)據(jù)的讀取和對客戶端的回應(yīng)操作。具體而言,服務(wù)器接受客戶端請求后,控制線程將該請求的讀通道交給讀線程池,由讀線程池分配線程完成對客戶端數(shù)據(jù)的讀取操作;當(dāng)讀線程完成讀操作后,將數(shù)據(jù)返回控制線程,進(jìn)行服務(wù)器的業(yè)務(wù)處理;完成業(yè)務(wù)處理后,將需回應(yīng)給客戶端的數(shù)據(jù)和寫通道提交給寫線程池,由寫線程完成向客戶端發(fā)送回應(yīng)數(shù)據(jù)的操作。由于網(wǎng)絡(luò)帶寬等原因,在通道的讀、寫操作中是容易出現(xiàn)等待的,所以在讀、寫操作中引入多線程,對性能提高明顯,而且可以提高客戶端的感知服務(wù)質(zhì)量。參考圖2,示出了本申請的一種SSL非阻塞通信的方法實(shí)施例2的步驟流程圖,具體可以包括步驟S201、服務(wù)器監(jiān)聽網(wǎng)絡(luò)I/O事件,并獲取所監(jiān)聽到網(wǎng)絡(luò)I/O事件的類型;若為連接事件,則執(zhí)行步驟S202 ;若為讀事件,則執(zhí)行步驟S203 ;若為寫事件,執(zhí)則行步驟S210 ;步驟S202、依據(jù)所述連接事件注冊讀事件,返回步驟S201 ;步驟S203、執(zhí)行從網(wǎng)絡(luò)中獲取第一加密數(shù)據(jù)的讀操作,并將所述第一加密數(shù)據(jù)寫入預(yù)置的輸入緩沖區(qū)中,轉(zhuǎn)步驟S204 ;步驟S204、依據(jù)預(yù)設(shè)的SSL握手過程獲取當(dāng)前握手狀態(tài),若所述握手狀態(tài)為數(shù)據(jù)解密,則執(zhí)行步驟S205 ;若所述握手狀態(tài)為數(shù)據(jù)加密,則執(zhí)行步驟S209 ;若所述握手狀態(tài)為任務(wù)執(zhí)行操作時(shí),則執(zhí)行步驟S211 ;步驟S205、從輸入緩沖區(qū)中讀指針的起始位置開始讀取預(yù)設(shè)大小的第一加密數(shù)據(jù),對所讀取的第一加密數(shù)據(jù)進(jìn)行解密,若解密成功,獲得第一數(shù)據(jù),則執(zhí)行步驟S206,若解密不成功,則執(zhí)行步驟S208 ;步驟S206、判斷解密獲得的第一數(shù)據(jù)是否為客戶端請求原文,若是,則結(jié)束本次SSL握手過程;若否,則執(zhí)行步驟S207 ;步驟S207、將所述第一數(shù)據(jù)寫入輸入緩沖區(qū),并將輸入緩沖區(qū)中的讀指針移至第一數(shù)據(jù)的首位,返回步驟S204; 步驟S208、提示當(dāng)前緩沖區(qū)的數(shù)據(jù)不足,將讀指針移至輸入緩沖區(qū)中經(jīng)過解密處理的第一加密數(shù)據(jù)之后,然后注冊讀事件,并返回步驟S201 ;步驟S209、從輸入緩沖區(qū)中讀出第一數(shù)據(jù),并從輸出緩沖區(qū)中寫指針的起始位置開始在輸出緩沖區(qū)中寫入預(yù)設(shè)大小的第一數(shù)據(jù),對所述輸出緩沖區(qū)中的第一數(shù)據(jù)進(jìn)行加密,獲得第二加密數(shù)據(jù),注冊寫事件,返回步驟S201 ;步驟S210、執(zhí)行將輸出緩沖區(qū)中的第二加密數(shù)據(jù)寫入網(wǎng)絡(luò)的寫操作,將寫指針移至輸出緩沖區(qū)中已寫入網(wǎng)絡(luò)的第二加密數(shù)據(jù)之后,然后轉(zhuǎn)步驟S204。步驟S211、執(zhí)行當(dāng)前握手任務(wù),執(zhí)行完后返回步驟S204。例如,所述握手任務(wù)為獲取密鑰套件或獲取證書,則服務(wù)器執(zhí)行相應(yīng)的獲取密鑰套件或獲取證書的操作。為使本領(lǐng)域技術(shù)人員更好地理解本申請,以下通過一個(gè)具體例子說明。(一)服務(wù)器監(jiān)聽到連接事件,接受所述連接事件響應(yīng)并注冊讀事件,然后繼續(xù)監(jiān)聽。(二)服務(wù)器監(jiān)聽到讀事件,表示可以執(zhí)行讀操作了,于是執(zhí)行從網(wǎng)絡(luò)中獲取第一加密數(shù)據(jù)的讀操作,并將所述第一加密數(shù)據(jù)寫入預(yù)置的緩沖區(qū)中;其中,第一加密數(shù)據(jù)為客戶端加密的請求原文或客戶端加密的握手報(bào)文;然后,基于SSLEngine檢測當(dāng)前的握手狀態(tài),若為服務(wù)器采用私鑰進(jìn)行數(shù)據(jù)解密,則采用預(yù)置的私鑰對所述第一加密數(shù)據(jù)進(jìn)行解密,若解密獲得的是客戶端請求原文,表示握手已經(jīng)完成,于是結(jié)束本次的SSL握手過程;若解密獲得的是握手報(bào)文,則將該握手報(bào)文寫入輸入緩沖區(qū),然后返回由SSLEngine繼續(xù)檢測握手狀態(tài)。若解密不成功,則表示當(dāng)前輸入緩沖區(qū)中的數(shù)據(jù)不是完整的報(bào)文,需要注冊讀事件以獲取更多的網(wǎng)絡(luò)數(shù)據(jù),于是將輸入緩沖區(qū)壓緊(將讀指針放到處理完的數(shù)據(jù)后面),然后注冊讀事件,再返回由服務(wù)器繼續(xù)監(jiān)聽網(wǎng)絡(luò)1/0事件;如果SSLEngine檢測當(dāng)前的握手狀態(tài)為服務(wù)器采用私鑰進(jìn)行數(shù)據(jù)加密,于是對輸出緩沖區(qū)進(jìn)行讀寫準(zhǔn)備(調(diào)整輸出緩沖區(qū)的寫指針,獲取寫指針對應(yīng)的數(shù)據(jù)位置),將輸出緩沖區(qū)中的握手報(bào)文采用私鑰進(jìn)行加密后,注冊寫事件,返回由服務(wù)器繼續(xù)監(jiān)聽網(wǎng)絡(luò)1/0事件。(三)服務(wù)器監(jiān)聽到寫事件,表示可以執(zhí)行寫操作了,于是將輸出緩沖區(qū)中的第二加密數(shù)據(jù)寫入網(wǎng)絡(luò),寫入后再將輸出緩存壓緊,返回SSLEngine檢測的步驟進(jìn)行輪循。需要說明的是,對于方法實(shí)施例,為了簡單描述,故將其都表述為一系列的動(dòng)作組合,但是本領(lǐng)域技術(shù)人員應(yīng)該知悉,本申請并不受所描述的動(dòng)作順序的限制,因?yàn)橐罁?jù)本申請,某些步驟可以采用其他順序或者同時(shí)進(jìn)行。其次,本領(lǐng)域技術(shù)人員也應(yīng)該知悉,說明書中所描述的實(shí)施例均屬于優(yōu)選實(shí)施例,所涉及的動(dòng)作和模塊并不一定是本申請所必須的。參考圖3,示出了本申請的一種用于SSL非阻塞通信的服務(wù)器的結(jié)構(gòu)框圖,具體可以包括以下模塊監(jiān)聽模塊301,用于監(jiān)聽網(wǎng)絡(luò)I/O事件,并獲取所監(jiān)聽到網(wǎng)絡(luò)I/O事件的類型;若為連接事件,則觸發(fā)連接事件處理模塊302 ;若為讀事件,則觸發(fā)讀事件處理模塊303 ;若為寫事件,則觸發(fā)寫事件處理模塊310 ;連接事件處理模塊302,用于依據(jù)所述連接事件注冊讀事件,然后調(diào)用所述監(jiān)聽模 塊 301 ;讀事件處理模塊303,用于執(zhí)行從網(wǎng)絡(luò)中獲取第一加密數(shù)據(jù)的讀操作,并將所述第一加密數(shù)據(jù)寫入預(yù)置的緩沖區(qū)中,然后觸發(fā)握手控制模塊304 ;握手控制模塊304,用于依據(jù)預(yù)設(shè)的SSL握手過程獲取當(dāng)前握手狀態(tài),若所述握手狀態(tài)為數(shù)據(jù)解密,則觸發(fā)解密操作模塊305 ;若所述握手狀態(tài)為數(shù)據(jù)加密,則觸發(fā)加密操作模塊310 ;解密操作模塊305,用于對所述緩沖區(qū)中的第一加密數(shù)據(jù)進(jìn)行解密,若解密成功,獲得第一數(shù)據(jù),則觸發(fā)報(bào)文判斷模塊306,若解密不成功,則觸發(fā)讀事件注冊模塊309 ;報(bào)文判斷模塊306,用于判斷解密獲得的第一數(shù)據(jù)是否為客戶端請求原文,若是,則觸發(fā)結(jié)束模塊307 ;若否,則觸發(fā)緩存寫入模塊308 ;結(jié)束模塊307,用于結(jié)束本次SSL握手過程;緩存寫入模塊308,用于將所述第一數(shù)據(jù)寫入緩沖區(qū),并調(diào)用握手控制模塊304;讀事件注冊模塊309,用于注冊讀事件,并調(diào)用監(jiān)聽模塊301 ;加密操作模塊310,用于對所述緩沖區(qū)中的第一數(shù)據(jù)進(jìn)行加密,獲得第二加密數(shù)據(jù),注冊寫事件,然后調(diào)用監(jiān)聽模塊301 ;寫事件處理模塊311,用于執(zhí)行將所述緩沖區(qū)中的第二加密數(shù)據(jù)寫入網(wǎng)絡(luò)的寫操作,然后調(diào)用握手控制模塊304。在本申請的一種優(yōu)選實(shí)施例中,在所述握手狀態(tài)為任務(wù)執(zhí)行操作時(shí),還包括任務(wù)執(zhí)行模塊,用于執(zhí)行當(dāng)前握手任務(wù),執(zhí)行完后調(diào)用握手控制模塊。在具體實(shí)現(xiàn)中,所述第一加密數(shù)據(jù)可以為加密的客戶端請求原文或客戶端加密的握手報(bào)文;所述第一數(shù)據(jù)可以為客戶端請求原文或握手報(bào)文;所述第二加密數(shù)據(jù)可以為服務(wù)器加密的握手報(bào)文。所述緩沖區(qū)可以包括輸入緩沖區(qū)和輸出緩沖區(qū),所述第一加密數(shù)據(jù)和第一數(shù)據(jù)可以寫入輸入緩沖區(qū),第二加密數(shù)據(jù)可以寫入輸出緩沖區(qū)。由于本實(shí)施例基本相應(yīng)于前述圖I和圖2所不的方法實(shí)施例,故本實(shí)施例的描述中未詳盡之處,可以參見前述實(shí)施例中的相關(guān)說明,在此就不贅述了。需要說明的是,本申請裝置實(shí)施例和系統(tǒng)實(shí)施例中所涉及的模塊、子模塊和單元可以為軟件,可以為硬件,也可以為軟件和硬件的組合。
本申請可用于眾多通用或?qū)S玫挠?jì)算系統(tǒng)環(huán)境或配置中。例如個(gè)人計(jì)算機(jī)、服務(wù)器計(jì)算機(jī)、手持設(shè)備或便攜式設(shè)備、平板型設(shè)備、多處理器系統(tǒng)、基于微處理器的系統(tǒng)、置頂盒、可編程的消費(fèi)電子設(shè)備、網(wǎng)絡(luò)PC、小型計(jì)算機(jī)、大型計(jì)算機(jī)、包括以上任何系統(tǒng)或設(shè)備的分布式計(jì)算環(huán)境等等。本申請可以在由計(jì)算機(jī)執(zhí)行的計(jì)算機(jī)可執(zhí)行指令的一般上下文中描述,例如程序模塊。一般地,程序模塊包括執(zhí)行特定任務(wù)或?qū)崿F(xiàn)特定抽象數(shù)據(jù)類型的例程、程序、對象、組件、數(shù)據(jù)結(jié)構(gòu)等等。也可以在分布式計(jì)算環(huán)境中實(shí)踐本申請,在這些分布式計(jì)算環(huán)境中,由通過通信網(wǎng)絡(luò)而被連接的遠(yuǎn)程處理設(shè)備來執(zhí)行任務(wù)。在分布式計(jì)算環(huán)境中,程序模塊可以位于包括存儲設(shè)備在內(nèi)的本地和遠(yuǎn)程計(jì)算機(jī)存儲介質(zhì)中。最后,還需要說明的是,在本文中,諸如第一和第二等之類的關(guān)系術(shù)語僅僅用來將一個(gè)實(shí)體或者操作與另一個(gè)實(shí)體或操作區(qū)分開來,而不一定要求或者暗示這些實(shí)體或操作之間存在任何這種實(shí)際的關(guān)系或者順序。而且,術(shù)語“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過程、方法、物品或者設(shè)備不僅包括那些要素,而且還包括沒有明確列出的其他要素,或者是還包括為這種過程、方法、物品或
者設(shè)備所固有的要素。在沒有更多限制的情況下,由語句“包括一個(gè)......”限定的要素,
并不排除在包括所述要素的過程、方法、物品或者設(shè)備中還存在另外的相同要素。以上對本申請所提供的一種SSL非阻塞通信的方法以及一種用于SSL非阻塞通信的服務(wù)器進(jìn)行了詳細(xì)介紹,本文中應(yīng)用了具體個(gè)例對本申請的原理及實(shí)施方式進(jìn)行了闡述,以上實(shí)施例的說明只是用于幫助理解本申請的方法及其核心思想;同時(shí),對于本領(lǐng)域的一般技術(shù)人員,依據(jù)本申請的思想,在具體實(shí)施方式
及應(yīng)用范圍上均會有改變之處,綜上所述,本說明書內(nèi)容不應(yīng)理解為對本申請的限制。
權(quán)利要求
1.一種SSL非阻塞通信的方法,其特征在于,包括 步驟S101、服務(wù)器監(jiān)聽網(wǎng)絡(luò)I/O事件,并獲取所監(jiān)聽到網(wǎng)絡(luò)I/O事件的類型;若為連接事件,則執(zhí)行步驟S102 ;若為讀事件,則執(zhí)行步驟S103 ;若為寫事件,則執(zhí)行步驟SllO ;步驟S102、依據(jù)所述連接事件注冊讀事件,返回步驟SlOl ; 步驟S103、執(zhí)行從網(wǎng)絡(luò)中獲取第一加密數(shù)據(jù)的讀操作,并將所述第一加密數(shù)據(jù)寫入預(yù)置的緩沖區(qū)中,轉(zhuǎn)步驟S104 ; 步驟S104、依據(jù)預(yù)設(shè)的SSL握手過程獲取當(dāng)前握手狀態(tài),若所述握手狀態(tài)為數(shù)據(jù)解密,則執(zhí)行步驟S105 ;若所述握手狀態(tài)為數(shù)據(jù)加密,則執(zhí)行步驟S109 ; 步驟S105、對所述緩沖區(qū)中的第一加密數(shù)據(jù)進(jìn)行解密,若解密成功,獲得第一數(shù)據(jù),則執(zhí)行步驟S106,若解密不成功,則執(zhí)行步驟S108 ; 步驟S106、判斷解密獲得的第一數(shù)據(jù)是否為客戶端請求原文,若是,則結(jié)束本次SSL握手過程;若否,則執(zhí)行步驟S107 ; 步驟S107、將所述第一數(shù)據(jù)寫入緩沖區(qū),并返回步驟S104 ; 步驟S108、注冊讀事件,并返回步驟SlOl ; 步驟S109、對所述緩沖區(qū)中的第一數(shù)據(jù)進(jìn)行加密,獲得第二加密數(shù)據(jù),注冊寫事件,返回步驟SlOl ; 步驟S110、執(zhí)行將所述緩沖區(qū)中的第二加密數(shù)據(jù)寫入網(wǎng)絡(luò)的寫操作,轉(zhuǎn)步驟S104。
2.如權(quán)利要求I所述的方法,其特征在于,在所述握手狀態(tài)為任務(wù)執(zhí)行操作時(shí),所述的方法還包括 步驟S111、執(zhí)行當(dāng)前握手任務(wù),執(zhí)行完后返回步驟S104。
3.如權(quán)利要求I或2所述的方法,其特征在于,所述第一加密數(shù)據(jù)包括加密的客戶端請求原文或客戶端加密的握手報(bào)文;所述第一數(shù)據(jù)為客戶端請求原文或握手報(bào)文;所述第二加密數(shù)據(jù)為服務(wù)器加密的握手報(bào)文。
4.如權(quán)利要求3所述的方法,其特征在于,所述緩沖區(qū)包括輸入緩沖區(qū)和輸出緩沖區(qū),所述步驟S103中的第一加密數(shù)據(jù)寫入輸入緩沖區(qū),所述步驟S107中的第一數(shù)據(jù)寫入輸入緩沖區(qū); 所述步驟S109為對輸出緩沖區(qū)中的第一數(shù)據(jù)進(jìn)行加密,在進(jìn)行加密之前,還包括從輸入緩沖區(qū)中讀出第一數(shù)據(jù)并寫入輸出緩沖區(qū); 所述步驟SllO為,執(zhí)行將輸出緩沖區(qū)中的第二加密數(shù)據(jù)寫入網(wǎng)絡(luò)的寫操作。
5.如權(quán)利要求4所述的方法,其特征在于,所述步驟S105中對緩沖區(qū)中的第一加密數(shù)據(jù)進(jìn)行解密的步驟具體包括 從輸入緩沖區(qū)中讀指針的起始位置開始讀取預(yù)設(shè)大小的第一加密數(shù)據(jù); 對所讀取的第一加密數(shù)據(jù)進(jìn)行解密。
6.如權(quán)利要求5所述的方法,其特征在于,在所述步驟S107將第一數(shù)據(jù)寫入輸入緩沖區(qū)后,還包括 將輸入緩沖區(qū)中的讀指針移至第一數(shù)據(jù)的首位。
7.如權(quán)利要求6所述的方法,其特征在于,在所述步驟S108,注冊讀事件之前還包括 提示當(dāng)前緩沖區(qū)的數(shù)據(jù)不足,將讀指針移至輸入緩沖區(qū)中經(jīng)過解密處理的第一加密數(shù)據(jù)之后。
8.如權(quán)利要求7所述的方法,其特征在于,在所述步驟S109對第一數(shù)據(jù)進(jìn)行加密之前,還包括 將寫指針移至寫入輸出緩沖區(qū)中的第一數(shù)據(jù)的首位。
9.如權(quán)利要求4所述的方法,其特征在于,所述步驟S109中將第一數(shù)據(jù)寫入輸出緩沖區(qū)的步驟為 從輸出緩沖區(qū)中寫指針的起始位置開始在輸出緩沖區(qū)中寫入預(yù)設(shè)大小的第一數(shù)據(jù)。
10.一種用于SSL非阻塞通信的服務(wù)器,其特征在于,包括 監(jiān)聽模塊,用于監(jiān)聽網(wǎng)絡(luò)I/o事件,并獲取所監(jiān)聽到網(wǎng)絡(luò)I/O事件的類型;若為連接事件,則觸發(fā)連接事件處理模塊;若為讀事件,則觸發(fā)讀事件處理模塊;若為寫事件,則觸發(fā)寫事件處理模塊; 連接事件處理模塊,用于依據(jù)所述連接事件注冊讀事件,然后調(diào)用所述監(jiān)聽模塊; 讀事件處理模塊,用于執(zhí)行從網(wǎng)絡(luò)中獲取第一加密數(shù)據(jù)的讀操作,并將所述第一加密數(shù)據(jù)寫入預(yù)置的緩沖區(qū)中,然后觸發(fā)握手控制模塊; 握手控制模塊,用于依據(jù)預(yù)設(shè)的SSL握手過程獲取當(dāng)前握手狀態(tài),若所述握手狀態(tài)為數(shù)據(jù)解密,則觸發(fā)解密操作模塊;若所述握手狀態(tài)為數(shù)據(jù)加密,則觸發(fā)加密操作模塊; 解密操作模塊,用于對所述緩沖區(qū)中的第一加密數(shù)據(jù)進(jìn)行解密,若解密成功,獲得第一數(shù)據(jù),則觸發(fā)報(bào)文判斷模塊,若解密不成功,則觸發(fā)讀事件注冊模塊; 報(bào)文判斷模塊,用于判斷解密獲得的第一數(shù)據(jù)是否為客戶端請求原文,若是,則觸發(fā)結(jié)束模塊;若否,則觸發(fā)緩存寫入模塊; 結(jié)束模塊,用于結(jié)束本次SSL握手過程; 緩存寫入模塊,用于將所述第一數(shù)據(jù)寫入緩沖區(qū),并調(diào)用握手控制模塊; 讀事件注冊模塊,用于注冊讀事件,并調(diào)用監(jiān)聽模塊; 加密操作模塊,用于對所述緩沖區(qū)中的第一數(shù)據(jù)進(jìn)行加密,獲得第二加密數(shù)據(jù),注冊寫事件,然后調(diào)用監(jiān)聽模塊; 寫事件處理模塊,用于執(zhí)行將所述緩沖區(qū)中的第二加密數(shù)據(jù)寫入網(wǎng)絡(luò)的寫操作,然后調(diào)用握手控制模塊。
全文摘要
本發(fā)明提供了一種SSL非阻塞通信的方法及用于SSL非阻塞通信的服務(wù)器,所述方法包括服務(wù)器監(jiān)聽網(wǎng)絡(luò)I/O事件,若為連接事件,則注冊讀事件;若為寫事件,則執(zhí)行將所述緩沖區(qū)中的第二加密數(shù)據(jù)寫入網(wǎng)絡(luò)的寫操作,然后依據(jù)預(yù)設(shè)的SSL握手過程獲取當(dāng)前握手狀態(tài),根據(jù)不同握手狀態(tài)執(zhí)行對應(yīng)操作。若為讀事件,則執(zhí)行從網(wǎng)絡(luò)中獲取第一加密數(shù)據(jù)的讀操作,并將所述第一加密數(shù)據(jù)寫入預(yù)置的緩沖區(qū)中,然后依據(jù)預(yù)設(shè)的SSL握手過程獲取當(dāng)前握手狀態(tài),根據(jù)不同握手狀態(tài)執(zhí)行對應(yīng)操作。本發(fā)明既能保證進(jìn)行SSL協(xié)議非阻塞的高性能通訊,又能控制整個(gè)SSL協(xié)議的握手交互過程,并易于獲取握手交互過程中的相關(guān)報(bào)文,解決了諸多面向SSL協(xié)議應(yīng)用的問題。
文檔編號H04L29/06GK102811201SQ201110144979
公開日2012年12月5日 申請日期2011年5月31日 優(yōu)先權(quán)日2011年5月31日
發(fā)明者彭淵 申請人:阿里巴巴集團(tuán)控股有限公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點(diǎn)贊!
1
修水县| 浑源县| 怀仁县| 依兰县| 夏河县| 柯坪县| 固阳县| 安化县| 崇州市| 聊城市| 南京市| 辽阳县| 日土县| 酒泉市| 招远市| 抚松县| 太保市| 岳阳市| 临漳县| 永年县| 石景山区| 桃园市| 滕州市| 中江县| 攀枝花市| 怀远县| 巴楚县| 新河县| 望都县| 固始县| 武威市| 独山县| 青龙| 蓬莱市| 建瓯市| 娄烦县| 宾阳县| 石景山区| 宿州市| 北安市| SHOW|