• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-161  評(píng)論-223  文章-30  trackbacks-0
            描述
               在P2P應(yīng)用系統(tǒng)中,當(dāng)需要與處于不同私網(wǎng)的對(duì)方可靠通信時(shí),先嘗試TCP打洞穿透,若穿透失敗,再通過(guò)處于公網(wǎng)上的代理服務(wù)器(下文簡(jiǎn)稱(chēng)proxy)轉(zhuǎn)發(fā)與對(duì)方通信,如下圖所示  
               終端A先連接并發(fā)消息msg1到proxy(連接為c1);proxy再發(fā)消息msg2給P2P服務(wù)器,P2P服務(wù)器收到消息后通過(guò)已有的連接發(fā)消息msg3給終端B,B收到msg3后,連接并發(fā)消息msg4到proxy(連接為c2)。這4個(gè)消息格式由應(yīng)用層協(xié)議決定,但必須遵守的規(guī)范如下:
                msg1至少包含B的設(shè)備ID。
                msg2至少包含B的設(shè)備ID和c1的連接ID。
                msg3至少包含c1的連接ID和連接代理指示。
                msg4至少包含B的設(shè)備ID和c1的連接ID。
               proxy為多線程架構(gòu),當(dāng)接受到若干連接時(shí),如果數(shù)據(jù)相互轉(zhuǎn)發(fā)的兩個(gè)連接(比如上圖中的c1和c2)不在同一線程,由于一個(gè)連接寫(xiě)數(shù)據(jù)到另一連接的發(fā)送隊(duì)列,而另一連接從發(fā)送隊(duì)列讀數(shù)據(jù)以發(fā)送,那么就要對(duì)另一連接的發(fā)送隊(duì)列(或緩沖區(qū))加鎖,這樣一來(lái)由于頻繁的網(wǎng)絡(luò)IO而頻繁地加解鎖,降低了轉(zhuǎn)發(fā)效率,因此為了解決這一問(wèn)題,就需要調(diào)度TCP連接到同一線程。


            特點(diǎn)
               本方法能將數(shù)據(jù)轉(zhuǎn)發(fā)的兩邊連接放在同一線程,從而避免了數(shù)據(jù)轉(zhuǎn)發(fā)時(shí)的加鎖,由于是一對(duì)一的連接匹配,因此也做到了每個(gè)線程中連接數(shù)的均衡。


            實(shí)現(xiàn)
               工作原理
                  proxy的主線程負(fù)責(zé)綁定知名端口并監(jiān)聽(tīng)連接,工作線程負(fù)責(zé)數(shù)據(jù)轉(zhuǎn)發(fā)。當(dāng)接受到一個(gè)連接時(shí),按輪轉(zhuǎn)法調(diào)度它到某個(gè)工作線程,在那個(gè)線程內(nèi)接收分析應(yīng)用層協(xié)議數(shù)據(jù),以識(shí)別連接類(lèi)型,即判斷連接是來(lái)自數(shù)據(jù)請(qǐng)求方還是數(shù)據(jù)響應(yīng)方,為統(tǒng)一描述,這里把前者特稱(chēng)為客戶連接,后者為服務(wù)連接,連接所在的線程為宿主線程。如果是客戶連接,那么先通知P2P服務(wù)器請(qǐng)求對(duì)應(yīng)的客戶端來(lái)連接代理,并等待匹配;如果是服務(wù)連接,那么就去匹配客戶連接,在匹配過(guò)程中,如果服務(wù)連接和客戶連接不在同一線程內(nèi),那么就會(huì)調(diào)度到客戶連接的宿主線程,匹配成功后,就開(kāi)始轉(zhuǎn)發(fā)數(shù)據(jù)。
                  為了加快查找,分2個(gè)hash表存放連接,客戶連接放在客戶連接hash表中,以連接ID為鍵值;服務(wù)連接放在服務(wù)連接hash表中,以設(shè)備ID為鍵值。

               TCP連接調(diào)度
                  包括新連接的輪轉(zhuǎn)、識(shí)別連接類(lèi)型、匹配客戶連接1、匹配客戶連接2和關(guān)閉連接共5個(gè)流程,如下一一所述。
                  新連接的輪轉(zhuǎn)
                     該流程工作在主線程,如下圖所示
                  索引i初始為0,對(duì)于新來(lái)的連接,由于還不明確連接類(lèi)型,所以先放入客戶連接表中。

                  識(shí)別連接類(lèi)型
                     該流程工作在工作線程,當(dāng)接受到一個(gè)連接時(shí)開(kāi)始執(zhí)行,如下圖所示
                  當(dāng)連接類(lèi)型為服務(wù)連接時(shí),從客戶連接表轉(zhuǎn)移到服務(wù)連接表。

                  匹配客戶連接1
                     該流程工作在工作線程,當(dāng)接受到一個(gè)服務(wù)連接時(shí)開(kāi)始執(zhí)行,如下圖所示

                  匹配客戶連接2
                     該流程工作在工作線程,當(dāng)服務(wù)連接移到客戶連接的宿主線程時(shí)開(kāi)始執(zhí)行,如下圖所示
                  這里的流程和匹配客戶連接流程1有些類(lèi)似,看起來(lái)好像做了重復(fù)的判斷操作,但這是必要的,因?yàn)樵诜?wù)連接轉(zhuǎn)移到另一線程這個(gè)瞬間內(nèi),客戶連接有可能斷開(kāi)了,也有可能斷開(kāi)后又來(lái)了一個(gè)相同連接ID的其它客戶連接,所以要重新去客戶連接表查找一次,然后進(jìn)行4個(gè)分支判斷。 
               
                  關(guān)閉連接
                     該流程工作在工作線程內(nèi),當(dāng)連接斷開(kāi)或空閑時(shí)執(zhí)行。當(dāng)一邊讀數(shù)據(jù)出錯(cuò)時(shí),不能馬上關(guān)閉另一邊連接,得在另一邊緩沖區(qū)數(shù)據(jù)發(fā)送完后才能關(guān)閉;當(dāng)一邊連接寫(xiě)數(shù)據(jù)出錯(cuò)時(shí),可以馬上關(guān)閉另一邊連接,如下圖所示
            posted on 2016-07-12 16:59 春秋十二月 閱讀(1821) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): Network
            亚洲国产精品无码久久一区二区| 久久99国产精品久久99| 久久青青草原亚洲av无码| 手机看片久久高清国产日韩| 久久亚洲精品无码aⅴ大香| 国产精品久久久久国产A级| 91精品国产91久久久久久蜜臀| 久久久WWW免费人成精品| 看久久久久久a级毛片| 伊人丁香狠狠色综合久久| 18岁日韩内射颜射午夜久久成人| 精品午夜久久福利大片| 久久这里有精品| 91精品婷婷国产综合久久| 少妇久久久久久久久久| 久久免费观看视频| 久久综合中文字幕| 色8久久人人97超碰香蕉987| 久久国产成人精品国产成人亚洲| 狠狠色丁香久久婷婷综合| 91久久精品电影| AV无码久久久久不卡网站下载| 伊人久久大香线蕉综合网站| Xx性欧美肥妇精品久久久久久| 中文字幕人妻色偷偷久久| 久久久久99精品成人片| 久久久久国产一级毛片高清版| 麻豆一区二区99久久久久| 2019久久久高清456| 久久久久18| 久久综合九色综合欧美就去吻| 伊人丁香狠狠色综合久久| 91精品国产综合久久四虎久久无码一级| 国产69精品久久久久9999APGF| 三级韩国一区久久二区综合| 精品国产青草久久久久福利| 国内精品久久久久久久coent | 国产精品日韩欧美久久综合| 嫩草影院久久国产精品| 狠狠色伊人久久精品综合网| 久久精品国产精品亚洲人人|