天天看點

IM即時通訊實作原理 (轉)

即時通訊(Instant  Messenger,簡稱IM)軟體多是基于TCP/IP和UDP進行通訊的,TCP/IP和UDP都是建立在更低層的IP協定上的兩種通訊傳輸協定。前 者是以資料流的形式,将傳輸資料經分割、打包後,通過兩台機器之間建立起的虛電路,進行連續的、雙向的、嚴格保證資料正确性的檔案傳輸協定。而後者是以數 據報的形式,對拆分後的資料的先後到達順序不做要求的檔案傳輸協定。

QQ就是使用UDP協定進行發送和接收消息的。當你的機器安裝了OICQ以後,實際上,你既是服務端(Server),又是用戶端(Client)。當你登入OICQ時,你的OICQ作為Client連接配接到騰訊公司的主伺服器上,當你看誰線上時,你的OICQ又一次作為Client從QQ  Server上讀取線上網友名單。當你和你的OICQ夥伴進行聊天時,如果你和對方的連接配接比較穩定,你和他的聊天内容都是以UDP的形式,在計算機之間傳 送。如果你和對方的連接配接不是很穩定,QQ伺服器将為你們的聊天内容進行中轉。其他的即時通信軟體原理與此大同小異。

一般的步驟:

首先,使用者A輸入自己的使用者名和密碼登入即時通訊伺服器,伺服器通過讀取使用者資料庫來驗證使用者身份,如果使用者名、密碼都正确,就登記使用者A的IP位址、IM用戶端軟體的版本号及使用的TCP/UDP端口号, 然後傳回使用者A登入成功的标志,此時使用者A在 IM系統中的狀态為線上(Online Presence)。

其次,根據使用者A存儲在IM伺服器上的好友清單 (Buddy List),伺服器将使用者A線上的相關資訊發送到也同時線上的即時通訊好友的PC機,這些資訊包括線上狀态、IP位址、  IM用戶端使用的TCP端口(Port)号等,即時通訊好友PC機上的即時通訊軟體收到此資訊後将在PC桌面上彈出一個小視窗予以提示。

第三步,即時通訊伺服器把使用者A存儲在伺服器上的好友列 表及相關資訊回送到他的PC機,這些資訊包括也線上狀态、IP位址、IM用戶端使用的TCP端口(Port)号等資訊,使用者A的PC機上的IM用戶端收到 後将顯示這些好友清單及其線上狀态。

接下來,如果使用者A想與他的線上好友使用者B聊天,他将直接通過伺服器發送過來的使用者B的IP位址、TCP端口号等資訊,直接向使用者B的PC機發出聊天資訊,使用者B的IM用戶端軟體收到後顯示在螢幕上,然後使用者B再直接回複到使用者A的PC機,這樣雙方的即時文字消息就不通過 IM伺服器中轉,而是通過網絡進行點對點的直接通訊,這稱為對等通訊方式(Peer  To Peer) 。在商用即時通訊系統中,如果使用者A與使用者B的點對點通訊由于防火牆、網絡速度等原因難以建立或者速度很慢,  IM伺服器還提供消息中轉服務,即使用者A和使用者B的即時消息全部先發送到IM伺服器,再由伺服器轉發給對方。早期的IM系統,在IM用戶端和IM伺服器之間通訊采用采用UDP協定,UDP協定是不可靠的傳輸協定,而在  IM用戶端之間的直接通訊中,采用具備可靠傳輸能力的TCP協定。随着使用者需求和技術環境的發展,目前主流的即時通訊系統傾向于在即時通訊用戶端之間、即時通訊用戶端和即時通訊伺服器之間都采用TCP協定 。

S——C1             |             | C1每次想和C2通信,先向S遞一個申請,然後S同意,把資訊轉交C2,  以後每次通信都這樣 C2

S——C1             |             | C1第一次想和C2通信,向S遞一個申請,S同意,告訴C1,C2,然後 C1和 C2之間建立了一條連接配接,可以直接通信,無需經過S.             C2

第 一種,對伺服器的性能要求比較高,要求伺服器可以同時處理很高的連接配接數,因為所有資訊都要通過伺服器進行傳遞,同時,它可以對所傳遞的資訊進行控制。

第二種,僅僅是使用者登陸或下線時與伺服器進行連接配接,平時進行通信時,是使用者之間直接進行點對點的連接配接,這種實作更合理一 些。

QQ聊天資訊是在兩個使用者間直接通信的,而MSN要經過伺服器中轉.

QQ當使用者登陸時,使用者需要首先與qq伺服器進行連接配接進行登入,伺服器會向客戶傳回一些資訊,比如你的好有的線上情況以及ip的資訊,然後客戶可以與你所請求的朋友進行點對點連接配接,兩者互相通信。

            那 如果 c1和c2都在私網内,要通過路由器做NAT才能出去的話,他們之間的socket是如何建立的呢?             看一下下面的協定.

Simple Traversal of User  Datagram Protocol (UDP) Through Network             Address Translators (NATs) (STUN)。

STUN,是為了實作透明的穿透NAT,而定義的一套協 議。他使本地的内網的機器,具有取得,能夠得知他的NAT網關的IP,NAT類型的能力。

為什麼需要STUN:

因為NAT雖然解決了IP位址稀少的問題,但是也帶來了很多的問題。比如所有P2P應用,像檔案SHARE,多媒體,和線上遊戲等等. 為了解決這個問題,有人将 Application Layer Gateways (ALGs) 放到了NAT中, ALGs 也有嚴重的問題,比如跟不上速度太塊的CLIENT,每一個應用都需要單獨的實作。             跟不上應用的發展。             為了克服ALGS的問題,又提出了the Middlebox Communications (MIDCOM)  protocol 中間合協定。可是MIDBOX協定使 ,一些CLIENT可以控制NAT/防火牆的行為,通過這個             把應用協定和NAT部分分開,把ALGS從基本NAT裡面處理開。不過因為要處理MIDBOX,那麼             所有的NAT或者防火牆都要更新,

因為上面種種原因: The protocol described here, Simple Traversal of UDP Through NAT             (STUN), allows entities behind a NAT to first discover the  presence             of a NAT and the type of NAT, and then to learn the  addresses             bindings allocated by the NAT. STUN requires no changes to  NATs, and             works with an arbitrary(任意) number of NATs in tandem between the             application entity and the public Internet.

要想穿透NAT,首先知道NAT的一些特性: NAT分為4種(加上防火牆的話,多幾種情況): 1.完全透明NAT(Full Cone NAT): 從相同内部主機(IN IPX) +端口(IN PORTX)發送的資料MAPING為相同的IP(OUT IP  X)和端口(OUT PORT X)發送帶外網. 并且 從另一個伺服器(Y),如果直連到MAPING的IP(OUT IP X)和端口(OUT PORT X  )上,資料将會被轉發到内部主機上. (IN IPX), (IN PORTX).             //也就是說進内部網的資料包的SPORT,SPORT不受限制 2.受限NAT(Restricted Cone), 從相同内部主機IN IPX) +端口((IN PORTX))發送的資料MAPING為相同的IP(X)和端口發送帶外網. 和完全NAT不同的是,隻有當為X時,外部機器的的請求就被轉發到主機IN IPX) +端口((IN PORTX)。             也就是說進内部網的資料包的,SPORT不受限制,SIP受限制,隻能為NAT MAP資料的IP             3,端口受限NAT(Port Restricted Cone:) 和受限NAT不同的是,隻有當外部主動請求的的源IP和端口,等于内部網發送的請求的目的IP和端口。 4.對稱NAT(Symmetric) 如果發送的包的目的IP AND PORT,那麼MAPPING IP AND PORT,将相同。             内部網同一台機器,同一個端口 如果目的位址不同,那麼MAPPING的端口也不同,             是以隻有他主動連的伺服器才可能知道他的MAPPING後端口,别的伺服器如果想             連他隻能靠猜測端口。             總結:             前面3重NAT,MAPING PORT 和 IP,是根據發送包的的内部網的IP和端口決定的。             如果資料的内網IP和端口相同,那麼MAPPING後的端口和位址是固定。             這個功能為我們的穿越提供了很好條件。             第4種NAT,打洞後的MAPPING 位址和端口将變地不可靠。很難穿越。             注意SERVERA,和SERVERB是兩個公網位址,而不是兩台機器,

STUN 的簡單操作過程:             發送請求。請求分為兩種 1. Binding Requests, sent over UDP, 用來發現是否NAT,用來發現NAT的公網位址,和MAPPING後的端口 2.Binding Response, 伺服器産生Binding Response,并把得到的MAPPINGIP 和端口,傳回到用戶端,  用戶端比較MAPPING位址是否 和本機位址相同,如果是說明是本機也是公網,否則判斷NAT的類型(判斷方法:client uses additional STUN Binding Requests)             3.Binding Error, 4.Shared Secret Requests, sent over TLS [2] over TCP. 這個請求要求伺服器傳回一臨時使用者名和密碼,用來下一步的Binding Requests/  Response,用來驗證資訊的完整性 5.Shared Secret Response,             6 Shared Secret Error Response。 STUN 資訊結構 STUN 由以後資料結構構成:STUN頭+STUN有效載荷 STUN頭結構如下: 存儲的值都是以網絡順序存放             字段類型 STUN message type Short int 消息類型 Length Short int 有效載荷長度,不包含頭長度 transaction ID octet[16] 連接配接的ID值,檢查Request, 和Response

STUN的有效載荷 SHUN的有效載荷 是一些STUN的屬性構成,屬性的類型由資訊的類型來決定。 STUN的屬性是定義好了的,屬性清單(attribute)如下: MAPPED-ADDRESS 必選 用在Binding Response,(添入MAPING IP 和PORT) RESPONSEADDRESS 可選 用在Binding Request,指定Response,發送到哪裡             如果沒有指定,Response發送到MAPING IP 和 PORT             CHANGE-REQUEST 可選 用在Binding  Request。用來決定,CLIENT的NAT類型是限制NAT,還是端口限制NAT,(指令伺服器從不同的源端口/IP,Response請求) CHANGED-ADDRESS 可選 用在Binding Responses告訴Client改變的端口和IP             SOURCE-ADDRESS 必選 隻用在Binding Responses,标記資訊的源PORT HE IP             USERNAME 可選 Shared Secret Response/ Binding Requests             PASSWORD, 必選 SharedSecret Response             ESSAGEINTEGRITY 可選 用在Binding Responses, Binding  Request記錄資訊的完整性 ERROR-CODE Binding Error Response and Shared Secret Error  Response.             UNKNOWN-ATTRIBUTES             REFLECTED-FROM Binding Responses.用于追溯和防止DDOS

穿透的方法和過程             注意SERVER1,和SERVER2是兩個公網位址,而不是兩台機器.

附錄:

一、IM技術概念

IM技術全稱Instant  Messaging,中文翻譯“即時通訊”,它是一種使人們能在網上識别線上使用者并與他們實時交換消息的技術,是電子郵件發明以來迅速崛起的線上通訊方 式。

IM的出現和網際網路有着密不可分的關系,IM完全基于 TCP/IP網絡協定族實作,而TCP/IP協定族則是整個網際網路得以實作的技術基礎。 最早出現即時通訊協定是IRC(Internet Relay  Chat),但是可惜的是它僅能單純的使用文字、符号的方式通過網際網路進行交談和溝通。随着互連網變得高度發達,即時通訊也變得遠不止聊天這麼簡單,自 1996年第一個IM産品ICQ發明後,IM的技術和功能也開始基本成型,語音、視訊、檔案共享、短信發送等進階資訊交換功能都可以在IM工具上實作,于 是功能強大的IM軟體便足以搭建一個完整的通信交流平台。目前最具代表性的幾款的IM通訊軟體有MSN、Google  Talk、Yahoo、Messenger 、騰訊QQ等。

二、IM技術原理和工作方式

典型的IM工作方式如下:登陸IM通訊中心(IM通訊伺服器),擷取一個自建立的曆史的交流對象清單(好友清單),然後自身标志為線上狀态,當好友清單中的某人在任何時候登入上線并試圖通過你的計算機聯系你 時,IM系統會發一個消息提醒你,然後你能與他建立一個聊天會話通道進行各種消息如鍵入文字、通過語音等的交流.

從技術上來說,IM的基本技術原理如下:

通過IM伺服器登陸或登出             使用者A通過清單找到B,使用者B獲得消息并與之交談             通過IM伺服器指引建立與B單獨的通訊通道

第一步,使用者A輸入自己的使用者名和密碼登入IM伺服器, 伺服器通過讀取使用者資料庫來驗證使用者身份,如果驗證通過,登記使用者A的IP位址、IM用戶端軟體的版本号及使用的TCP/UDP端口号,然後傳回使用者A登入成功的标志,此時使用者A在IM系統中的狀态為線上(Online Presence)。

第二步,根據使用者A存儲在IM伺服器上的好友清單 (Buddy  List),伺服器将使用者A線上的相關資訊發送給也同時線上的IM好友的PC機,這些資訊包括線上狀态、IP位址、IM用戶端使用的TCP端口 (Port)号等,IM好友的用戶端收到此資訊後将在予以提示。

第三步是IM伺服器把使用者A存儲在伺服器上的好友清單及 相關資訊回送到他的用戶端機,這些資訊包括也線上狀态、IP位址、IM用戶端使用的TCP端口(Port)号等資訊,使用者A的IM用戶端收到後将顯示這些好友清單及其線上狀态。

三、IM通訊方式

1.線上直接通訊              如果使用者A想與他的線上好友使用者B聊天,他将直接通過伺服器發送過來的使用者B的IP位址、TCP端口号等資訊,直接向使用者B的PC機發出聊天資訊,使用者B 的IM用戶端軟體收到後顯示在螢幕上,然後使用者B再直接回複到使用者A的PC機,這樣雙方的即時文字消息就不再IM伺服器中轉,而是直接通過網絡進行點對點 的通訊,即對等通訊方式(Peer To Peer)。

2.線上代理通訊              使用者A與使用者B的點對點通訊由于防火牆、網絡速度等原因難以建立或者速度很慢,IM伺服器将會主動提供消息中轉服務,即使用者A和使用者B的即時消息全部先發 送到IM伺服器,再由伺服器轉發給對方。

3.離線代理通訊              使用者A與使用者B由于各種原因不能同時線上的時候,如此時A向B發送消息,IM伺服器可以主動寄存A使用者的消息,到B使用者下一次登陸的時候,自動将消息轉發 給B。

4.擴充方式通訊              使用者A可以通過IM伺服器将資訊以擴充的方式傳遞給B,如短信發送方式發送到B的手機,傳真發送方式傳遞給B的電話機,以email的方式傳遞給B的電子郵箱等。

             早期的IM系統,在IM用戶端和IM伺服器之間通訊采用UDP協定,UDP協定是不可靠的傳輸協定,而在IM用戶端之間的直接通訊中,采用具備可靠傳輸能 力的TCP協定。随着使用者需求和技術環境的發展,目前主流的IM系統傾向于在IM用戶端之間、IM用戶端和IM伺服器之間都采用TCP協定。

             即時通訊相對于其他通訊方式如電話、傳真、email等的最大優勢就是消息傳達的即時性和精确性,隻要消息傳遞雙方均在網絡上可以互通,使用即時通訊軟體傳遞消息,傳遞延時僅為1秒種.

四、興起的嵌入式IM工具。

傳統的IM在統治了網際網路即時通訊領域長達十年之久,以其日趨穩定的定能,與較強的使用者黏着度,至今仍統治着這個巨大的市場。然而,軟體行業的技術精英們,并不滿足于此。他們厚積薄發,一直緻力于開發出性能更 為優越的即時通訊工具。當然,在功能上的不斷完善,自然是一個必然的發展方向,在Web2.0時代,如何大力增強使用者對網站的黏着度,而不僅僅是對于IM 的擁附,已經成為他們的主攻方向了。于是,嵌入式IM工具,應運而生了。

相對以往的傳統的即使溝通工具,它們需要使用者下載下傳軟體包,需要使用者進行安裝。對于擁有IM産品的網站而言,使用者在登陸網站後,不能直接使用其IM工具,對于流量與使用者的黏着度,都是有一定影響的。是以在IM 與網站互相依存的今天,沒有哪家網絡公司,願意将IM工具孤立開來。

于是,目前,一種新型的嵌入式IM工具就應運而生了。這種IM工具,不需要下載下傳安裝,當使用者登陸網頁後,該IM直接嵌套在網頁中,可以直接使用。

而在功能上,則一點也不輸于傳統的IM,無論是傳統的文字溝通的速度與效率,還是近年來越來越成為IM工具必備的音頻/視訊功能,這種嵌入式IM都能提供非常穩定的傳輸。更值得一提的是,因為嵌入式IM是嵌套 在網頁上的,軟體供應商,可以根據網站需求,設計出适合網站風格的IM産品。而不是像傳統的IM工具,千篇一律,毫無個性可言。

目前,這類嵌入式IM在社群、交友、社團及協作等類型的 網站上,應用已經較為廣泛。在Web2.0時代,将發揮越來越重要的作用。