• <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  評論-223  文章-30  trackbacks-0
            描述
               在P2P應用系統中,當需要與處于不同私網的對方可靠通信時,先嘗試TCP打洞穿透,若穿透失敗,再通過處于公網上的代理服務器(下文簡稱proxy)轉發與對方通信,如下圖所示  
               終端A先連接并發消息msg1到proxy(連接為c1);proxy再發消息msg2給P2P服務器,P2P服務器收到消息后通過已有的連接發消息msg3給終端B,B收到msg3后,連接并發消息msg4到proxy(連接為c2)。這4個消息格式由應用層協議決定,但必須遵守的規范如下:
                msg1至少包含B的設備ID。
                msg2至少包含B的設備ID和c1的連接ID。
                msg3至少包含c1的連接ID和連接代理指示。
                msg4至少包含B的設備ID和c1的連接ID。
               proxy為多線程架構,當接受到若干連接時,如果數據相互轉發的兩個連接(比如上圖中的c1和c2)不在同一線程,由于一個連接寫數據到另一連接的發送隊列,而另一連接從發送隊列讀數據以發送,那么就要對另一連接的發送隊列(或緩沖區)加鎖,這樣一來由于頻繁的網絡IO而頻繁地加解鎖,降低了轉發效率,因此為了解決這一問題,就需要調度TCP連接到同一線程。


            特點
               本方法能將數據轉發的兩邊連接放在同一線程,從而避免了數據轉發時的加鎖,由于是一對一的連接匹配,因此也做到了每個線程中連接數的均衡。


            實現
               工作原理
                  proxy的主線程負責綁定知名端口并監聽連接,工作線程負責數據轉發。當接受到一個連接時,按輪轉法調度它到某個工作線程,在那個線程內接收分析應用層協議數據,以識別連接類型,即判斷連接是來自數據請求方還是數據響應方,為統一描述,這里把前者特稱為客戶連接,后者為服務連接,連接所在的線程為宿主線程。如果是客戶連接,那么先通知P2P服務器請求對應的客戶端來連接代理,并等待匹配;如果是服務連接,那么就去匹配客戶連接,在匹配過程中,如果服務連接和客戶連接不在同一線程內,那么就會調度到客戶連接的宿主線程,匹配成功后,就開始轉發數據。
                  為了加快查找,分2個hash表存放連接,客戶連接放在客戶連接hash表中,以連接ID為鍵值;服務連接放在服務連接hash表中,以設備ID為鍵值。

               TCP連接調度
                  包括新連接的輪轉、識別連接類型、匹配客戶連接1、匹配客戶連接2和關閉連接共5個流程,如下一一所述。
                  新連接的輪轉
                     該流程工作在主線程,如下圖所示
                  索引i初始為0,對于新來的連接,由于還不明確連接類型,所以先放入客戶連接表中。

                  識別連接類型
                     該流程工作在工作線程,當接受到一個連接時開始執行,如下圖所示
                  當連接類型為服務連接時,從客戶連接表轉移到服務連接表。

                  匹配客戶連接1
                     該流程工作在工作線程,當接受到一個服務連接時開始執行,如下圖所示

                  匹配客戶連接2
                     該流程工作在工作線程,當服務連接移到客戶連接的宿主線程時開始執行,如下圖所示
                  這里的流程和匹配客戶連接流程1有些類似,看起來好像做了重復的判斷操作,但這是必要的,因為在服務連接轉移到另一線程這個瞬間內,客戶連接有可能斷開了,也有可能斷開后又來了一個相同連接ID的其它客戶連接,所以要重新去客戶連接表查找一次,然后進行4個分支判斷。 
               
                  關閉連接
                     該流程工作在工作線程內,當連接斷開或空閑時執行。當一邊讀數據出錯時,不能馬上關閉另一邊連接,得在另一邊緩沖區數據發送完后才能關閉;當一邊連接寫數據出錯時,可以馬上關閉另一邊連接,如下圖所示
            posted on 2016-07-12 16:59 春秋十二月 閱讀(1821) 評論(0)  編輯 收藏 引用 所屬分類: Network
            亚洲精品乱码久久久久久蜜桃不卡 | 久久91精品国产91久久户| 99久久香蕉国产线看观香| 久久国产成人精品麻豆| 久久久久亚洲爆乳少妇无| 国产激情久久久久影院小草| 亚洲国产精品久久久久久| 久久久WWW成人免费精品| 性做久久久久久久久浪潮| 伊人久久大香线蕉av不卡| 国产精品久久永久免费| 欧美日韩精品久久久久| 97久久国产综合精品女不卡 | 亚洲国产成人久久精品影视 | 免费久久人人爽人人爽av| 国产成人久久精品一区二区三区| 久久99精品久久久久久动态图| 国产精品美女久久久久av爽| 亚洲AV日韩精品久久久久| 岛国搬运www久久| 亚洲AV无码久久精品蜜桃| 国产综合免费精品久久久| 麻豆亚洲AV永久无码精品久久| 品成人欧美大片久久国产欧美| 性欧美丰满熟妇XXXX性久久久| 精品综合久久久久久97超人| 久久福利资源国产精品999| 91精品观看91久久久久久| 午夜天堂av天堂久久久| 伊人色综合久久天天人守人婷| 久久综合九色综合97_久久久| 精品无码久久久久国产动漫3d| 久久久久久极精品久久久| 中文字幕成人精品久久不卡| 久久久久亚洲av无码专区 | 色欲久久久天天天综合网精品| 日日狠狠久久偷偷色综合96蜜桃 | 久久99精品久久久久久动态图| 亚洲AV乱码久久精品蜜桃| 超级97碰碰碰碰久久久久最新| 深夜久久AAAAA级毛片免费看|