天天看點

TCP和UDP傳輸的深入淺析,MSN和QQ檔案傳輸速度解析

來源:http://www.xgdown.com/

發現很多情況下,MSN傳輸檔案比QQ要慢,倒不是說msn沒有快的時候,但是大部分的時候是真的比QQ慢,連我這種神經比較大條的人都注意到了,Google了一下,早就有人做了解答,基本上就是說msn傳輸檔案是使用TCP,而QQ使用UDP,剩下的事情就是論證TCP傳輸檔案沒有UDP快。大概的就是下面的幾個觀點:

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一樣。

繼續閱讀