2009-01-13 35 views
3

最近,我一直在閱讀IRC協議(RFC 1459,2810-2813),並且我正在考慮實現我自己的服務器。如何使用「擁有」暱稱實現IRC服務器?

我不一定會虔誠地遵守IRC協議(畢竟我是爲了好玩而做這件事),但我喜歡的一件事情是網絡可以包含多個服務器透明地。

有很多事情我不喜歡協議或IRC規範。首先是綽號不是擁有的。儘管像NickServ這樣的服務存在,但它們不是官方協議的一部分。另外另一方面,實施類似NickServ 正確那種失敗的分配的目的(即有會是一個地方NickServ運行,併爲它一個數據存儲)。

我希望能有一種方法來管理每個服務器的暱稱。問題在於,如果您有兩臺具有某些註冊暱稱的服務器,然後它們連接起來,則可能發生衝突。

有沒有辦法避免這種情況,而不使用一箇中央數據存儲?那就是:是否有可能讓服務器鬆散地連接起來(使它們各自作爲一個獨立實體存在,但也可以相互連接)並保持暱稱之間的唯一性?

我意識到這個問題是模糊的,但我想不出它的措辭一個更好的方式。我正在尋找更多的建議,而不是我的實際是/否的答案。因此,如果任何人對如何在網絡中完成暱稱唯一性以及仍然保持服務器獨立性有任何想法,我會有興趣聽到它。請注意嚴格遵守IRC協議並不是必要的;改變事情以適應我的目的我沒有問題。 :)

+0

對我來說這個問題是'上帝爲什麼好'? – GEOCHET 2009-01-13 17:47:14

+0

爲了好玩。這就是我們在這裏:FUN。:) – FreeMemory 2009-01-13 17:50:11

回答

3

有一個簡單的解決方案如果你不關心嚴格實現IRC服務器,而是實現分佈式消息系統這 IRC,但不準確IRC

簡單的解決方案是使用「nick @ host」形式的暱稱,非常像電子郵件。因此,我的暱稱可以是「[email protected]」,而不僅僅是「mipadi」。所以我只註冊了您的服務器,但是當您的服務器與其他人建立了另一個大型聊天網絡時,您可以輕鬆將所有用戶名組合在一起。在otherserver.net上可能會有一個「mipadi」,但是我們的暱稱變成了「[email protected]」和「[email protected]」,一切都很酷。

當然,這與IRC有很大不同。:)

0

他們必須意識到對方。如果沒有,則無法阻止共享暱稱。如果是這樣,你只需要在後端傳輸更新。爲了防止同時註冊,您需要一個阻止,請求所有其他服務器的許可並響應的事務系統。

爲了防止同時註冊中斷期間,你沒有選擇,只能時間戳登記,並刪除所有,但最後一個(或隨機的真正同步)註冊的暱稱的副本。

考慮到這些服務器最初並沒有被合併,這並不是很漂亮。

0

如果您的服務器實例互相信任,您仍然可以在沒有中央實例的情況下實施暱稱所有權,如果

  • 當用戶註冊了一個缺口,它是與他連接了當前服務器註冊
  • 當服務器接收到註冊,它不知道的,就將該信息轉發到所有其它服務器,唐「T知道它(可能需要一個智能的算法,以避免垃圾郵件的網絡)
  • 當服務器重新連接到另一臺服務器然後嘗試同步註冊尼克斯的名單和服務器處理該缺口
  • 如果有是該同步期間的碰撞,則使用較早的註冊,並將較新的註冊標記爲無效

如果你不能信任你的服務器,那麼它會變得更加困難,因爲服務器可以很容易地聲明每個用戶名,甚至要求每個用戶登記最早的註冊。

0

由於您試圖想出一些新的東西,想到這一點,只需在服務器之外進行通信時簡單地將服務器的某些內容作爲暱稱的一部分。因此,如果你想在不同的服務器上發送消息,你可能會有類似user @ server

如果你不需要它們完全分開,你可能要考慮創建一種多主複製的數據庫賬戶。每臺服務器都存儲帳戶數據庫的完整副本,每臺服務器都可以創建新帳戶,並儘可能將其複製到其他服務器。儘管如此,你可能仍然需要處理碰撞。

0

儘管像NickServ這樣的服務存在,但它們不是官方協議的一部分。

服務不是官方協議的一部分,因爲它們與協議無關。他們是有權限的機器人。沒有理由不能在每臺服務器上運行一個服務器,但這確實會使其難以維護。

如果你要走這條路,我可能會建議常用的「多主」數據庫複製技術。如果有人收到一個寫入信號(就你而言,新用戶被創建或更新等),它會將數據發送到所有其他節點。你必須小心,雖然。如果其中一個節點在其他節點進行更新時處於脫機狀態,則需要知道重新同步時重新連接。

另一種技術如上所述,但是相反。數據只在需要時在節點之間交換。例如,如果用戶嘗試登錄沒有數據的節點,它將查詢其他節點,併發出移動命令以將所有數據傳送到該節點。這比複製版本可能更不痛苦,但如果有人在與包裝斷開連接的節點上註冊重複的暱稱,則可能會出現嚴重的netsplits問題。

一種消除網絡分割問題的技術是讓聊天節點和它們的機器人感知網絡。當他們分裂時,他們可能不應該允許任何寫作行爲......但是如果你分裂很多,這可能會影響你的網絡。

你也必須問這可能有多安全,也可能不安全。 IRC網絡節點是爲了性能而分發的,但它們不是「安全的」。正因爲如此,服務機器人通常集中運行,以保持對其運行的最終控制。如果您分發漫遊器並且遠程節點被黑客入侵,他們可能有權訪問整個用戶數據庫(取決於型號)。