一、什么是TCP和UDP  
      TCP和UDP是TCP/IP協議中的兩個傳輸層協議,它們使用IP路由功能把數據包發送到目的地,從而為應用程序及應用層協議(包括:HTTP、SMTP、SNMP、FTP和Telnet)提供網絡服務。TCP提供的是面向連接的、可靠的數據流傳輸,而UDP提供的是非面向連接的、不可靠的數據流傳輸。面向連接的協議在任何數據傳輸前就建立好了點到點的連接。ATM和幀中繼是面向連接的協議,但它們工作在數據鏈路層,而不是在傳輸層。普通的音頻電話也是面向連接的。  
      可靠的傳輸協議可避免數據傳輸錯誤。其實現方式是:在構造數據包時在其中設置校驗碼,到達目的地后再采用一定的算法重新計算校驗碼,通過比較二者,就可以找出被破壞了的數據。因為需要重發被破壞了的和已經丟失的數據,所以在需要重發數據時協議必須能夠使目的地給出源頭的一個確認信號。有些數據包不一定按照順序到達,所以協議必須能夠探測出亂序的包,暫存起來,然后把它們按正確的次序送到應用層中去。另外,協議還必須能夠找出并丟棄重復發送的數據。一組定時器可以限制針對不同確認的等待時間,這樣就可以開始重新發送或重新建立連接。  
      數據流傳輸協議不支持位傳輸。TCP不能在一個包內以字節或位為單位構造數據,它只負責傳輸未經構造的8位字符串。  
      非面向連接的傳輸協議在數據傳輸之前不建立連接,而是在每個中間節點對非面向連接的包和數據包進行路由。沒有點到點的連接,非面向連接的協議,如UDP,是不可靠的連接。當一個UDP數據包在網絡中移動時,發送過程并不知道它是否到達了目的地,除非應用層已經確認了它已到達的事實。非面向連接的協議也不能探測重復的和亂序的包。標準的專業術語用“不可靠”來描述UDP。在現代網絡中,UDP并不易于導致傳輸失敗,但是你也不能肯定地說它是可靠的。 

二、TCP工作流程  
      現在讓我們一起來看看TCP段的各個域,在IP包中它們緊跟在IP頭部信息之后。第一個16位確認了源端口,第二個16位確認了目的端口。端口的劃分使IP主機之間可用單個的IP地址實現不同類型的并發連接。在絕大多數現代操作系統中,采用32位IP地址和16位端口地址的組合來確認一個接口。源接口和目的接口的組合就定義了一個連接。有216或65536個可能的端口。最低的1024個端口是常用的,它們是系統為特定的應用層協議所保留的默認設置。如:默認狀態下,HTTP使用端口80,而POP3使用端口110。其它的應用可以使用編號更高的端口。  
      在接下來的兩個域中,序列號和確認號是TCP實現可靠連接的關鍵。當建立一個TCP連接時,發送方主機發出一個隨機的初始化序列號給初始化器,初始化器將其加1后送回確認域的起始器,這意味著下一個字節可以發送了。一旦數據開始流動,序列號和確認號將跟蹤已發送了那些數據,那些數據已被確認。因為每個域都是32位,總共可以有232個值,所以每個域的范圍是:0~4294967295,當超過上限時回到0。  
      4位的偏移量代表TCP頭部一共有多少個32位的信息。這個信息是必不可少的,因為有可選的頭部區域,偏移量標識了頭部的結束和數據的開始。  
      TCP的設計者保留了接下來的6位,以防萬一將來要對其進行擴展。實際上,自從RFC793(傳輸控制協議)1981年發布以來,還沒人有恰當的理由使用這些位,在這一點上,Jon  Postel和他的同事一定是過分謹慎了。  
      隨后的6位每個都是一個標志。若UNG標志位的值為1,意味著遠在頭部緊急指針區域的數據是有效的;若ACK標志位的值為1,則意味著確認號區域中的數據是有效的。(注意:一個SYN包有一個有意義的序列號,但它的確認號是無意義的,因為它并不確認任何事件)PSH標志位使數據不必等待發送和等待接收。RST標志位將斷開一個連接。SYN(同步)標志位意味著序列號是有效的,FIN(結束)標志位將指出發送方已經發完了數據。  
      16位長的窗口區域表示了“滑動窗口”的大小,也就是告訴發送方它已經準備好接收多少個字的數據。TCP通過調整窗口的大小來控制數據的流量。一個值為0的窗口意味著通告發送方:如果沒有進一步的通知,接收器已滿,不能再接收更多的數據了。大的窗口可以確保在任何給定的時間傳輸多達65536個未經確認的字節,但是,當重發定時器超時且又沒有得到接收確認時,窗口將減半,從而有效地降低傳輸速率。  
      16位的校驗碼區域保證了數據的完整性,保護了TCP頭部和IP頭部的各個區域。發送方計算校驗值并把它插入這個區域,接收方根據收到的包重新計算該值并比較二者,如果它們是匹配的,則認為數據是完整無損的。  
      當設置緊急標志位時,緊急指針是一個16位的偏移量,它代表必須加快的最后一個字。選擇區域可以容納0或多個32位字,可擴展TCP的性能。大多數常用的選擇區域支持大于65536字節的窗口,從而縮短了等待確認的時間,尤其是在高傳輸率時。  
      TCP的傳輸機構有多個定時器。當一個包發送時,重發定時器開始計數;當收到確認信號后,重發定時器停止計數。如果超過設定時間段還沒有收到確認信號,就重發該包。一個比較棘手的問題是如何設置該時間段。如果太長,當網絡傳輸錯誤增加時將導致不必要的等待時間;如果太短,就會產生過多的重復包從而降低網絡的反應時間?,F代TCP協議根據實際情況對重發定時器進行動態設定。  
      持續定時器對于避免死鎖是必不可少的。如果網絡收到了一個大小為0的窗口確認并且丟失了隨后的重發數據的確認,持續定時器將超時并發送一個探針。探針的回應將指出窗口的大小(也許仍為0)。保持定時器在本端沒有任何活動后,將檢查在連接的另一端是否還有運行的進程。如果沒有任何回應,該定時器將斷開連接。  
      當斷開一個連接時,斷開連接定時器將包的最大生命期加倍。該定時器在連接斷開之前確保流量最大。 
      不管重發過程執行得多么有效,很少的丟失包就能嚴重地降低TCP連接的流量。每個未收到的包或包的片段只會在重發定時器超時的時候才會丟失。在數據重發時,接收過程一直在遞送這些重發的數據,這樣就使總體的數據傳輸陷于停頓,直到丟失的數據被取代為止。這些重發過程導致基于TCP的連接有時處于不穩定狀態。
 
三、TCP與UDP的選擇  
      如果比較UDP包和TCP包的結構,很明顯UDP包不具備TCP包復雜的可靠性與控制機制。與TCP協議相同,UDP的源端口數和目的端口數也都支持一臺主機上的多個應用。一個16位的UDP包包含了一個字節長的頭部和數據的長度,校驗碼域使其可以進行整體校驗。(許多應用只支持UDP,如:多媒體數據流,不產生任何額外的數據,即使知道有破壞的包也不進行重發。)  
      很明顯,當數據傳輸的性能必須讓位于數據傳輸的完整性、可控制性和可靠性時,TCP協議是當然的選擇。當強調傳輸性能而不是傳輸的完整性時,如:音頻和多媒體應用,UDP是最好的選擇。在數據傳輸時間很短,以至于此前的連接過程成為整個流量主體的情況下,UDP也是一個好的選擇,如:DNS交換。把SNMP建立在UDP上的部分原因是設計者認為當發生網絡阻塞時,UDP較低的開銷使其有更好的機會去傳送管理數據。TCP豐富的功能有時會導致不可預料的性能低下,但是我們相信在不遠的將來,TCP可靠的點對點連接將會用于絕大多數的網絡應用。

四、總結

      二者就是基于連接與無連接的區別。由此導致TCP保證數據正確性,UDP可能丟包; TCP保證數據順序,UDP不保證。TCP對系統資源的要求較UDP多。
TCP與UDP的區別:
  1、基于連接與無連接
  2、對系統資源的要求(TCP較多,UDP少)
  3、UDP程序結構較簡單
  4、流模式與數據報模式
  5、TCP保證數據正確性,UDP可能丟包,TCP保證數據順序,UDP不保證
      工業場合的應用一般都有以下特點:
1、要求時時傳輸,但也有一些場合是定時傳輸,總的來說在整個傳輸過程中要求服務器中心端和GPRS終端設備能相互的、時時的傳輸數據。
TCP本身就是可靠鏈路傳輸,提供一個時時的雙向的傳輸通道,能很好的滿足工業現場傳輸的要求。但是GPRS網絡對TCP鏈路也存在一個限制:此條鏈路在長時間(大概20分鐘左右,視具體情況而定)沒有數據流量,會自動降低此鏈路的優先級直至強制斷開此鏈路。所以在實際使用中也會采用心跳包(一般是一個字節的數據)來維持此鏈路。
UDP由于自身特點,以及GPRS網絡UDP端口資源的有限性,在一段時間沒有數據流量后,端口容易改變,產生的影響就是從服務器中心端向GPRS終端發送數據,GPRS終端接收不到。具體的原因就是移動網關從中作了中轉,需要隔一定時間給主機發UDP包來維持這個IP和端口號,這樣主機就能主動給GPRS發UDP包了并且我在測試中發現,這個間隔時間很短,我在1多分鐘發一次UDP包才能夠維持,但是再長可能移動網關那邊就要丟失這個端口了,此時如果主機想主動發數據給GPRS,那肯定是不行的了,只有GPRS終端設備再發一個UDP包過去,移動重新給你分配一個中轉IP和端口,才能夠進行雙向通訊。
 2、要求數據的丟包率較小。有些工業場合,例如電力、水務抄表,環保監測等等,不容許傳輸過程中的數據丟失或者最大限度的要求數據的可靠性。
從這一點來看,很顯然在無線數據傳輸過程中,TCP比UDP更能保證數據的完整性、可靠性,存在更小的丟包率。在實際測試中也是如此。以廈門藍斯通信有限公司提供的GPRS終端設備為例:TCP的在千分之9,UDP的在千分之17左右。
3、要求降低費用。目前有很大部分GPRS設備的應用都是取代前期無線數傳電臺,除了使用范圍外,其考慮的主要問題就是費用。能降低費用當然都是大家最愿意接受的。和費用直接相關的就是流量了,流量低,費用就低了。
雖然TCP本身的包頭要比UDP多,但是UDP在實際應用中往往需要維護雙向通道,就必須要通過大量的心跳包數據來維護端口資源??偟谋容^起來,UDP的實際流量要比TCP還要大。很多使用者在初期的時候并不了解UDP需要大量心跳包來維持端口資源這個問題,往往都認為UDP要比TCP更節省流量,實際上這里存在著一個誤區。
4、在某些特定的應用場合,例如一些銀行的時時交互系統,對響應速度要求很高,此時數據傳輸頻率較快,不需要大量心跳包維持UDP端口資源,采用UDP就比較有利了。
5、在目前的1:N的傳輸模式中,既有多個GPRS終端設備往一個服務器中心傳輸數據,此時采用UDP會比TCP要好的多,因為UDP耗用更少的系統資源。但是在實際應用中卻發現,很多用戶還是采用TCP的傳輸方式,建立二級中心1:A(1:N),即每一個分中心對應N/A臺設備,獨立處理數據,再統一將數據傳送到主中心。這樣既能保證了傳輸過程中采用了TCP的傳輸協議,又能很好處理了中心服務器的多鏈路的系統耗用的問題。