1. 程式人生 > >面向報文(UDP)和面向字節流(TCP)的區別

面向報文(UDP)和面向字節流(TCP)的區別

clas 快速重傳 cat 性能 緊急 mss nbsp 情況下 表示

1,TCP是面向連接(Connection oriented)的協議,UDP是無連接(Connection less)協議;
以下舉例進行說明:
對於面向連接的: 兩個人打電話時,雙方確認並建立連接後才能進行通信。
對於面向無連接的:在郵局寄信時,你只需要將信放在郵筒裏,不需要給收件人通知,收件人也不知道你給他寄信了。

2,TCP無界,UDP有界;
TCP通過字節流傳輸,即TCP將應用程序看成是一連串的無結構的字節流。每個TCP套接口有一個發送緩沖區,如果字節流太長時,TCP會將其拆分進行發送。當字節流太短時,TCP會等待緩沖區中的字節流達到一定程度時再構成報文發送出去,TCP發給對方的數據,對方在收到數據時必須給矛確認,只有在收到對方的確認時,本方TCP才會把TCP發送緩沖區中的數據刪除。
而UDP傳輸報文的方式是由應用程序控制的,應用層交給UDP多長的報文,UDP照樣發送,既不拆分,也不合並,而是保留這些報文的邊界,即一次發送一個報文。
有界與無界之分是根據接收報文來劃分的,對於TCP協議,客戶端連續發送數據,只要服務端的這個函數的緩沖區足夠大,會一次性接收過來,即客戶端是分好幾次發過來,是有邊界的,而服務端卻一次性接收過來,所以證明是無邊界的;
而對於UDP協議,客戶端連續發送數據,即使服務端的這個函數的緩沖區足夠大,也只會一次一次的接收,發送多少次接收多少次,即客戶端分幾次發送過來,服務端就必須按幾次接收,從而證明,這種UDP的通訊模式是有邊界的。

3,TCP可靠,UDP不可靠;由於TCP要保證所有的數據包都可以到達,所以,需要有重傳機制(快重傳,快恢復,超時重傳),UDP不會進行重傳。當出現以下情況時會進行重傳:
1,數據報傳輸中途丟失
2,接收端的ACK確認報文在傳輸中途丟失
3,接收端異常未響應ACK或被接收端丟棄
TCP重傳機制:
1,超時重傳機制;
2,快速重傳機制;
3,SACK 方法;
4,Duplicate SACK – 重復收到數據的問題

4,TCP有序,UDP無序;消息在傳輸過程中可能會亂序,後發送的消息可能會先到達,TCP會對其進行重排序,UDP不會。

5,TCP有流量控制(擁塞控制),UDP沒有;流量控制:TCP利用滑動窗口機制在TCP連接上實現對發送方的流量控制, 如果發送方把數據發送得過快,接收方可能會來不及接收,這就會造成數據的丟失。所謂流量控制就是讓發送方的發送速率不要太快,要讓接收方來得及接收。
擁塞控制:防止過多的數據註入到網絡中,這樣可以使網絡中的路由器或鏈路不致過載。擁塞控制所要做的都有一個前提:網絡能夠承受現有的網絡負荷。擁塞控制是一個全局性的過程,涉及到所有的主機、路由器,以及與降低網絡傳輸性能有關的所有因素。
當出現網絡抖動時,TCP會自覺降低發送速度,他會努力維護次序,但udp依然保持速度不變

6,TCP的頭部比UDP大;TCP頭部20 bytes

補充:
TCP字節流和UDP數據報區別
兩者的區別在於TCP接收的是一堆數據,而每次取多少由主機決定;而UDP發的是數據報,客戶發送多少就接收多少。

擁有這些區別的原因是由於TCP和UDP的特性不同而決定的。TCP是面向連接的,也就是說,在連接持續的過程中,socket中收到的數據都是由同一臺主機發出的,因此,知道保證數據是有序的到達就行了,至於每次讀取多少數據自己看著辦。 而UDP是無連接的協議,也就是說,只要知道接收端的IP和端口,且網絡是可達的,任何主機都可以向接收端發送數據。這時候,如果一次能讀取超過一個報文的數據,則會亂套。比如,主機A向發送了報文P1,主機B發送了報文P2,如果能夠讀取超過一個報文的數據,那麽就會將P1和P2的數據合並在了一起,這樣的數據是沒有意義的。

TCP應用場景:效率要求相對低,但對準確性要求相對高的場景。因為傳輸中需要對數據確認、重發、排序等操作,相比之下效率沒有UDP高。舉幾個例子:文件傳輸(準確高要求高、但是速度可以相對慢)、接受郵件、遠程登錄。

UDP應用場景:效率要求相對高,對準確性要求相對低的場景。舉幾個例子:QQ聊天、在線視頻、網絡語音電話(即時通訊,速度要求高,但是出現偶爾斷續不是太大問題,並且此處完全不可以使用重發機制)、廣播通信(廣播、多播)。

傳輸通信:兩個協議是進程間通信,也就是說應用間的通信,那麽如何在眾多程序中找到自己的目的應用呢?在傳輸層,使用端口號來識別同一臺計算機中進行通信的不同應用程序。
一般情況下可以根據“源IP地址”、“目標IP地址”、“源端口號”、“目標端口號”來進行識別一個通信,但是有些特殊情況,比如IP地址和端口號都一樣,只是使用的傳輸協議不一樣,怎麽進行區分?數據到達IP層(網絡層)之後,會先檢查IP頭部的協議號,然後再傳給相應協議的模塊。
因此,TCP/IP或UDP/IP通信中通常使用5個信息來識別一個通信:“源IP地址”、“目標IP地址”、“源端口號”、“目標端口號”以及“協議號”。(知名端口號與傳輸層協議沒有關系,例如53端口在TCP、UDP中都用於DNS服務)

端口號如何確定:標準既定的端口號,0-1023為知名端口號,其他已正式註冊的端口號是1024-49151;動態分配端口號,操作系統來為應用程序分配互不沖突的端口號,下一個端口號是在前一個分配號上加1,動態分配端口號範圍49152-65535.

TCP首部格式
各個段位說明:

口和目的端口:  各占 2 字節.端口是傳輸層與應用層的服務接口.傳輸層的復用和分用功能都要通過端口才能實現
* 序號:   Seq序號,占32位,用來標識從TCP源端向目的端發送的字節流,發起方發送數據時對此進行標記。
* 確認號:   Ack序號,占32位,只有ACK標誌位為1時,確認序號字段才有效,Ack=Seq+1* 數據偏移/首部長度:  占 4 位,它指出 TCP 報文段的數據起始處距離 TCP 報文段的起始處有多遠.“數據偏移”的單位是 32 位字(以 4 字節為計算單位)
* 保留:  占 6 位,保留為今後使用,但目前應置為 0
* 緊急URG:  當 URG=1 時,表明緊急指針字段有效.它告訴系統此報文段中有緊急數據,應盡快傳送(相當於高優先級的數據)
* 確認ACK:  只有當 ACK=1 時確認號字段才有效.當 ACK=0 時,確認號無效。   不要將確認序號Ack與標誌位中的ACK搞混了。
* PSH(PuSH):  接收 TCP 收到 PSH = 1 的報文段,就盡快地交付接收應用進程,而不再等到整個緩存都填滿了後再向上交付
* RST (ReSeT):  當 RST=1 時,表明 TCP 連接中出現嚴重差錯(如由於主機崩潰或其他原因),必須釋放連接,然後再重新建立運輸連接
* 同步 SYN:  同步 SYN = 1 表示這是一個連接請求或連接接受報文
* 終止 FIN:  用來釋放一個連接.FIN=1 表明此報文段的發送端的數據已發送完畢,並要求釋放運輸連接
* 檢驗和:  占 2 字節.檢驗和字段檢驗的範圍包括首部和數據這兩部分.在計算檢驗和時,要在 TCP 報文段的前面加上 12 字節的偽首部
* 緊急指針:  占 16 位,指出在本報文段中緊急數據共有多少個字節(緊急數據放在本報文段數據的最前面)
* 選項:  長度可變.TCP 最初只規定了一種選項,即最大報文段長度 MSS.MSS 告訴對方 TCP:“我的緩存所能接收的報文段的數據字段的最大長度是 MSS 個字節.” [MSS(Maximum Segment Size)是 TCP 報文段中的數據字段的最大長度.數據字段加上 TCP 首部才等於整個的 TCP 報文段]
* 填充:  這是為了使整個首部長度是 4 字節的整數倍

面向報文(UDP)和面向字節流(TCP)的區別