UDP和TCP的区别(详细)
生活随笔
收集整理的這篇文章主要介紹了
UDP和TCP的区别(详细)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
<strong>TCP -- 傳輸控制協議,提供的是面向連接、可靠的字節流服務。</strong>
當客戶和服務器彼此交換數據前,必須先在雙方之間建立一個TCP連接,之后才能傳輸數據,保證的數據的可靠傳輸。TCP還提供超時重發,丟棄重復數據,檢驗數據,<a target=_blank target="_blank" class="inner-link decor-none" href="http://zhidao.baidu.com/search?word=%C1%F7%C1%BF%BF%D8%D6%C6&fr=qb_search_exp&ie=gbk" rel="nofollow" style="color: rgb(45, 100, 179); text-decoration: none;"><span style="color: rgb(0, 0, 0);">流量控制</span></a>等功能,保證數據能從一端傳到另一端。
<strong>UDP -- 用戶數據報協議,是一個簡單的面向數據報的傳輸層協議。</strong>
UDP不提供可靠性,他沒有建立連接,它只是把應用程序傳給IP層的數據報發送出去,但是并不能保證它們能到達目的地。由于UDP在傳輸數據報前不用在客戶和服務器之間建立一個連接,且沒有超時重發等機制,故而傳輸速度很快現在Internet上流行的協議是<a target=_blank target="_blank" class="inner-link decor-none" href="http://zhidao.baidu.com/search?word=TCP/IP%D0%AD%D2%E9&fr=qb_search_exp&ie=gbk" rel="nofollow" style="color: rgb(45, 100, 179); text-decoration: none;"><span style="color: rgb(0, 0, 0);">TCP/IP協議</span></a>,該協議中對低于1024的端口都有確切的定義,他們對應著Internet上一些常見的服務。這些常見的服務可以分為使用<a target=_blank target="_blank" class="inner-link decor-none" href="http://zhidao.baidu.com/search?word=TCP%B6%CB%BF%DA&fr=qb_search_exp&ie=gbk" rel="nofollow" style="color: rgb(45, 100, 179); text-decoration: none;"><span style="color: rgb(0, 0, 0);">TCP端口</span></a>(面向連接)和使用UDP端口(面向無連接)兩種。 說到TCP和UDP,首先要明白“連接”和“無連接”的含義,他們的關系可以用一個形象地比喻來說明,就是<strong>打電話和寫信</strong>。
兩個人如果要通話,首先要建立連接——即打電話時的撥號,等待響應后——即接聽電話后,才能相互傳遞信息,最后還要斷開連接——即掛電話。寫信就比較簡單了,填寫好收信人的地址后將信投入郵筒,收信人就可以收到了。從這個分析可以看出,建立連接可以在需要痛心地雙方建立一個傳遞信息的通道,在發送方發送請求連接信息接收方響應后,由于是在接受方響應后才開始傳遞信息,而且是在一個通道中傳送,因此接受方能比較完整地收到發送方發出的信息,即<a target=_blank target="_blank" class="inner-link decor-none" href="http://zhidao.baidu.com/search?word=%D0%C5%CF%A2%B4%AB%B5%DD&fr=qb_search_exp&ie=gbk" rel="nofollow" style="color: rgb(45, 100, 179); text-decoration: none;"><span style="color: rgb(0, 0, 0);">信息傳遞</span></a>的可靠性比較高。但也正因為需要建立連接,使資源開銷加大(在建立連接前必須等待接受方響應,傳輸信息過程中必須確認信息是否傳到及斷開連接時發出相應的信號等),獨占一個通道,在斷開連接錢不能建立另一個連接,即兩人在通話過程中第三方不能打入電話。而無連接是一開始就發送信息(嚴格說來,這是沒有開始、結束的),只是一次性的傳遞,是先不需要接受方的響應,因而在一定程度上也無法保證<a target=_blank target="_blank" class="inner-link decor-none" href="http://zhidao.baidu.com/search?word=%D0%C5%CF%A2%B4%AB%B5%DD&fr=qb_search_exp&ie=gbk" rel="nofollow" style="color: rgb(45, 100, 179); text-decoration: none;"><span style="color: rgb(0, 0, 0);">信息傳遞</span></a>的可靠性了,就像寫信一樣,我們只是將信寄出去,卻不能保證收信人一定可以收到。
TCP是面向連接的,有比較高的可靠性,
一些要求比較高的服務一般使用這個協議,如FTP、Telnet、SMTP、HTTP、POP3等,而UDP是面向無連接的,使用這個協議的常見服務有DNS、SNMP、<a target=_blank target="_blank" class="app-keyword" href="http://as.baidu.com/a/item?docid=3928861&pre=web_am_se&f=zhidao" style="color: rgb(45, 100, 179); text-decoration: none;"><span style="color: rgb(0, 0, 0);">QQ</span></a>等。對于QQ必須另外說明一下,QQ2003以前是只使用UDP協議的,其服務器使用8000端口,偵聽是否<a target=_blank target="_blank" class="app-keyword" href="http://as.baidu.com/a/item?docid=4186676&pre=web_am_se&f=zhidao" style="color: rgb(45, 100, 179); text-decoration: none;"><span style="color: rgb(0, 0, 0);">有信</span></a>息傳來,客戶端使用4000端口,向外發送信息(這也就不難理解在一般的顯IP的QQ版本中顯示好友的IP地址信息中端口常為4000或其后續端口的原因了),即QQ程序既接受服務又提供服務,在以后的QQ版本中也支持使用TCP協議了。
<pre id="answer-content-78287430" class="answer-text mb-10" name="code" style="white-space: pre-wrap; word-wrap: break-word;"> <span style="color: rgb(255, 0, 0);">=================================================================</span>
<strong>TCP和UDP是TCP/IP協議中的兩個傳輸層協議,它們使用<span style="color: rgb(204, 0, 0);">IP路由功能</span>把數據包發送到目的地,從而為應用程序及應用層協議(包括:HTTP、SMTP、SNMP、FTP和Telnet)提供網絡服務</strong>。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的傳輸機構有多個定時器。當一個包發送時,重發定時器開始計數;當收到確認信號后,重發定時器停止計數。如果超過設定時間段還沒有收到確認信號,就重發該包。一個比較棘手的問題是如何設置該時間段。如果太長,當網絡傳輸錯誤增加時將導致不必要的等待時間;如果太短,就會產生過多的重復包從而降低網絡的反應時間。現代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可靠的點對點連接將會用于絕大多數的網絡應用。
總結
以上是生活随笔為你收集整理的UDP和TCP的区别(详细)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: recv send 阻塞和非阻塞
- 下一篇: 非阻塞模式WinSock编程入门