1. 程式人生 > >一種P2P代理中TCP連線排程的方法

一種P2P代理中TCP連線排程的方法

描述
   在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 春秋十二月 閱讀(925) 評論(0)  編輯 收藏 引用 所屬分類: Network