一、什么是TCP和UDP
TCP和UDP是TCP/IP協(xié)議中的兩個(gè)傳輸層協(xié)議,它們使用IP路由功能把數(shù)據(jù)包發(fā)送到目的地,從而為應(yīng)用程序及應(yīng)用層協(xié)議(包括:HTTP、SMTP、SNMP、FTP和Telnet)提供網(wǎng)絡(luò)服務(wù)。TCP提供的是面向連接的、可靠的數(shù)據(jù)流傳輸,而UDP提供的是非面向連接的、不可靠的數(shù)據(jù)流傳輸。面向連接的協(xié)議在任何數(shù)據(jù)傳輸前就建立好了點(diǎn)到點(diǎn)的連接。ATM和幀中繼是面向連接的協(xié)議,但它們工作在數(shù)據(jù)鏈路層,而不是在傳輸層。普通的音頻電話(huà)也是面向連接的。
可靠的傳輸協(xié)議可避免數(shù)據(jù)傳輸錯(cuò)誤。其實(shí)現(xiàn)方式是:在構(gòu)造數(shù)據(jù)包時(shí)在其中設(shè)置校驗(yàn)碼,到達(dá)目的地后再采用一定的算法重新計(jì)算校驗(yàn)碼,通過(guò)比較二者,就可以找出被破壞了的數(shù)據(jù)。因?yàn)樾枰匕l(fā)被破壞了的和已經(jīng)丟失的數(shù)據(jù),所以在需要重發(fā)數(shù)據(jù)時(shí)協(xié)議必須能夠使目的地給出源頭的一個(gè)確認(rèn)信號(hào)。有些數(shù)據(jù)包不一定按照順序到達(dá),所以協(xié)議必須能夠探測(cè)出亂序的包,暫存起來(lái),然后把它們按正確的次序送到應(yīng)用層中去。另外,協(xié)議還必須能夠找出并丟棄重復(fù)發(fā)送的數(shù)據(jù)。一組定時(shí)器可以限制針對(duì)不同確認(rèn)的等待時(shí)間,這樣就可以開(kāi)始重新發(fā)送或重新建立連接。
數(shù)據(jù)流傳輸協(xié)議不支持位傳輸。TCP不能在一個(gè)包內(nèi)以字節(jié)或位為單位構(gòu)造數(shù)據(jù),它只負(fù)責(zé)傳輸未經(jīng)構(gòu)造的8位字符串。
非面向連接的傳輸協(xié)議在數(shù)據(jù)傳輸之前不建立連接,而是在每個(gè)中間節(jié)點(diǎn)對(duì)非面向連接的包和數(shù)據(jù)包進(jìn)行路由。沒(méi)有點(diǎn)到點(diǎn)的連接,非面向連接的協(xié)議,如UDP,是不可靠的連接。當(dāng)一個(gè)UDP數(shù)據(jù)包在網(wǎng)絡(luò)中移動(dòng)時(shí),發(fā)送過(guò)程并不知道它是否到達(dá)了目的地,除非應(yīng)用層已經(jīng)確認(rèn)了它已到達(dá)的事實(shí)。非面向連接的協(xié)議也不能探測(cè)重復(fù)的和亂序的包。標(biāo)準(zhǔn)的專(zhuān)業(yè)術(shù)語(yǔ)用“不可靠”來(lái)描述UDP。在現(xiàn)代網(wǎng)絡(luò)中,UDP并不易于導(dǎo)致傳輸失敗,但是你也不能肯定地說(shuō)它是可靠的。
二、TCP工作流程
現(xiàn)在讓我們一起來(lái)看看TCP段的各個(gè)域,在IP包中它們緊跟在IP頭部信息之后。第一個(gè)16位確認(rèn)了源端口,第二個(gè)16位確認(rèn)了目的端口。端口的劃分使IP主機(jī)之間可用單個(gè)的IP地址實(shí)現(xiàn)不同類(lèi)型的并發(fā)連接。在絕大多數(shù)現(xiàn)代操作系統(tǒng)中,采用32位IP地址和16位端口地址的組合來(lái)確認(rèn)一個(gè)接口。源接口和目的接口的組合就定義了一個(gè)連接。有216或65536個(gè)可能的端口。最低的1024個(gè)端口是常用的,它們是系統(tǒng)為特定的應(yīng)用層協(xié)議所保留的默認(rèn)設(shè)置。如:默認(rèn)狀態(tài)下,HTTP使用端口80,而POP3使用端口110。其它的應(yīng)用可以使用編號(hào)更高的端口。
在接下來(lái)的兩個(gè)域中,序列號(hào)和確認(rèn)號(hào)是TCP實(shí)現(xiàn)可靠連接的關(guān)鍵。當(dāng)建立一個(gè)TCP連接時(shí),發(fā)送方主機(jī)發(fā)出一個(gè)隨機(jī)的初始化序列號(hào)給初始化器,初始化器將其加1后送回確認(rèn)域的起始器,這意味著下一個(gè)字節(jié)可以發(fā)送了。一旦數(shù)據(jù)開(kāi)始流動(dòng),序列號(hào)和確認(rèn)號(hào)將跟蹤已發(fā)送了那些數(shù)據(jù),那些數(shù)據(jù)已被確認(rèn)。因?yàn)槊總€(gè)域都是32位,總共可以有232個(gè)值,所以每個(gè)域的范圍是:0~4294967295,當(dāng)超過(guò)上限時(shí)回到0。
4位的偏移量代表TCP頭部一共有多少個(gè)32位的信息。這個(gè)信息是必不可少的,因?yàn)橛锌蛇x的頭部區(qū)域,偏移量標(biāo)識(shí)了頭部的結(jié)束和數(shù)據(jù)的開(kāi)始。
TCP的設(shè)計(jì)者保留了接下來(lái)的6位,以防萬(wàn)一將來(lái)要對(duì)其進(jìn)行擴(kuò)展。實(shí)際上,自從RFC793(傳輸控制協(xié)議)1981年發(fā)布以來(lái),還沒(méi)人有恰當(dāng)?shù)睦碛墒褂眠@些位,在這一點(diǎn)上,Jon Postel和他的同事一定是過(guò)分謹(jǐn)慎了。
隨后的6位每個(gè)都是一個(gè)標(biāo)志。若UNG標(biāo)志位的值為1,意味著遠(yuǎn)在頭部緊急指針區(qū)域的數(shù)據(jù)是有效的;若ACK標(biāo)志位的值為1,則意味著確認(rèn)號(hào)區(qū)域中的數(shù)據(jù)是有效的。(注意:一個(gè)SYN包有一個(gè)有意義的序列號(hào),但它的確認(rèn)號(hào)是無(wú)意義的,因?yàn)樗⒉淮_認(rèn)任何事件)PSH標(biāo)志位使數(shù)據(jù)不必等待發(fā)送和等待接收。RST標(biāo)志位將斷開(kāi)一個(gè)連接。SYN(同步)標(biāo)志位意味著序列號(hào)是有效的,F(xiàn)IN(結(jié)束)標(biāo)志位將指出發(fā)送方已經(jīng)發(fā)完了數(shù)據(jù)。
16位長(zhǎng)的窗口區(qū)域表示了“滑動(dòng)窗口”的大小,也就是告訴發(fā)送方它已經(jīng)準(zhǔn)備好接收多少個(gè)字的數(shù)據(jù)。TCP通過(guò)調(diào)整窗口的大小來(lái)控制數(shù)據(jù)的流量。一個(gè)值為0的窗口意味著通告發(fā)送方:如果沒(méi)有進(jìn)一步的通知,接收器已滿(mǎn),不能再接收更多的數(shù)據(jù)了。大的窗口可以確保在任何給定的時(shí)間傳輸多達(dá)65536個(gè)未經(jīng)確認(rèn)的字節(jié),但是,當(dāng)重發(fā)定時(shí)器超時(shí)且又沒(méi)有得到接收確認(rèn)時(shí),窗口將減半,從而有效地降低傳輸速率。
16位的校驗(yàn)碼區(qū)域保證了數(shù)據(jù)的完整性,保護(hù)了TCP頭部和IP頭部的各個(gè)區(qū)域。發(fā)送方計(jì)算校驗(yàn)值并把它插入這個(gè)區(qū)域,接收方根據(jù)收到的包重新計(jì)算該值并比較二者,如果它們是匹配的,則認(rèn)為數(shù)據(jù)是完整無(wú)損的。
當(dāng)設(shè)置緊急標(biāo)志位時(shí),緊急指針是一個(gè)16位的偏移量,它代表必須加快的最后一個(gè)字。選擇區(qū)域可以容納0或多個(gè)32位字,可擴(kuò)展TCP的性能。大多數(shù)常用的選擇區(qū)域支持大于65536字節(jié)的窗口,從而縮短了等待確認(rèn)的時(shí)間,尤其是在高傳輸率時(shí)。
TCP的傳輸機(jī)構(gòu)有多個(gè)定時(shí)器。當(dāng)一個(gè)包發(fā)送時(shí),重發(fā)定時(shí)器開(kāi)始計(jì)數(shù);當(dāng)收到確認(rèn)信號(hào)后,重發(fā)定時(shí)器停止計(jì)數(shù)。如果超過(guò)設(shè)定時(shí)間段還沒(méi)有收到確認(rèn)信號(hào),就重發(fā)該包。一個(gè)比較棘手的問(wèn)題是如何設(shè)置該時(shí)間段。如果太長(zhǎng),當(dāng)網(wǎng)絡(luò)傳輸錯(cuò)誤增加時(shí)將導(dǎo)致不必要的等待時(shí)間;如果太短,就會(huì)產(chǎn)生過(guò)多的重復(fù)包從而降低網(wǎng)絡(luò)的反應(yīng)時(shí)間。現(xiàn)代TCP協(xié)議根據(jù)實(shí)際情況對(duì)重發(fā)定時(shí)器進(jìn)行動(dòng)態(tài)設(shè)定。
持續(xù)定時(shí)器對(duì)于避免死鎖是必不可少的。如果網(wǎng)絡(luò)收到了一個(gè)大小為0的窗口確認(rèn)并且丟失了隨后的重發(fā)數(shù)據(jù)的確認(rèn),持續(xù)定時(shí)器將超時(shí)并發(fā)送一個(gè)探針。探針的回應(yīng)將指出窗口的大小(也許仍為0)。保持定時(shí)器在本端沒(méi)有任何活動(dòng)后,將檢查在連接的另一端是否還有運(yùn)行的進(jìn)程。如果沒(méi)有任何回應(yīng),該定時(shí)器將斷開(kāi)連接。
當(dāng)斷開(kāi)一個(gè)連接時(shí),斷開(kāi)連接定時(shí)器將包的最大生命期加倍。該定時(shí)器在連接斷開(kāi)之前確保流量最大。
不管重發(fā)過(guò)程執(zhí)行得多么有效,很少的丟失包就能?chē)?yán)重地降低TCP連接的流量。每個(gè)未收到的包或包的片段只會(huì)在重發(fā)定時(shí)器超時(shí)的時(shí)候才會(huì)丟失。在數(shù)據(jù)重發(fā)時(shí),接收過(guò)程一直在遞送這些重發(fā)的數(shù)據(jù),這樣就使總體的數(shù)據(jù)傳輸陷于停頓,直到丟失的數(shù)據(jù)被取代為止。這些重發(fā)過(guò)程導(dǎo)致基于TCP的連接有時(shí)處于不穩(wěn)定狀態(tài)。
三、TCP與UDP的選擇
如果比較UDP包和TCP包的結(jié)構(gòu),很明顯UDP包不具備TCP包復(fù)雜的可靠性與控制機(jī)制。與TCP協(xié)議相同,UDP的源端口數(shù)和目的端口數(shù)也都支持一臺(tái)主機(jī)上的多個(gè)應(yīng)用。一個(gè)16位的UDP包包含了一個(gè)字節(jié)長(zhǎng)的頭部和數(shù)據(jù)的長(zhǎng)度,校驗(yàn)碼域使其可以進(jìn)行整體校驗(yàn)。(許多應(yīng)用只支持UDP,如:多媒體數(shù)據(jù)流,不產(chǎn)生任何額外的數(shù)據(jù),即使知道有破壞的包也不進(jìn)行重發(fā)。)
很明顯,當(dāng)數(shù)據(jù)傳輸?shù)男阅鼙仨氉屛挥跀?shù)據(jù)傳輸?shù)耐暾浴⒖煽刂菩院涂煽啃詴r(shí),TCP協(xié)議是當(dāng)然的選擇。當(dāng)強(qiáng)調(diào)傳輸性能而不是傳輸?shù)耐暾詴r(shí),如:音頻和多媒體應(yīng)用,UDP是最好的選擇。在數(shù)據(jù)傳輸時(shí)間很短,以至于此前的連接過(guò)程成為整個(gè)流量主體的情況下,UDP也是一個(gè)好的選擇,如:DNS交換。把SNMP建立在UDP上的部分原因是設(shè)計(jì)者認(rèn)為當(dāng)發(fā)生網(wǎng)絡(luò)阻塞時(shí),UDP較低的開(kāi)銷(xiāo)使其有更好的機(jī)會(huì)去傳送管理數(shù)據(jù)。TCP豐富的功能有時(shí)會(huì)導(dǎo)致不可預(yù)料的性能低下,但是我們相信在不遠(yuǎn)的將來(lái),TCP可靠的點(diǎn)對(duì)點(diǎn)連接將會(huì)用于絕大多數(shù)的網(wǎng)絡(luò)應(yīng)用。
四、總結(jié)
二者就是基于連接與無(wú)連接的區(qū)別。由此導(dǎo)致TCP保證數(shù)據(jù)正確性,UDP可能丟包; TCP保證數(shù)據(jù)順序,UDP不保證。TCP對(duì)系統(tǒng)資源的要求較UDP多。
TCP與UDP的區(qū)別:
1、基于連接與無(wú)連接
2、對(duì)系統(tǒng)資源的要求(TCP較多,UDP少)
3、UDP程序結(jié)構(gòu)較簡(jiǎn)單
4、流模式與數(shù)據(jù)報(bào)模式
5、TCP保證數(shù)據(jù)正確性,UDP可能丟包,TCP保證數(shù)據(jù)順序,UDP不保證
工業(yè)場(chǎng)合的應(yīng)用一般都有以下特點(diǎn):
1、要求時(shí)時(shí)傳輸,但也有一些場(chǎng)合是定時(shí)傳輸,總的來(lái)說(shuō)在整個(gè)傳輸過(guò)程中要求服務(wù)器中心端和GPRS終端設(shè)備能相互的、時(shí)時(shí)的傳輸數(shù)據(jù)。
TCP本身就是可靠鏈路傳輸,提供一個(gè)時(shí)時(shí)的雙向的傳輸通道,能很好的滿(mǎn)足工業(yè)現(xiàn)場(chǎng)傳輸?shù)囊蟆5荊PRS網(wǎng)絡(luò)對(duì)TCP鏈路也存在一個(gè)限制:此條鏈路在長(zhǎng)時(shí)間(大概20分鐘左右,視具體情況而定)沒(méi)有數(shù)據(jù)流量,會(huì)自動(dòng)降低此鏈路的優(yōu)先級(jí)直至強(qiáng)制斷開(kāi)此鏈路。所以在實(shí)際使用中也會(huì)采用心跳包(一般是一個(gè)字節(jié)的數(shù)據(jù))來(lái)維持此鏈路。
UDP由于自身特點(diǎn),以及GPRS網(wǎng)絡(luò)UDP端口資源的有限性,在一段時(shí)間沒(méi)有數(shù)據(jù)流量后,端口容易改變,產(chǎn)生的影響就是從服務(wù)器中心端向GPRS終端發(fā)送數(shù)據(jù),GPRS終端接收不到。具體的原因就是移動(dòng)網(wǎng)關(guān)從中作了中轉(zhuǎn),需要隔一定時(shí)間給主機(jī)發(fā)UDP包來(lái)維持這個(gè)IP和端口號(hào),這樣主機(jī)就能主動(dòng)給GPRS發(fā)UDP包了并且我在測(cè)試中發(fā)現(xiàn),這個(gè)間隔時(shí)間很短,我在1多分鐘發(fā)一次UDP包才能夠維持,但是再長(zhǎng)可能移動(dòng)網(wǎng)關(guān)那邊就要丟失這個(gè)端口了,此時(shí)如果主機(jī)想主動(dòng)發(fā)數(shù)據(jù)給GPRS,那肯定是不行的了,只有GPRS終端設(shè)備再發(fā)一個(gè)UDP包過(guò)去,移動(dòng)重新給你分配一個(gè)中轉(zhuǎn)IP和端口,才能夠進(jìn)行雙向通訊。
2、要求數(shù)據(jù)的丟包率較小。有些工業(yè)場(chǎng)合,例如電力、水務(wù)抄表,環(huán)保監(jiān)測(cè)等等,不容許傳輸過(guò)程中的數(shù)據(jù)丟失或者最大限度的要求數(shù)據(jù)的可靠性。
從這一點(diǎn)來(lái)看,很顯然在無(wú)線(xiàn)數(shù)據(jù)傳輸過(guò)程中,TCP比UDP更能保證數(shù)據(jù)的完整性、可靠性,存在更小的丟包率。在實(shí)際測(cè)試中也是如此。以廈門(mén)藍(lán)斯通信有限公司提供的GPRS終端設(shè)備為例:TCP的在千分之9,UDP的在千分之17左右。
3、要求降低費(fèi)用。目前有很大部分GPRS設(shè)備的應(yīng)用都是取代前期無(wú)線(xiàn)數(shù)傳電臺(tái),除了使用范圍外,其考慮的主要問(wèn)題就是費(fèi)用。能降低費(fèi)用當(dāng)然都是大家最愿意接受的。和費(fèi)用直接相關(guān)的就是流量了,流量低,費(fèi)用就低了。
雖然TCP本身的包頭要比UDP多,但是UDP在實(shí)際應(yīng)用中往往需要維護(hù)雙向通道,就必須要通過(guò)大量的心跳包數(shù)據(jù)來(lái)維護(hù)端口資源。總的比較起來(lái),UDP的實(shí)際流量要比TCP還要大。很多使用者在初期的時(shí)候并不了解UDP需要大量心跳包來(lái)維持端口資源這個(gè)問(wèn)題,往往都認(rèn)為UDP要比TCP更節(jié)省流量,實(shí)際上這里存在著一個(gè)誤區(qū)。
4、在某些特定的應(yīng)用場(chǎng)合,例如一些銀行的時(shí)時(shí)交互系統(tǒng),對(duì)響應(yīng)速度要求很高,此時(shí)數(shù)據(jù)傳輸頻率較快,不需要大量心跳包維持UDP端口資源,采用UDP就比較有利了。
5、在目前的1:N的傳輸模式中,既有多個(gè)GPRS終端設(shè)備往一個(gè)服務(wù)器中心傳輸數(shù)據(jù),此時(shí)采用UDP會(huì)比TCP要好的多,因?yàn)閁DP耗用更少的系統(tǒng)資源。但是在實(shí)際應(yīng)用中卻發(fā)現(xiàn),很多用戶(hù)還是采用TCP的傳輸方式,建立二級(jí)中心1:A(1:N),即每一個(gè)分中心對(duì)應(yīng)N/A臺(tái)設(shè)備,獨(dú)立處理數(shù)據(jù),再統(tǒng)一將數(shù)據(jù)傳送到主中心。這樣既能保證了傳輸過(guò)程中采用了TCP的傳輸協(xié)議,又能很好處理了中心服務(wù)器的多鏈路的系統(tǒng)耗用的問(wèn)題。