Jack Jiang

          我的最新工程MobileIMSDK:http://git.oschina.net/jackjiang/MobileIMSDK
          posts - 506, comments - 13, trackbacks - 0, articles - 1

          1、前言

          隨著互聯(lián)網(wǎng)的發(fā)展,面對(duì)海量用戶高并發(fā)業(yè)務(wù),傳統(tǒng)的阻塞式的服務(wù)端架構(gòu)模式已經(jīng)無能為力。本文(和下篇《高性能網(wǎng)絡(luò)編程(六):一文讀懂高性能網(wǎng)絡(luò)編程中的線程模型》)旨在為大家提供有用的高性能網(wǎng)絡(luò)編程的I/O模型概覽以及網(wǎng)絡(luò)服務(wù)進(jìn)程模型的比較,以揭開設(shè)計(jì)和實(shí)現(xiàn)高性能網(wǎng)絡(luò)架構(gòu)的神秘面紗。

          限于篇幅原因,請(qǐng)將本文與《高性能網(wǎng)絡(luò)編程(六):一文讀懂高性能網(wǎng)絡(luò)編程中的線程模型》連起來讀,這樣會(huì)讓知識(shí)更連貫。

          學(xué)習(xí)交流:

          - 即時(shí)通訊開發(fā)交流3群:185926912[推薦]

          - 移動(dòng)端IM開發(fā)入門文章:《新手入門一篇就夠:從零開發(fā)移動(dòng)端IM

          (本文同步發(fā)布于:http://www.52im.net/thread-1935-1-1.html

          2、關(guān)于作者

          陳彩華(caison):主要從事服務(wù)端開發(fā)、需求分析、系統(tǒng)設(shè)計(jì)、優(yōu)化重構(gòu)工作,主要開發(fā)語言是 Java,現(xiàn)任廣州貝聊服務(wù)端研發(fā)工程師。

          關(guān)于廣州貝聊:

          廣州市貝聊信息科技有限公司成立于2013年8月21日,是一家專注于搭建幼兒園家園共育平臺(tái)的信息科技公司。

          公司產(chǎn)品“貝聊”是中國(guó)幼兒園家長(zhǎng)工作平臺(tái),致力于通過互聯(lián)網(wǎng)產(chǎn)品及定制化解決方案,幫助幼兒園解決展示、通知、溝通等家長(zhǎng)工作中的痛點(diǎn),促進(jìn)家園關(guān)系和諧。貝聊是威創(chuàng)股份(A股幼教第一股)、清華啟迪、網(wǎng)易聯(lián)手投資的唯一品牌。

          截止目前,“貝聊”已覆蓋全國(guó)31省份的5萬所幼兒園及機(jī)構(gòu),注冊(cè)用戶超過1000萬,用戶次月留存率高達(dá)74%,復(fù)合增長(zhǎng)率為18.94%,領(lǐng)跑全行業(yè)。

          3、C10K問題系列文章

          本文是C10K問題系列文章中的第5篇,總目錄如下:

          高性能網(wǎng)絡(luò)編程(一):?jiǎn)闻_(tái)服務(wù)器并發(fā)TCP連接數(shù)到底可以有多少

          高性能網(wǎng)絡(luò)編程(二):上一個(gè)10年,著名的C10K并發(fā)連接問題

          高性能網(wǎng)絡(luò)編程(三):下一個(gè)10年,是時(shí)候考慮C10M并發(fā)問題了

          高性能網(wǎng)絡(luò)編程(四):從C10K到C10M高性能網(wǎng)絡(luò)應(yīng)用的理論探索

          高性能網(wǎng)絡(luò)編程(五):一文讀懂高性能網(wǎng)絡(luò)編程中的I/O模型》(本文)

          高性能網(wǎng)絡(luò)編程(六):一文讀懂高性能網(wǎng)絡(luò)編程中的線程模型

          高性能網(wǎng)絡(luò)編程經(jīng)典:《The C10K problem(英文)》[附件下載]

          4、互聯(lián)網(wǎng)服務(wù)端處理網(wǎng)絡(luò)請(qǐng)求的原理

          首先看看一個(gè)典型互聯(lián)網(wǎng)服務(wù)端處理網(wǎng)絡(luò)請(qǐng)求的典型過程:

          由上圖可以看到,主要處理步驟包括: 

          1)獲取請(qǐng)求數(shù)據(jù),客戶端與服務(wù)器建立連接發(fā)出請(qǐng)求,服務(wù)器接受請(qǐng)求(1-3);

          2)構(gòu)建響應(yīng),當(dāng)服務(wù)器接收完請(qǐng)求,并在用戶空間處理客戶端的請(qǐng)求,直到構(gòu)建響應(yīng)完成(4);

          3)返回?cái)?shù)據(jù),服務(wù)器將已構(gòu)建好的響應(yīng)再通過內(nèi)核空間的網(wǎng)絡(luò) I/O 發(fā)還給客戶端(5-7)。

          設(shè)計(jì)服務(wù)端并發(fā)模型時(shí),主要有如下兩個(gè)關(guān)鍵點(diǎn): 

          1)服務(wù)器如何管理連接,獲取輸入數(shù)據(jù);

          2)服務(wù)器如何處理請(qǐng)求。

          以上兩個(gè)關(guān)鍵點(diǎn)最終都與操作系統(tǒng)的 I/O 模型以及線程(進(jìn)程)模型相關(guān),這也是本文和下篇《高性能網(wǎng)絡(luò)編程(六):一文讀懂高性能網(wǎng)絡(luò)編程中的線程模型》將要介紹的內(nèi)容。下面先詳細(xì)介紹這I/O模型。

          5、“I/O 模型”的基本認(rèn)識(shí)

          介紹操作系統(tǒng)的 I/O 模型之前,先了解一下幾個(gè)概念: 

          1)阻塞調(diào)用與非阻塞調(diào)用;

          2)阻塞調(diào)用是指調(diào)用結(jié)果返回之前,當(dāng)前線程會(huì)被掛起,調(diào)用線程只有在得到結(jié)果之后才會(huì)返回;

          3)非阻塞調(diào)用指在不能立刻得到結(jié)果之前,該調(diào)用不會(huì)阻塞當(dāng)前線程。

          兩者的最大區(qū)別在于被調(diào)用方在收到請(qǐng)求到返回結(jié)果之前的這段時(shí)間內(nèi),調(diào)用方是否一直在等待。

          阻塞是指調(diào)用方一直在等待而且別的事情什么都不做;非阻塞是指調(diào)用方先去忙別的事情。

          同步處理與異步處理:同步處理是指被調(diào)用方得到最終結(jié)果之后才返回給調(diào)用方;異步處理是指被調(diào)用方先返回應(yīng)答,然后再計(jì)算調(diào)用結(jié)果,計(jì)算完最終結(jié)果后再通知并返回給調(diào)用方。

          阻塞、非阻塞和同步、異步的區(qū)別(阻塞、非阻塞和同步、異步其實(shí)針對(duì)的對(duì)象是不一樣的)

          1)阻塞、非阻塞的討論對(duì)象是調(diào)用者;

          2)同步、異步的討論對(duì)象是被調(diào)用者。

          recvfrom 函數(shù):

          recvfrom 函數(shù)(經(jīng) Socket 接收數(shù)據(jù)),這里把它視為系統(tǒng)調(diào)用。

          一個(gè)輸入操作通常包括兩個(gè)不同的階段:

          1)等待數(shù)據(jù)準(zhǔn)備好;

          2)從內(nèi)核向進(jìn)程復(fù)制數(shù)據(jù)。

          對(duì)于一個(gè)套接字上的輸入操作,第一步通常涉及等待數(shù)據(jù)從網(wǎng)絡(luò)中到達(dá)。當(dāng)所等待分組到達(dá)時(shí),它被復(fù)制到內(nèi)核中的某個(gè)緩沖區(qū)。第二步就是把數(shù)據(jù)從內(nèi)核緩沖區(qū)復(fù)制到應(yīng)用進(jìn)程緩沖區(qū)。

          實(shí)際應(yīng)用程序在系統(tǒng)調(diào)用完成上面的 2 步操作時(shí),調(diào)用方式的阻塞、非阻塞,操作系統(tǒng)在處理應(yīng)用程序請(qǐng)求時(shí),處理方式的同步、異步處理的不同,可以分為 5 種 I/O 模型(下面的章節(jié)將逐個(gè)展開介紹)。(參考《UNIX網(wǎng)絡(luò)編程卷1》)

          6、I/O模型1:阻塞式 I/O 模型(blocking I/O)

          在阻塞式 I/O 模型中,應(yīng)用程序在從調(diào)用 recvfrom 開始到它返回有數(shù)據(jù)報(bào)準(zhǔn)備好這段時(shí)間是阻塞的,recvfrom 返回成功后,應(yīng)用進(jìn)程開始處理數(shù)據(jù)報(bào)。

          比喻:一個(gè)人在釣魚,當(dāng)沒魚上鉤時(shí),就坐在岸邊一直等。

          優(yōu)點(diǎn):程序簡(jiǎn)單,在阻塞等待數(shù)據(jù)期間進(jìn)程/線程掛起,基本不會(huì)占用 CPU 資源。

          缺點(diǎn):每個(gè)連接需要獨(dú)立的進(jìn)程/線程單獨(dú)處理,當(dāng)并發(fā)請(qǐng)求量大時(shí)為了維護(hù)程序,內(nèi)存、線程切換開銷較大,這種模型在實(shí)際生產(chǎn)中很少使用。

          7、I/O模型2:非阻塞式 I/O 模型(non-blocking I/O)

          在非阻塞式 I/O 模型中,應(yīng)用程序把一個(gè)套接口設(shè)置為非阻塞,就是告訴內(nèi)核,當(dāng)所請(qǐng)求的 I/O 操作無法完成時(shí),不要將進(jìn)程睡眠。

          而是返回一個(gè)錯(cuò)誤,應(yīng)用程序基于 I/O 操作函數(shù)將不斷的輪詢數(shù)據(jù)是否已經(jīng)準(zhǔn)備好,如果沒有準(zhǔn)備好,繼續(xù)輪詢,直到數(shù)據(jù)準(zhǔn)備好為止。

          比喻:邊釣魚邊玩手機(jī),隔會(huì)再看看有沒有魚上鉤,有的話就迅速拉桿。

          優(yōu)點(diǎn):不會(huì)阻塞在內(nèi)核的等待數(shù)據(jù)過程,每次發(fā)起的 I/O 請(qǐng)求可以立即返回,不用阻塞等待,實(shí)時(shí)性較好。

          缺點(diǎn):輪詢將會(huì)不斷地詢問內(nèi)核,這將占用大量的 CPU 時(shí)間,系統(tǒng)資源利用率較低,所以一般 Web 服務(wù)器不使用這種 I/O 模型。

          8、I/O模型3:I/O 復(fù)用模型(I/O multiplexing)

          在 I/O 復(fù)用模型中,會(huì)用到 Select 或 Poll 函數(shù)或 Epoll 函數(shù)(Linux 2.6 以后的內(nèi)核開始支持),這兩個(gè)函數(shù)也會(huì)使進(jìn)程阻塞,但是和阻塞 I/O 有所不同。

          這兩個(gè)函數(shù)可以同時(shí)阻塞多個(gè) I/O 操作,而且可以同時(shí)對(duì)多個(gè)讀操作,多個(gè)寫操作的 I/O 函數(shù)進(jìn)行檢測(cè),直到有數(shù)據(jù)可讀或可寫時(shí),才真正調(diào)用 I/O 操作函數(shù)。

          比喻:放了一堆魚竿,在岸邊一直守著這堆魚竿,沒魚上鉤就玩手機(jī)。

          優(yōu)點(diǎn):可以基于一個(gè)阻塞對(duì)象,同時(shí)在多個(gè)描述符上等待就緒,而不是使用多個(gè)線程(每個(gè)文件描述符一個(gè)線程),這樣可以大大節(jié)省系統(tǒng)資源。

          缺點(diǎn):當(dāng)連接數(shù)較少時(shí)效率相比多線程+阻塞 I/O 模型效率較低,可能延遲更大,因?yàn)閱蝹€(gè)連接處理需要 2 次系統(tǒng)調(diào)用,占用時(shí)間會(huì)有增加。

          眾所周之,Nginx這樣的高性能互聯(lián)網(wǎng)反向代理服務(wù)器大獲成功的關(guān)鍵就是得益于Epoll。

          9、I/O模型4:信號(hào)驅(qū)動(dòng)式 I/O 模型(signal-driven I/O)

          在信號(hào)驅(qū)動(dòng)式 I/O 模型中,應(yīng)用程序使用套接口進(jìn)行信號(hào)驅(qū)動(dòng) I/O,并安裝一個(gè)信號(hào)處理函數(shù),進(jìn)程繼續(xù)運(yùn)行并不阻塞。

          當(dāng)數(shù)據(jù)準(zhǔn)備好時(shí),進(jìn)程會(huì)收到一個(gè) SIGIO 信號(hào),可以在信號(hào)處理函數(shù)中調(diào)用 I/O 操作函數(shù)處理數(shù)據(jù)。

          比喻:魚竿上系了個(gè)鈴鐺,當(dāng)鈴鐺響,就知道魚上鉤,然后可以專心玩手機(jī)。

          優(yōu)點(diǎn):線程并沒有在等待數(shù)據(jù)時(shí)被阻塞,可以提高資源的利用率。

          缺點(diǎn):信號(hào) I/O 在大量 IO 操作時(shí)可能會(huì)因?yàn)樾盘?hào)隊(duì)列溢出導(dǎo)致沒法通知。

          信號(hào)驅(qū)動(dòng) I/O 盡管對(duì)于處理 UDP 套接字來說有用,即這種信號(hào)通知意味著到達(dá)一個(gè)數(shù)據(jù)報(bào),或者返回一個(gè)異步錯(cuò)誤。

          但是,對(duì)于 TCP 而言,信號(hào)驅(qū)動(dòng)的 I/O 方式近乎無用,因?yàn)閷?dǎo)致這種通知的條件為數(shù)眾多,每一個(gè)來進(jìn)行判別會(huì)消耗很大資源,與前幾種方式相比優(yōu)勢(shì)盡失。

          10、I/O模型5:異步 I/O 模型(即AIO,全稱asynchronous I/O)

          由 POSIX 規(guī)范定義,應(yīng)用程序告知內(nèi)核啟動(dòng)某個(gè)操作,并讓內(nèi)核在整個(gè)操作(包括將數(shù)據(jù)從內(nèi)核拷貝到應(yīng)用程序的緩沖區(qū))完成后通知應(yīng)用程序。

          這種模型與信號(hào)驅(qū)動(dòng)模型的主要區(qū)別在于:信號(hào)驅(qū)動(dòng) I/O 是由內(nèi)核通知應(yīng)用程序何時(shí)啟動(dòng)一個(gè) I/O 操作,而異步 I/O 模型是由內(nèi)核通知應(yīng)用程序 I/O 操作何時(shí)完成。

          優(yōu)點(diǎn):異步 I/O 能夠充分利用 DMA 特性,讓 I/O 操作與計(jì)算重疊。

          缺點(diǎn):要實(shí)現(xiàn)真正的異步 I/O,操作系統(tǒng)需要做大量的工作。目前 Windows 下通過 IOCP 實(shí)現(xiàn)了真正的異步 I/O。

          而在 Linux 系統(tǒng)下,Linux 2.6才引入,目前 AIO 并不完善,因此在 Linux 下實(shí)現(xiàn)高并發(fā)網(wǎng)絡(luò)編程時(shí)都是以 IO 復(fù)用模型模式為主。

          關(guān)于AOI的介紹,請(qǐng)見:《Java新一代網(wǎng)絡(luò)編程模型AIO原理及Linux系統(tǒng)AIO介紹》。

          11、5 種 I/O 模型總結(jié)

          從上圖中我們可以看出,越往后,阻塞越少,理論上效率也是最優(yōu)。

          這五種 I/O 模型中,前四種屬于同步 I/O,因?yàn)槠渲姓嬲?I/O 操作(recvfrom)將阻塞進(jìn)程/線程,只有異步 I/O 模型才與 POSIX 定義的異步 I/O 相匹配。

          (本文下篇《高性能網(wǎng)絡(luò)編程(六):一文讀懂高性能網(wǎng)絡(luò)編程中的線程模型》已發(fā)布,敬請(qǐng)閱讀!)

          附錄:更多網(wǎng)絡(luò)編程精華文章

          [1] 網(wǎng)絡(luò)編程基礎(chǔ)資料:

          TCP/IP詳解 - 第11章·UDP:用戶數(shù)據(jù)報(bào)協(xié)議

          TCP/IP詳解 - 第17章·TCP:傳輸控制協(xié)議

          TCP/IP詳解 - 第18章·TCP連接的建立與終止

          TCP/IP詳解 - 第21章·TCP的超時(shí)與重傳

          技術(shù)往事:改變世界的TCP/IP協(xié)議(珍貴多圖、手機(jī)慎點(diǎn))

          通俗易懂-深入理解TCP協(xié)議(上):理論基礎(chǔ)

          通俗易懂-深入理解TCP協(xié)議(下):RTT、滑動(dòng)窗口、擁塞處理

          理論經(jīng)典:TCP協(xié)議的3次握手與4次揮手過程詳解

          理論聯(lián)系實(shí)際:Wireshark抓包分析TCP 3次握手、4次揮手過程

          計(jì)算機(jī)網(wǎng)絡(luò)通訊協(xié)議關(guān)系圖(中文珍藏版)

          UDP中一個(gè)包的大小最大能多大?

          P2P技術(shù)詳解(一):NAT詳解——詳細(xì)原理、P2P簡(jiǎn)介

          P2P技術(shù)詳解(二):P2P中的NAT穿越(打洞)方案詳解

          P2P技術(shù)詳解(三):P2P技術(shù)之STUN、TURN、ICE詳解

          通俗易懂:快速理解P2P技術(shù)中的NAT穿透原理

          不為人知的網(wǎng)絡(luò)編程(一):淺析TCP協(xié)議中的疑難雜癥(上篇)

          不為人知的網(wǎng)絡(luò)編程(二):淺析TCP協(xié)議中的疑難雜癥(下篇)

          不為人知的網(wǎng)絡(luò)編程(三):關(guān)閉TCP連接時(shí)為什么會(huì)TIME_WAIT、CLOSE_WAIT

          不為人知的網(wǎng)絡(luò)編程(四):深入研究分析TCP的異常關(guān)閉

          不為人知的網(wǎng)絡(luò)編程(五):UDP的連接性和負(fù)載均衡

          不為人知的網(wǎng)絡(luò)編程(六):深入地理解UDP協(xié)議并用好它

          不為人知的網(wǎng)絡(luò)編程(七):如何讓不可靠的UDP變的可靠?

          網(wǎng)絡(luò)編程懶人入門(一):快速理解網(wǎng)絡(luò)通信協(xié)議(上篇)

          網(wǎng)絡(luò)編程懶人入門(二):快速理解網(wǎng)絡(luò)通信協(xié)議(下篇)

          網(wǎng)絡(luò)編程懶人入門(三):快速理解TCP協(xié)議一篇就夠

          網(wǎng)絡(luò)編程懶人入門(四):快速理解TCP和UDP的差異

          網(wǎng)絡(luò)編程懶人入門(五):快速理解為什么說UDP有時(shí)比TCP更有優(yōu)勢(shì)

          網(wǎng)絡(luò)編程懶人入門(六):史上最通俗的集線器、交換機(jī)、路由器功能原理入門

          網(wǎng)絡(luò)編程懶人入門(七):深入淺出,全面理解HTTP協(xié)議

          網(wǎng)絡(luò)編程懶人入門(八):手把手教你寫基于TCP的Socket長(zhǎng)連接

          技術(shù)掃盲:新一代基于UDP的低延時(shí)網(wǎng)絡(luò)傳輸層協(xié)議——QUIC詳解

          讓互聯(lián)網(wǎng)更快:新一代QUIC協(xié)議在騰訊的技術(shù)實(shí)踐分享

          現(xiàn)代移動(dòng)端網(wǎng)絡(luò)短連接的優(yōu)化手段總結(jié):請(qǐng)求速度、弱網(wǎng)適應(yīng)、安全保障

          聊聊iOS中網(wǎng)絡(luò)編程長(zhǎng)連接的那些事

          移動(dòng)端IM開發(fā)者必讀(一):通俗易懂,理解移動(dòng)網(wǎng)絡(luò)的“弱”和“慢”

          移動(dòng)端IM開發(fā)者必讀(二):史上最全移動(dòng)弱網(wǎng)絡(luò)優(yōu)化方法總結(jié)

          IPv6技術(shù)詳解:基本概念、應(yīng)用現(xiàn)狀、技術(shù)實(shí)踐(上篇)

          IPv6技術(shù)詳解:基本概念、應(yīng)用現(xiàn)狀、技術(shù)實(shí)踐(下篇)

          從HTTP/0.9到HTTP/2:一文讀懂HTTP協(xié)議的歷史演變和設(shè)計(jì)思路

          腦殘式網(wǎng)絡(luò)編程入門(一):跟著動(dòng)畫來學(xué)TCP三次握手和四次揮手

          腦殘式網(wǎng)絡(luò)編程入門(二):我們?cè)谧x寫Socket時(shí),究竟在讀寫什么?

          腦殘式網(wǎng)絡(luò)編程入門(三):HTTP協(xié)議必知必會(huì)的一些知識(shí)

          腦殘式網(wǎng)絡(luò)編程入門(四):快速理解HTTP/2的服務(wù)器推送(Server Push)

          以網(wǎng)游服務(wù)端的網(wǎng)絡(luò)接入層設(shè)計(jì)為例,理解實(shí)時(shí)通信的技術(shù)挑戰(zhàn)

          >> 更多同類文章 ……

          [2] NIO高性能異步網(wǎng)絡(luò)編程資料:

          Java新一代網(wǎng)絡(luò)編程模型AIO原理及Linux系統(tǒng)AIO介紹

          有關(guān)“為何選擇Netty”的11個(gè)疑問及解答

          開源NIO框架八卦——到底是先有MINA還是先有Netty?

          選Netty還是Mina:深入研究與對(duì)比(一)

          選Netty還是Mina:深入研究與對(duì)比(二)

          NIO框架入門(一):服務(wù)端基于Netty4的UDP雙向通信Demo演示

          NIO框架入門(二):服務(wù)端基于MINA2的UDP雙向通信Demo演示

          NIO框架入門(三):iOS與MINA2、Netty4的跨平臺(tái)UDP雙向通信實(shí)戰(zhàn)

          NIO框架入門(四):Android與MINA2、Netty4的跨平臺(tái)UDP雙向通信實(shí)戰(zhàn)

          Netty 4.x學(xué)習(xí)(一):ByteBuf詳解

          Netty 4.x學(xué)習(xí)(二):Channel和Pipeline詳解

          Netty 4.x學(xué)習(xí)(三):線程模型詳解

          Apache Mina框架高級(jí)篇(一):IoFilter詳解

          Apache Mina框架高級(jí)篇(二):IoHandler詳解

          MINA2 線程原理總結(jié)(含簡(jiǎn)單測(cè)試實(shí)例)

          Apache MINA2.0 開發(fā)指南(中文版)[附件下載]

          MINA、Netty的源代碼(在線閱讀版)已整理發(fā)布

          解決MINA數(shù)據(jù)傳輸中TCP的粘包、缺包問題(有源碼)

          解決Mina中多個(gè)同類型Filter實(shí)例共存的問題

          實(shí)踐總結(jié):Netty3.x升級(jí)Netty4.x遇到的那些坑(線程篇)

          實(shí)踐總結(jié):Netty3.x VS Netty4.x的線程模型

          詳解Netty的安全性:原理介紹、代碼演示(上篇)

          詳解Netty的安全性:原理介紹、代碼演示(下篇)

          詳解Netty的優(yōu)雅退出機(jī)制和原理

          NIO框架詳解:Netty的高性能之道

          Twitter:如何使用Netty 4來減少JVM的GC開銷(譯文)

          絕對(duì)干貨:基于Netty實(shí)現(xiàn)海量接入的推送服務(wù)技術(shù)要點(diǎn)

          Netty干貨分享:京東京麥的生產(chǎn)級(jí)TCP網(wǎng)關(guān)技術(shù)實(shí)踐總結(jié)

          >> 更多同類文章 ……

          (本文同步發(fā)布于:http://www.52im.net/thread-1935-1-1.html



          作者:Jack Jiang (點(diǎn)擊作者姓名進(jìn)入Github)
          出處:http://www.52im.net/space-uid-1.html
          交流:歡迎加入即時(shí)通訊開發(fā)交流群 215891622
          討論:http://www.52im.net/
          Jack Jiang同時(shí)是【原創(chuàng)Java Swing外觀工程BeautyEye】【輕量級(jí)移動(dòng)端即時(shí)通訊框架MobileIMSDK】的作者,可前往下載交流。
          本博文 歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明出處(也可前往 我的52im.net 找到我)。


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          Jack Jiang的 Mail: jb2011@163.com, 聯(lián)系QQ: 413980957, 微信: hellojackjiang
          主站蜘蛛池模板: 宜都市| 资中县| 民乐县| 普格县| 昭苏县| 皮山县| 会理县| 萍乡市| 车致| 玉溪市| 哈尔滨市| 平湖市| 高陵县| 盘锦市| 台北县| 丰县| 安阳县| 鄂托克前旗| 安陆市| 内江市| 茂名市| 新兴县| 玛沁县| 威信县| 美姑县| 舞钢市| 柳河县| 体育| 宁明县| 淮安市| 吉隆县| 德兴市| 兴山县| 盐池县| 金沙县| 辛集市| 红河县| 曲周县| 邹平县| 本溪| 抚顺县|