計算機網絡:面向報文(UDP)和麪向字節流(TCP)的區別

一. 概述

(2) 打個比方比喻TCP,你家裏有個蓄水池,你可以裏面倒水,蓄水池上有個龍頭,你可以通過龍頭將水池裏的水放出來,然後用各種各樣的容器裝(杯子、礦泉水瓶、鍋碗瓢盆)接水。
上面的例子中,往水池裏倒幾次水和接幾次水是沒有必然聯繫的,也就是說你可以只倒一次水,然後分10次接完。另外,水池裏的水接多少就會少多少;往裏面倒多少水,就會增加多少水,但是不能超過水池的容量,多出的水會溢出。
結合TCP的概念,水池就好比接收緩存,倒水就相當於發送數據,接水就相當於讀取數據。好比你通過TCP連接給另一端發送數據,你只調用了一次write,發送了100個字節,但是對方可以分10次收完,每次10個字節;你也可以調用10次write,每次10個字節,但是對方可以一次就收完。(假設數據都能到達)但是,你發送的數據量不能大於對方的接收緩存(流量控制),如果你硬是要發送過量數據,則對方的緩存滿了就會把多出的數據丟棄。

(2) UDP和TCP不同,發送端調用了幾次write,接收端必須用相同次數的read讀完。UPD是基於報文的,在接收的時候,每次最多隻能讀取一個報文,報文和報文是不會合並的,如果緩衝區小於報文長度,則多出的部分會被丟棄。也就說,如果不指定MSG_PEEK標誌,每次讀取操作將消耗一個報文。

二. 區別

(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不會。

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

(5) TCP可靠,UDP不可靠;由於TCP要保證所有的數據包都可以到達,所以,需要有重傳機制(快重傳,快恢復,超時重傳),UDP不會進行重傳。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章