1. 程式人生 > >IM即時通訊實現原理

IM即時通訊實現原理

客戶端使用 在線狀態 ddos 開發 mapping 在線網友 傳真 ddl 說明

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

IM即時通訊實現原理