IM 即時通訊實現原理

NO IMAGE
 

即時通訊(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時代,將發揮越來越重要的作用。