TCP協(xié)議
協(xié)議特點:面向連接的可靠傳輸,報頭20字節(jié),存在流量控制機制(超時重發(fā),丟棄重復數(shù)據(jù),檢驗數(shù)據(jù),分段排序,擁塞處理,滑動窗口機制,保證數(shù)據(jù)能從一端傳到另一端。)
- TCP要保證丟失的package會被再次重發(fā),確保對方能夠收到。
- 三次握手,訪問不丟包,保持準確性,但是流量開銷大。
- TCP在數(shù)據(jù)包接收無序、丟失或在交付期間被破壞時,負責數(shù)據(jù)恢復。
TCP的目的是提供可靠的數(shù)據(jù)傳輸,并在相互進行通信的設備或服務之間保持一個虛擬連接。TCP在數(shù)據(jù)包接收無序、丟失或在交付期間被破壞時,負責數(shù)據(jù)恢復。它通過為其發(fā)送的每個數(shù)據(jù)包提供一個序號來完成此恢復。記住,較低的網(wǎng)絡層會將每個數(shù)據(jù)包視為一個獨立的單元,因此,數(shù)據(jù)包可以沿完全不同的路徑發(fā)送,即使它們都是同一消息的組成部分。這種路由與網(wǎng)絡層處理分段和重新組裝數(shù)據(jù)包的方式非常相似,只是級別更高而已。
為確保正確地接收數(shù)據(jù),TCP要求在目標計算機成功收到數(shù)據(jù)時發(fā)回一個確認(即 ACK)。如果在某個時限內(nèi)未收到相應的 ACK,將重新傳送數(shù)據(jù)包。如果網(wǎng)絡擁塞,這種重新傳送將導致發(fā)送的數(shù)據(jù)包重復。但是,接收計算機可使用數(shù)據(jù)包的序號來確定它是否為重復數(shù)據(jù)包,并在必要時丟棄它。
UDP協(xié)議
協(xié)議特點:無連接、報頭8個字節(jié),無法保證對端接收到數(shù)據(jù)的完整性。通過UDP協(xié)議傳輸?shù)竭_目的地的時間和內(nèi)容的完整性都不能保證。
- 不可靠協(xié)議,對端收不收到包是不管的,可能造成丟包,但是開銷小。
UDP不提供可靠性,它只是把應用程序傳給IP層的數(shù)據(jù)報發(fā)送出去,但是并不能保證它 們能到達目的地。由于UDP在傳輸數(shù)據(jù)報前不用在客戶和服務器之間建立一個連接,且沒有超時重發(fā)等機制,故而傳輸速度很快。
如何決定應用程序是使用TCP還是UDP?
TCP適合實時性要求不高,但要求內(nèi)容要完整傳輸?shù)膽谩O啾榷裕琔DP由于無連接、無重傳確認,所以傳輸效率高、延時小,適合實時性要求高的應用,如游戲服務器,音頻,視頻等;另外,由于不用維持大的并發(fā)量,所以適合巨量服務的server,加上合適的時間控制,可以用來設計更大的并發(fā)服務器;再者就是,UDP可以更高效的利用網(wǎng)絡帶寬。
舉個例子:
視頻流用UDP:若是鏈路中途丟包了導致丟了一兩個幀,不影響到觀影體驗。視頻傳輸不需要那么高的準確性,偶爾丟個包也沒什么問題。
可以在應用層面去解決UDP丟包亂序的問題:重傳也由上層協(xié)議來控制。
1. jitterbuffer
2. RTP
3. MTU
UDP 在許多方面非常有效。當某個程序的目標是盡快地傳輸盡可能多的信息時(其中任意給定數(shù)據(jù)的重要性相對較低),可使用 UDP。ICQ 短消息使用 UDP 協(xié)議發(fā)送消息。
許多程序將使用單獨的TCP連接和單獨的UDP連接。重要的狀態(tài)信息隨可靠的TCP連接發(fā)送,而主數(shù)據(jù)流通過UDP發(fā)送。
國人幾乎都是用的QQ,在建立連接階段,使用的是面向連接的TCP協(xié)議,通過三次握手來完成;然后,在文字數(shù)據(jù)傳輸階段,使用的是UDP協(xié)議,但需要中間服務器轉發(fā)(估計是使用了connect()的UDP,QQ離線發(fā)送/接收數(shù)據(jù)的基礎)。而音視頻數(shù)據(jù)的發(fā)送一定要使用UDP協(xié)議,因為一般的客戶可以容忍稍微模糊(略有缺失的數(shù)據(jù)塊)的聲音或視頻,但估計不會接受一會斷開,一會連接(因為TCP容易斷線)的音視頻;而文件傳輸則使用了P2P的協(xié)議,當前大多P2P使用的UTP協(xié)議也是基于UDP的,因為使用TCP的話會浪費大量的帶寬。