
http://nopainnogain.iteye.com/blog/832017
http://blog.csdn.net/realxie/article/details/7270119
http://zoomq.qiniudn.com/ZQScrapBook/ZqSKM/data/20100325150259/index.html
個(gè)人理解:TCP是天生的長(cháng)連接協(xié)議,主要看其上的協(xié)議
TCP連接一旦建立連接,通信雙方就可以相互發(fā)送信息,可以看做是長(cháng)連接
雖然http也是基于TCP的,但是其在通訊結束之后,瀏覽器就主動(dòng)斷開(kāi)連接,所以看起來(lái)是 request-response的形式
poll方式
poll方式,也稱(chēng)為輪循,是大家都比較熟悉的一種數據同步方式,客戶(hù)端定期去ping查詢(xún)服務(wù)器,確定是否有需要的數據。例如,軟件更新模塊,客戶(hù)端軟件需要定期去查詢(xún)官方網(wǎng)站,判斷當前是否有更新的版本,如果有就提醒用戶(hù)進(jìn)行升級。郵件客戶(hù)端,需要定期查詢(xún)郵件服務(wù)器,查詢(xún)是否有新的郵件。RSS閱讀器,也是需要不斷的查詢(xún)r(jià)ss地址的狀態(tài),如果有更新,就將數據拿回來(lái)。
當服務(wù)器沒(méi)有數據的時(shí)候,poll方式會(huì )浪費大量的帶寬。 為了降低帶寬,通常是采用減低poll的頻率來(lái)實(shí)現的,這就導致了消息的長(cháng)延遲,實(shí)時(shí)性不高。像gmail的POP3郵件檢查間隔從10分鐘到1小時(shí)不等。
push方式
poll的問(wèn)題在于很多情況下,通信信道是單向的。為了解決poll的問(wèn)題,可以將通信信道設計為雙向的,這樣就可以服務(wù)器采用push的方式主動(dòng)向客戶(hù)端進(jìn)行數據同步了。雙向通信信道設計,考慮到要穿透NAT和防火墻,很多實(shí)現采用長(cháng)連接。例如各種IM的實(shí)現:MSN是TCP的長(cháng)連接,QQ是UDP模仿的長(cháng)連接,GTALK是HTTP模仿的長(cháng)鏈接。
push方式,服務(wù)器主動(dòng)向客戶(hù)端推送數據。當前實(shí)現push方式有兩種方法:
1. 客戶(hù)端首先連接到服務(wù)器,并維持長(cháng)連接
2. 服務(wù)器能夠直接訪(fǎng)問(wèn)到客戶(hù)端,不需要長(cháng)連接
在國內NAT和firewall遍地都是的情況下,第2種方法不是很可行,但是對于一些企業(yè)應用,這種方法還是不錯的,比如后面提到的pubsubhubbub。
但是push方式,通常需要長(cháng)連接,對于服務(wù)器端其實(shí)也是一個(gè)不小的壓力,雖然現在C10K問(wèn)題得到了比較好的解決,但是對于一些大規?;ヂ?lián)網(wǎng)應用來(lái)講,用戶(hù)數是數以?xún)|計的,單單是維持TCP連接,就需要太多的服務(wù)器。因此,除了一些實(shí)時(shí)性要求比較高的應用,現在push方式使用的范圍還不是很廣,例如push方式在IM、服務(wù)器監控等領(lǐng)域都有應用。

由于大多數的客戶(hù)端不支持HTTP的Pipeling(單一的連接上承載并發(fā)的請求),于是,客戶(hù)端必須從第二條HTTP連接發(fā)送消息。當第二條HTTP連接有新的請求發(fā)送的時(shí)候,連接管理器將第一條連接中的請求返回,即便此時(shí)第一條連接中的返回的是空數據包。這樣做的原因是讓客戶(hù)端有需要的話(huà)可以發(fā)送新的請求過(guò)來(lái)??蛻?hù)段同一時(shí)間最多只能保持兩條HTTP連接,否則的話(huà),客戶(hù)端必須等待舊的請求處理完之后才能發(fā)送新的請求
在網(wǎng)絡(luò )經(jīng)常中斷的環(huán)境下,BOSH退化成每個(gè)數據請求一個(gè)新HTTP連接。然而,在通常情況下,網(wǎng)絡(luò )環(huán)境良好,客戶(hù)端可以使用http/1.1,這個(gè)時(shí)候,一個(gè)Session包含兩個(gè)TCP長(cháng)連接,所有的請求都在這兩個(gè)長(cháng)連接上傳輸?;旧先魏螘r(shí)候,客戶(hù)端通過(guò)一條連接能夠推送數據到服務(wù)器,與此同時(shí),服務(wù)器端可以“推送”數據到客戶(hù)端。值得注意的是,這兩條長(cháng)連接的角色在客戶(hù)端每發(fā)送一次請求則角色轉換一次。
盡管大多數時(shí)間可以隨時(shí)推送數據到對端,但是,如果一方剛剛推送完數據,則需要等一個(gè)網(wǎng)絡(luò )來(lái)回的時(shí)間才能推送下一個(gè)數據。

不管UDP還是TCP,最終登陸成功之后,QQ都會(huì )有一個(gè)TCP連接來(lái)保持在線(xiàn)狀態(tài)。這個(gè)TCP連接的遠程端口一般是80,采用UDP方式登陸的時(shí)候,端口是8000。因此,假如你所在的網(wǎng)絡(luò )開(kāi)放了80端口(80端口是最常用端口。。就是通常訪(fǎng)問(wèn)Web的端口,禁掉它的話(huà),你的網(wǎng)絡(luò )對你來(lái)說(shuō)價(jià)值已經(jīng)不大了),但沒(méi)有屏蔽騰訊的服務(wù)器IP,恭喜你,你是可以登陸成功QQ的。
二、聊天消息通信。
采用UDP協(xié)議,通過(guò)服務(wù)器中轉方式。因此,現在的IP偵探在你僅僅跟對方發(fā)送聊天消息的時(shí)候是無(wú)法獲取到IP的。大家都知道,UDP 協(xié)議是不可靠協(xié)議,它只管發(fā)送,不管對方是否收到的,但它的傳輸很高效。但是,作為聊天軟件,怎么可以采用這樣的不可靠方式來(lái)傳輸消息呢?于是,騰訊采用了上層協(xié)議來(lái)保證可靠傳輸:如果客戶(hù)端使用UDP協(xié)議發(fā)出消息后,服務(wù)器收到該包,需要使用UDP協(xié)議發(fā)回一個(gè)應答包。如此來(lái)保證消息可以無(wú)遺漏傳輸。之所以會(huì )發(fā)生在客戶(hù)端明明看到“消息發(fā)送失敗”但對方又收到了這個(gè)消息的情況,就是因為客戶(hù)端發(fā)出的消息服務(wù)器已經(jīng)收到并轉發(fā)成功,但客戶(hù)端由于網(wǎng)絡(luò )原因沒(méi)有收到服務(wù)器的應答包引起的。
三、文件/自定義表情傳送。
大家都知道,QQ可以傳送文件,可以發(fā)送自定義表情。先說(shuō)官方表情。官方表情實(shí)際發(fā)送的是命令字,而沒(méi)有發(fā)送表情??蛻?hù)端收到命令字后,會(huì )自動(dòng)解釋為對應的表情。因此,QQ2008正式版的客戶(hù)端發(fā)出的新版表情,在2007beta4及以前的版本無(wú)法找到相對應的表情,就無(wú)法解釋?zhuān)吹降木蜁?huì )是空白信息,但查聊天記錄就會(huì )有[表情]字樣。
自定義表情的傳送是以文件傳輸方式進(jìn)行的。
下面說(shuō)文件傳輸方式:A要向B發(fā)送一個(gè)文件,于是發(fā)出一個(gè)文件傳送請求。服務(wù)器收到這個(gè)文件傳送請求后,轉發(fā)給B,同時(shí)或者在B應答后,將A的IP地址同時(shí)發(fā)送給B。B這個(gè)時(shí)候就得到了A的真實(shí)IP。這里的IP是你的本機IP。也就是說(shuō),如果A處在內網(wǎng),B得到的地址就是一個(gè)內網(wǎng)地址。B得到了A的地址之后,就會(huì )嘗試去連接A。如果B也處于內網(wǎng),那么,顯然A跟B之間的連接是無(wú)法建立的。這個(gè)時(shí)候,客戶(hù)端就會(huì )請求服務(wù)器進(jìn)行文件中轉。因為服務(wù)器具有公網(wǎng) IP,處在內網(wǎng)的A跟B都是可以連接到服務(wù)器的,于是,A跟B的文件傳送就通過(guò)服務(wù)器中轉的方式,順利進(jìn)行。(注:服務(wù)器文件中轉使用443端口)
* 注:什么是內網(wǎng)、公網(wǎng)
內網(wǎng)、公網(wǎng)是兩種Internet的接入方式。
內網(wǎng)接入方式:上網(wǎng)的計算機得到的IP地址是Inetnet上的保留地址,保留地址有如下3種形式:
10.x.x.x
172.16.x.x至172.31.x.x
192.168.x.x
內網(wǎng)的計算機以NAT(網(wǎng)絡(luò )地址轉換)協(xié)議,通過(guò)一個(gè)公共的網(wǎng)關(guān)訪(fǎng)問(wèn)Internet。
內網(wǎng)的計算機可向Internet上的其他計算機發(fā)送連接請求,但Internet上其他的計算機無(wú)法向內網(wǎng)的計算機發(fā)送連接請求。
公網(wǎng)接入方式:上網(wǎng)的計算機得到的IP地址是Inetnet上的非保留地址。公網(wǎng)的計算機和Internet上的其他計算機可隨意互相訪(fǎng)問(wèn)。
所以,如果一個(gè)局域網(wǎng)只開(kāi)放80端口,QQ是可以登陸成功的,也可以進(jìn)行聊天。但傳送文件也是不可以的,除非你們都在同一個(gè)內網(wǎng)。如果局域網(wǎng)還同時(shí)開(kāi)放443端口,那么,恭喜你,QQ的功能你都可以正常使用。
QQ是不是TCP和UDP一起用?如果用UDP,如何做到信息的可靠發(fā)送?
答Q即可以使用TCP也可以使用UDP,但QQ默認是使用UDP協(xié)議,因為UDP協(xié)議消耗資源小,發(fā)送速度快,但當UDP協(xié)議不能正常轉發(fā)的時(shí)候,就會(huì )采用TCP協(xié)議進(jìn)行發(fā)送.
而信息的可靠發(fā)送是通過(guò)各種驗證機制來(lái)完成的,這一點(diǎn)你可以去GOOGLE之類(lèi)的網(wǎng)站去搜索下.
QQ用的是UDP打洞技術(shù)還是HTTP遂道?
答:發(fā)送消息的時(shí)候是UDP打洞,登陸的時(shí)候使用HTTP~因為登陸服務(wù)器其實(shí)就是一個(gè)HTTP服務(wù)器,只不過(guò)不是常用的那些,那個(gè)服務(wù)器是TX自行開(kāi)發(fā)的
因為用戶(hù)一般都是在局域網(wǎng)內,地址都為私有IP,IM服務(wù)器是如何將信息轉發(fā)到用戶(hù)的?
答:如果使用TCP就沒(méi)什么好說(shuō)了~由內網(wǎng)向外網(wǎng)連接,只要能夠連接上進(jìn)行握手了,消息就可以暢通無(wú)阻的進(jìn)行發(fā)送了.如果使用UDP的話(huà),就是使用的打洞技術(shù)了,只要通道打通了,發(fā)送消息基本和TCP沒(méi)什么區別,要做的只是維護消息的完整性而已.
QQ是一個(gè)基于TCP/UDP協(xié)議的通訊軟件,而MSN是基于TCP協(xié)議的通訊軟件。
那么QQ是如何通訊的呢?在TCP/IP協(xié)議中,唯一標識一個(gè)應用進(jìn)程的是socket,它通過(guò)網(wǎng)絡(luò )層的IP地址和傳輸層的端口號來(lái)實(shí)現,對與同一個(gè)IP地址的內部網(wǎng)絡(luò ),通過(guò)不同的端口號來(lái)標識不同的QQ進(jìn)程;當你登陸QQ游戲服務(wù)器的時(shí)候,服務(wù)器會(huì )保留你的保留IP地址和端口號信息,并在你的好友的QQ進(jìn)程中進(jìn)行列表顯示,然后兩個(gè)進(jìn)程就可以通信了。
通常,發(fā)送文件的計算機首先要通過(guò)消息服務(wù)器將其IP地址發(fā)送給接收計算機,當接收計算機同意接收的確認消息反饋到消息服務(wù)器后,消息服務(wù)器將據此設置好文件傳輸對話(huà)。隨即,發(fā)送計算機與接收計算機就會(huì )在確定好的端口范圍內,建立起TCP或UDP連接開(kāi)始文件的檢索與傳輸。
在默認狀態(tài)下,QQ優(yōu)先采用了UDP(User Data Protocol,用戶(hù)數據報協(xié)議)協(xié)議傳送數據,而對可靠性要求高的數據通訊系統往往使用TCP協(xié)議傳輸數據。與TCP協(xié)議不同,UDP協(xié)議并不提供數據傳送的驗證機制——在整個(gè)文件傳輸過(guò)程中如果出現數據報的丟失,協(xié)議本身并不能作出任何的檢測或提示。因此,通常人們把UDP協(xié)議稱(chēng)為不可靠的傳輸協(xié)議。
UDP協(xié)議適用于無(wú)須應答、要求時(shí)效的軟件使用,這樣的設計正好與QQ追求的目標相符,所以QQ優(yōu)先使用了此協(xié)議進(jìn)行一切功能應用。但是,由于 UDP協(xié)議具有不可靠性,常會(huì )因種種原因導致消息或數據的發(fā)送失?。ê芏鄷r(shí)候會(huì )發(fā)現發(fā)送文件給對方接收時(shí),對方根本收不到要求接收文件的消息?;蚴前l(fā)送聊天消息時(shí),對方根本沒(méi)有收到過(guò)消息)。顯然,UDP協(xié)議由于排除了信息可靠傳遞機制,將安全和排序等功能移交給上層應用來(lái)完成,極大降低了執行時(shí)間,使速度得到了保證。QQ在數據傳輸上更注重實(shí)際性能,為了獲得更好的使用效果,往往可以犧牲一定的可靠性。因此,使用QQ來(lái)傳輸數據,在很多時(shí)候就成了一個(gè)“不錯”的選擇。
一般內網(wǎng)傳輸首選QQ,速度最快,QQ的文件傳輸是直接個(gè)人對個(gè)人,采用P2P的傳輸方式,具有不需中轉的優(yōu)勢,而且服務(wù)器都在國內,傳輸性能要高于外國IM軟件。聯(lián)系客服