TCP與UDP的選擇
若是比較UDP包和TCP包的結構,很明顯UDP包不具有TCP包複雜的可靠性與控制機制。與TCP協議相同,UDP的源端口數和目的端口數也都支持一臺 主機上的多個應用。一個16位的UDP包包含了一個字節長的頭部和數據的長度,校驗碼域使其能夠進行總體校驗。(許多應用只支持UDP,如:多媒體數據 流,不產生任何額外的數據,即便知道有破壞的包也不進行重發。)
很明顯,當數據傳輸的性能必須讓位於數據傳輸的完整性、可控制性和可靠性時,TCP協議是固然的選擇。當強調傳輸性能而不是傳輸的完整性時,如:音頻和多 媒體應用,UDP是最好的選擇。在數據傳輸時間很短,以致於此前的鏈接過程成爲整個流量主體的狀況下,UDP也是一個好的選擇,如:DNS交換。把 SNMP創建在UDP上的部分緣由是設計者認爲當發生網絡阻塞時,UDP較低的開銷使其有更好的機會去傳送管理數據。TCP豐富的功能有時會致使不可預料 的性能低下,可是咱們相信在不遠的未來,TCP可靠的點對點鏈接將會用於絕大多數的網絡應用。
QQ通訊原理--
我研究的是 QQ2007beta4 版本的通訊原理,相信以後的版本暫時也不會有改動。。
1 、登錄。無論 UDP 仍是 TCP ,最終登錄成功以後, QQ 都會有一個 TCP 鏈接來保持在線狀態。這個 TCP 鏈接的遠程端口通常是 80 ,採用 UDP 方式登錄的時候,端口是 8000 。所以,假如你所在的網絡開放了 80 端口( 80 端口是最經常使用端口。。就是一般訪問 Web 的端口,禁掉它的話,你的網絡對你來講價值已經不大了),但沒有屏蔽騰訊的服務器 IP ,恭喜你,你是能夠登錄成功 QQ 的。
2 、聊天消息通訊。採用 UDP 協議,經過服務器中轉方式。所以,如今的 IP 偵探在你僅僅跟對方發送聊天消息的時候是沒法獲取到 IP 的。你們都知道, UDP 協議是不可靠協議,它只管發送,無論對方是否收到的,但它的傳輸很高效。可是,做爲聊天軟件,怎麼能夠採用這樣的不可靠方式來傳輸消息呢?因而,騰訊採用 了上層協議來保證可靠傳輸:若是客戶端使用 UDP 協議發出消息後,服務器收到該包,須要使用 UDP 協議發回一個應答包。如此來保證消息能夠無遺漏傳輸。之因此會發生在客戶端明明看到 「 消息發送失敗 」 但對方又收到了這個消息 的狀況,就是由於客戶端發出的消息服務器已經收到並轉發成功,但客戶端因爲網絡緣由沒有收到服務器的應答包引發的。
3 、文件 / 自定義表情傳送。你們都知道, QQ 能夠傳送文件,能夠發送自定義表情。先說官方表情。官方表情實際發送的是命令字,而沒有發送表情。客戶端收到命令字後,會自動解釋爲對應的表情。所以, QQ2007 正式版的客戶端發出的新版表情,在 2007beta4 及之前的版本沒法找到相對應的表情,就沒法解釋,看到的就會是空白信息,但查聊天記錄就會有 [ 表情 ] 字樣。自定義表情的傳送是以文件傳輸方式進行的。下面說文件傳輸方式: A 要向 B 發送一個文件,因而發出一個文件傳送請求。服務器收到這個文件傳送請求後,轉發給 B ,同時或者在 B 應答後,將 A 的 IP 地址同時發送給 B 。 B 這個時候就獲得了 A 的真實 IP 。這裏的 IP 是你的本機 IP 。也就是說,若是 A 處在內網, B 獲得的地址就是一個內網地址。 B 獲得了 A 的地址以後,就會嘗試去鏈接 A 。若是 B 也處於內網,那麼,顯然 A 跟 B 之間的鏈接是沒法創建的。這個時候,客戶端就會請求服務器進行文件中轉。由於服務器具備公網 IP ,處在內網的 A 跟 B 都是能夠鏈接到服務器的,因而, A 跟 B 的文件傳送就經過服務器中轉的方式,順利進行。(注:服務器文件中轉使用 443 端口)
「 穿透內網 」 的原理就是這樣的。至於其中的程序細節,暫時還沒研究到。。誰有空就研究研究吧,呵呵
4 、小結。結合 1 跟 2 ,能夠知道,若是一個局域網只開放 80 端口, QQ 是能夠登錄成功的,也能夠進行聊天。但傳送文件也是不能夠的,除非大家都在同一個內網。若是局域網還同時開放 443 端口,那麼,恭喜你, QQ 的功能你均可以正常使用。
原文:http://hi.baidu.com/sunsee/blog/item/d3f3b9228e8ae5fcd6cae252.html