1. 程式人生 > >TCP流模式與UDP資料報模式

TCP流模式與UDP資料報模式

“TCP是一種流模式的協議,UDP是一種資料報模式的協議”,這句話相信大家對這句話已經耳熟能詳~但是,“流模式”與“資料包模式”在程式設計的時候有什麼區別呢?以下是我的理解,僅供參考!

1、TCP

打個比方比喻TCP,你家裡有個蓄水池,你可以裡面倒水,蓄水池上有個龍頭,你可以通過龍頭將水池裡的水放出來,然後用各種各樣的容器裝(杯子、礦泉水瓶、鍋碗瓢盆)接水。

上面的例子中,往水池裡倒幾次水和接幾次水是沒有必然聯絡的,也就是說你可以只倒一次水,然後分10次接完。另外,水池裡的水接多少就會少多少;往裡面倒多少水,就會增加多少水,但是不能超過水池的容量,多出的水會溢位。

結合TCP的概念,水池就好比接收快取,倒水就相當於傳送資料,接水就相當於讀取資料。好比你通過TCP連線給另一端傳送資料,你只調用了一次write,傳送了100個位元組,但是對方可以分10次收完,每次10個位元組;你也可以呼叫10次write,每次10個位元組,但是對方可以一次就收完。(假設資料都能到達)但是,你傳送的資料量不能大於對方的接收快取(流量控制),如果你硬是要傳送過量資料,則對方的快取滿了就會把多出的資料丟棄。

這種情況是設定非阻塞I/O模型,會把記憶體耗盡,因為socket是存在核心中的。

2、UDP

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

3、為什麼

其實,這種不同是由TCP和UDP的特性決定的。TCP是面向連線的,也就是說,在連線持續的過程中,socket中收到的資料都是由同一臺主機發出的(劫持什麼的不考慮),因此,知道保證資料是有序的到達就行了,至於每次讀取多少資料自己看著辦。

而UDP是無連線的協議,也就是說,只要知道接收端的IP和埠,且網路是可達的,任何主機都可以向接收端傳送資料。這時候,如果一次能讀取超過一個報文的資料,則會亂套。比如,主機A向傳送了報文P1,主機B傳送了報文P2,如果能夠讀取超過一個報文的資料,那麼就會將P1和P2的資料合併在了一起,這樣的資料是沒有意義的。

幀(frame)是一種資訊單位,它的起始點和目的點都是資料鏈路層。
   資料包(packet)也是一種資訊單位,它的起始和目的地是網路層。
   資料報(datagram)通常是指起始點和目的地都使用無連線網路服務的的網路層的資訊單元。
   段(segment)通常是指起始點和目的地都是傳輸層的資訊單元。
   訊息(message)是指起始點和目的地都在網路層以上(經常在應用層)的資訊單元。
   元素(cell)是一種固定長度的資訊,它的起始點和目的地都是資料鏈路層。元素通常用於非同步傳輸模式(ATM)和交換多兆位資料服務(SMDS)網路等交換環境。
   資料單元(dataunit)指許多資訊單元。常用的資料單元有服務資料單元(SDU)、協議資料單元(PDU)。SDU是在同一機器上的兩層之間傳送資訊。PDU是傳送機器上每層的資訊傳送到接收機器上的相應層(同等層間交流用的)。
昨天晚上看了chinaitlab的那個ccna的錄象,講到了流、幀、包、位的區別,看了還是不怎麼太懂,今天用baidu搜尋了一下,看到了一個比較不錯的解釋,我把他copy到這裡:

資料幀(Frame):是一種資訊單位,它的起始點和目的點都是資料鏈路層。
資料包(Packet):也是一種資訊單位,它的起始和目的地是網路層。
資料報(Datagram):通常是指起始點和目的地都使用無連線網路服務的的網路層的資訊單元。
段(Segment):通常是指起始點和目的地都是傳輸層的資訊單元。

資料鏈路層的PDU叫做Frame(幀);
網路層的PDU叫做Packet(資料包);
TCP的叫做Segment(資料段);

看了這個解釋呢,就比較不錯了,還有個比較不太清楚的東西就是流,那麼流又是一個什麼樣的概念呢?看到關於封裝和解封裝的部分的時候,提到了分裝是做了2個動作,一個切片,一個是加如控制資訊,那麼這個經過了切片後的那個東西叫什麼呢?如果您看到文章,懇請您幫我解釋一下,謝謝!

××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××

客戶端傳送位元組流時,TCP會保證服務端按順序接收到全部的位元組流,其他諸如資料包的大小等,TCP協議對我們來說是透明的,我們可以全部不考慮。

    通俗點說,我們傳送資料只需要呼叫send函式,我們只需要關注send函式的返回值,從而知道了傳送了多少個位元組,在服務端,我們呼叫recv函式,我們只需要關注recv函式的返回值,從而知道接收了多少個位元組,其他情況通通不管。

   在TCP通訊過程中,我們不需要關心(也沒法關心,但可以設定)資料包的大小,個數,我們只需要在客戶端建立一個緩衝區不斷髮送,在服務端建立一個緩衝區不斷接收就夠了,當然,我們還可以定義一個包頭,來實現諸如傳送檔案這樣更強大的功能。

這就是TCP通訊的本質,不會應平臺的不同而改變。

流式套接字要分客戶和伺服器,而資料報不用分
流式套接字適合傳輸資料量大的,而資料報套接字適合傳遞資料量少的
流式套接字建立麻煩,資料報套接字建立簡單
客戶的流式套接字只能向一個方向傳遞,資料報套接字可以接受任何方向的來得資料,並可以向任何地址傳送資料報

流套接字比資料報套接字好,這樣你可以不必管理底層細節,只需要相信TCP就可以保證傳送的資料是依次,可靠的傳送的,缺點是效率相對資料報套接字低。
使用資料報套接字,可以讓你更快,但你得自已保證資料是否依次,準確的傳送來的,
如使用資料報套接字,你可能先收到後發的,後收到先發的,還有可能收漏,

資料報套接字是用來發送資料報的,是面向無連線不可靠的傳輸(在今天這個網路裡,其實已經相當可靠)

流套接字是面向連線可靠的傳輸。伺服器通過轉發實現一個客戶與另一個客戶的資料傳送。當向另一個客戶轉發時,他必須知道對方IP(或套接字等),所以要求轉發的客戶必須提供關於接受方的資訊,否則伺服器不知道向哪轉發。

相關推薦

TCP模式UDP資料模式

“TCP是一種流模式的協議,UDP是一種資料報模式的協議”,這句話相信大家對這句話已經耳熟能詳~但是,“流模式”與“資料包模式”在程式設計的時候有什麼區別呢?以下是我的理解,僅供參考! 1、TCP 打個比方比喻TCP,你家裡有個蓄水池,你可以裡面倒水,蓄水池上有個龍頭,你可

計算機網路學習六:關於TCP模式UDP資料報文模式區別

1 概述 “TCP是一種流模式的協議,UDP是一種資料報模式的協議”,這句話相信大家對這句話已經耳熟能詳~但是,“流模式”與“資料包模式”在程式設計的時候有什麼區別呢?以下是我的理解,僅供參考! (1) TCP 打個比方比喻TCP,你家裡有個蓄水池,你可以裡

TCP報文段、UDP資料、IP資料區別

重要說明:既然TCP/IP現在如此成熟,那麼裡面的技術必然是經過各種各樣的大牛們千錘百煉而來,它的每個特有片語,十分肯定的說不是隨隨便便命名的,其背後隱含著設計者的考慮,例如,TCP傳輸給IP的資料單元為什麼叫TCP報文段(TCPsegment)(詳見《TCP/IP詳解卷

模式資料模式的區別

“TCP是一種流模式的協議,UDP是一種資料報模式的協議”, 1、TCP 打個比方比喻TCP,你家裡有個蓄水池,你可以裡面倒水,蓄水池上有個龍頭,你可以通過龍頭將水池裡的水放出來,然後用各種各樣的容器裝(杯子、礦泉水瓶、鍋碗瓢盆)接水。 上面的例子中,往

TCP-UDP-資料-資料

簡述: 在學習tcp與udp的時候會看到一種說法“tcp提供有確認,有連線的資料流服務,udp提供無確認,無連線的資料報服務”。這裡的資料報和資料流困擾了我一段時間,下邊我談談我對這個的理解。 詳述:

Linux 網路程式設計——TCPUDP 資料格式詳解

TCP 報文格式 TCP(Transmission Control Protocol 傳輸控制協議)是一種面向連線的、可靠的、基於位元組流的傳輸層通訊協議。 TCP 報文段的報頭有 10 個必需的欄位和 1 個可選欄位。報頭至少為 20 位元組。報頭後面的資料是可選

小端模式強制資料型別轉換

        當運算元的型別不同,而且不屬於基本資料型別時,經常需要強制型別轉換,將運算元轉化為所需要的型別。強制型別轉換具有兩種形式,稱為顯式強制轉換和隱式強制型別轉換。4.1.顯式強制型別轉換         顯式強制型別轉換需要使用強制型別轉換運算子,格式如下:  type(<expressio

為什麼TCP傳輸單元叫作TCP報文段,而UDP的叫作UDP資料

為什麼TCP傳輸單元叫作“TCP報文段”,而UDP的叫作UDP傳輸單元“UDP資料報”? 這個問題也是我剛接觸網路時感到疑惑的問題,最近幾天看書過程中,我總結一點。這點純屬個人觀點,如果不對還請多指教

【設計模式Android】原型模式——復制中心走出來的克隆人

設計模式 android 什麽是原型模式 所謂原型模式,就是用原型實例來指定創建對象的種類,並通過復制這些原型創建新的對象的設計模式。原型模式一般用於創建復雜的或者構建耗時的實例,或者用於只讀對象的修改。 原型模式的實現方式 (1)淺拷貝當代的每個程序員小時候都玩過《尤裏的復仇》這款遊戲,遊戲中的“尤

【設計模式Android】狀態模式——一個人的兩幅面孔

android 設計模式什麽是狀態模式 所謂狀態模式,就是當一個對象的內在轉臺改變時允許改變其行為,這個對象看起來就像是改變了其類的設計模式。狀態模式和策略模式都是為具有多種可能情形設計的模式,兩者的結構幾乎完全一樣,但狀態模式的行為是平行且不可替換的,而策略模式的行為則是彼此獨立的。換句話說就是:狀態模式將

觀察者模式發布訂閱模式的區別

發布訂閱 簡單的 veh highlight event 對象 instance post 相對 觀察者模式是軟件設計模式的一種。在此種模式中,一個目標對象管理所有相依於它的觀察者對象,並且在它本身的狀態改變時主動發出通知。這通常透過呼叫各觀察者所提供的方法來實現。此種模式

第六章單例模式多執行緒——立即載入“餓漢模式延遲載入“懶漢模式

立即載入就是使用類的時候已經將物件建立完畢了,也稱為“餓漢模式” package test01; public class MyObject { // 建立物件 private static MyObject object = new MyObject(); private MyObjec

(六)微信小程式:image元件的4種縮放模式9種裁剪模式, 和靜態多文章列表

4種縮放模式 scaleToFill 不保持縱橫比例縮放圖片,使圖片的高度完全拉伸至填滿image元素         此模式是縮放的預設模式,預設時,小程式以此模式來縮放圖片 aspectFit 保持縱橫比縮放圖片,使圖片的長邊能完全顯示出來&nbs

《JavaScript設計模式開發實踐》模式篇(3)—— 代理模式

代理模式是為一個物件提供一個代用品或佔位符,以便控制對它的訪問 故事背景: 假設當 A 在心情好的時候收到花,小明表白成功的機率有 60%,而當 A 在心情差的時候收到花,小明表白的成功率無限趨近於 0。 小明跟 A 剛剛認識兩天,還無法辨別 A 什麼時候心情好。如果不合時宜地把花送給 A,花

《JavaScript設計模式開發實踐》模式篇(6)—— 命令模式

命令模式是最簡單和優雅的模式之一,命令模式中的命令(command)指的是一個執行某些特定事情的指令。 應用場景     有時候需要向某些物件傳送請求,但是並不知道請求的接收者是誰,也不知道被請求的操作是什麼。此時希望用一種鬆耦合的方式來設計程式,使得請求

《JavaScript設計模式開發實踐》模式篇(11)—— 中介者模式

中介者模式的作用就是解除物件與物件之間的緊耦合關係。增加一箇中介者物件後,所有的 相關物件都通過中介者物件來通訊,而不是互相引用,所以當一個物件發生改變時,只需要通知 中介者物件即可。中介者使各物件之間耦合鬆散,而且可以獨立地改變它們之間的互動。中介者模式使網狀的多對多關係變成了相對簡單的一對多關係

《JavaScript設計模式開發實踐》模式篇(12)—— 裝飾者模式

在傳統的面嚮物件語言中,給物件新增功能常常使用繼承的方式,但是繼承的方式並不靈活, 還會帶來許多問題:一方面會導致超類和子類之間存在強耦合性,當超類改變時,子類也會隨之 改變;另一方面,繼承這種功能複用方式通常被稱為“白箱複用”,“白箱”是相對可見性而言的, 在繼承方式中,超類的內部細節是對子類可見的,

Druid 批量資料攝取的結合

    我們都知道, Druid在攝取時需要設定一個時間視窗, 在時間視窗之外的資料,將會丟棄。我們如何將這部分丟棄的資料重新攝取進Druid系統中,以提高資料的準確性?通常的做法是把資料儲存起來, 等待重新攝取。 目前比較流行的處理方法是Lambda架構。 &

java中代理設計模式工廠類設計模式的綜合應用

package cn.mdln.study2; public class TestDemo11 { /**  * 主方法是客戶端,只關心取得通過工廠類取得例項化物件,不關係到底工廠類如何取得,  * 更不會關係主題類是如何例項化介面的,才不會關中間有經歷過那寫不為人知的操作

記一個IE瀏覽器相容模式IE文件模式不一致的問題

今天遇到一個IE相容的奇葩問題,瀏覽器相容模式為9,但是文件模式為7。  仔細看了一下設定相容的程式碼: <meta http-equiv="X-UA-Compatible" content="IE=edge" />  這個東西本身是對的,沒有問題。  那麼猜想