MSN和QQ文件传输速度解析
1. TCP是可靠的,需要驗證數據是否到達和是否正確,而UDP是不可靠的,少做了很多事情,所以MSN的文件傳輸比QQ慢。
我看了當時就想笑,也用了QQ不少時日了,從來也沒有發現傳輸文件有問題的,用UDP作協議也很久了,不做應用層驗證重傳的代碼,我還真不敢寫。這個理由,失敗。
2. TCP建立連接需要3次握手,而UDP不需要,所以TCP慢。
3次握手這個事實倒是千真萬確,還好我沒有那么容易被忽悠,兩個人談話之前要握握手的確要稍微費上幾秒鐘,但是這個關談話的語速啥事情?假如網絡的ping值達到300ms,各位看官喜歡網絡游戲的,估計都不會玩了,否則垂死的boss會高興的發現你忽然變成了木偶可以隨便毆打不還手,最后你只能罵罵電信網通然后復活幾分鐘后又是一條好漢。但是對于TCP,這樣的ping值,3次握手一般都不需要1秒鐘,把這個定為文件慢慢傳的罪魁禍首,似乎太不靠譜了,這個理由還是失敗。
3. TCP一旦建立鏈接,路由就確定了,而UDP是不確定的路由方式,誰速度快走誰的線路。
這樣說就說明沒有作者好好理解TCP/IP協議了,TCP的鏈路只是一個邏輯的,又沒有建立物理鏈路,下面跑的還是IP包,這個包走這條路,那個包完全可能走另外的路,這點TCP和UDP沒有兩樣。理由繼續失敗。
4. msn服務器在國外?
有些道理,但是我聽一個美國的朋友說他也喜歡用QQ傳文件的。
那到底是怎么回事呢?是因為微軟沒有做好?(題外話,個人的確覺得MSN相比QQ的飛速進步而顯得動作遲緩)QQ的Fans開始摩拳擦掌,一些不那么喜歡M$的估計就要開始丟板磚了。不管立場如何,事實還是要探尋一下,本著不求甚解,薄積薄發,淺入淺出的精神,我認為有幾個可能原因:
1. 兩個傳文件客戶端都在NAT后面的時候 (你不知道NAT啥意思?比如多個人通過路由器共享一個貓上網,那么你們一般就是在NAT后面了),從技術實現上講,TCP在這種情況下穿越NAT比UDP麻煩得多。UDP只要開始幾個穿越NAT的協商包需要服務器轉一下,后面的文件數據可以兩個客戶端之間直接傳輸搞定,但是一般TCP就只能全程由服務器中轉了,你說哪一個會比較快? 為什么TCP需要服務器中轉?先看看NAT吧,聽說有高人可以用raw sock搞定,反正我沒有中間服務器搞不定。
2. 但是即使上面的條件不成立,msn還是一般比QQ慢的。問題還是在出在前面提到的驗證數據可靠性上面,TCP是可靠的,UDP是不可靠的,但是用UDP做傳輸文件這檔子事情,肯定要在應用層寫一個驗證的協議,否則傳過來的文件缺胳膊少腿,會被用戶罵死的。說是協議,其實也不難,打個比方吧:
long long ago,賈寶玉在北京,林黛玉在長沙,怎么互訴衷腸呢,派家丁送信!路途遙遠,怎么知道信收到沒有?打電話問?那時候發明了這個就不用送信了,只能看家丁是否帶了回信來了。假如發現一個家丁一個月還沒有回,那就多半迷路堵車遭遇山賊或者開小差到揚州花差快活去了,再派一個人送吧! TCP就是這么做的,UDP在應用層協議一般也需要這么做,但是實現上有時候往往有區別。
北京到長沙之間的路,并不是只有一個人跑的,常常很擁堵,假如發現家丁好久沒有回了,TCP版的賈寶玉再派人送信是要的,但是他會比較識大體,他會少寫信,降低發送速度,原來一天一封,現在可能一周一封了。他想,大家假如都這樣,路就不會那么擁擠了。這做法很有道理,假如塞車了大家都想見縫插針,只能越來越塞,最后大家都動不了,還不如彼此容讓慢慢排隊。而UDP版本的賈寶玉假如也這么集體主義,那么他就叫做TCP友好流,就假如它只管自己拼命擠,就是非TCP友好的。
所有的TCP協議假如發現擁塞,都會馬上降低自己的發送速度。假如基于UDP的協議不這么做的話,原來擁塞的IP包加上重發的包,網路只會越來越擁塞,最后所有的堅持集體主義的TCP流都會做出犧牲,把帶寬讓給一些非TCP友好的UDP流。所以除非網絡狀況非常好,否則TCP是拼不過非TCP友好的協議的。
我懷疑(僅僅是懷疑而已,我也沒有條件和時間驗證),QQ的文件傳輸機制是不那么TCP友好的,它搶帶寬更加"我能",這樣雖然對于整個網絡負荷不是什么好事,但是對于單個用戶,就見仁見智了,就好像大家看待多線程下載或者p2p一樣。
?轉載于:https://www.cnblogs.com/springMVC/archive/2007/07/27/2204677.html
總結
以上是生活随笔為你收集整理的MSN和QQ文件传输速度解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 察看linux内存使用情况
- 下一篇: .NET Framework 如何:提高