1. 程式人生 > >面向報文(UDP)和麵向位元組流(TCP)的區別

面向報文(UDP)和麵向位元組流(TCP)的區別

面向報文的傳輸方式是應用層交給UDP多長的報文,UDP就照樣傳送,即一次傳送一個報文。因此,應用程式必須選擇合適大小的報文。若報文太長,則IP層需要分片,降低效率。若太短,會是IP太小。UDP對應用層交下來的報文,既不合並,也不拆分,而是保留這些報文的邊界。這也就是說,應用層交給UDP多長的報文,UDP就照樣傳送,即一次傳送一個報文。
面向位元組流的話,雖然應用程式和TCP的互動是一次一個資料塊(大小不等),但TCP把應用程式看成是一連串的無結構的位元組流。TCP有一個緩衝,當應用程式傳送的資料塊太長,TCP就可以把它劃分短一些再傳送。如果應用程式一次只發送一個位元組,TCP也可以等待積累有足夠多的位元組後再構成報文段傳送出去。

下圖是TCP和UDP協議的一些應用。


下圖是TCP和UDP協議的比較。


這裡再詳細說一下面向連線和麵向無連線的區別:

  • 面向連線舉例:兩個人之間通過電話進行通訊;
  • 面向無連線舉例:郵政服務,使用者把信函放在郵件中期待郵政處理流程來傳遞郵政包裹。顯然,不可達代表不可靠。
從程式實現的角度來看,可以用下圖來進行描述。
從上圖也能清晰的看出,TCP通訊需要伺服器端偵聽listen、接收客戶端連線請求accept,等待客戶端connect建立連線後才能進行資料包的收發(recv/send)工作。而UDP則伺服器和客戶端的概念不明顯,伺服器端即接收端需要繫結埠,等待客戶端的資料的到來。後續便可以進行資料的收發(recvfrom/sendto)工作。
在前面講解UDP時,提到了UDP保留了報文的邊界,下面我們來談談TCP和UDP中報文的邊界問題。在預設的阻塞模式下,TCP無邊界,UDP有邊界。
  • 對於TCP協議,客戶端連續傳送資料,只要服務端的這個函式的緩衝區足夠大,會一次性接收過來,即客戶端是分好幾次發過來,是有邊界的,而服務端卻一次性接收過來,所以證明是無邊界的;
  •  而對於UDP協議,客戶端連續傳送資料,即使服務端的這個函式的緩衝區足夠大,也只會一次一次的接收,傳送多少次接收多少次,即客戶端分幾次傳送過來,服務端就必須按幾次接收,從而證明,這種UDP的通訊模式是有邊界的。
TCP無邊界,造成對採用TCP協議傳送的資料進行接收比較麻煩,在接收的時候易出現粘包,即傳送方傳送的若干包資料到接收方接收時粘成一包。由於TCP是流協議,對於一個socket的包,如傳送 10AAAAABBBBB兩次,由於網路原因第一次又分成兩次傳送, 10AAAAAB和BBBB,如果接包的時候先讀取10(包長度)再讀入後續資料,當接收得快,傳送的慢時,就會出現先接收了 10AAAAAB,會解釋錯誤 ,再接到BBBB10AAAAABBBBB,也解釋錯誤的情況。這就是TCP的粘包。
在網路傳輸應用中,通常需要在網路協議之上再自定義一個協議封裝一下,簡單做法就是在要傳送的資料前面再加一個自定義的包頭,包頭中可以包含資料長度和其它一些資訊,接收的時候先收包頭,再根據包頭中描述的資料長度來接收後面的資料。詳細做法是:先接收包頭,在包頭裡指定包體長度來接收。設定包頭包尾的檢查位( 比如以0xAA開頭,0xCC結束來檢查一個包是否完整)。對於TCP來說:
  • 1)不存在丟包,錯包,所以不會出現資料出錯 ;
  • 2)如果包頭檢測錯誤,即為非法或者請求,直接重置即可。
為了避免粘包現象,可採取以下幾種措施。
        一、對於傳送方引起的粘包現象,使用者可通過程式設計設定來避免,TCP提供了強制資料立即傳送的操作指令push,TCP軟體收到該操作指令後,就立即將本段資料傳送出去,而不必等待發送緩衝區滿;
        二、對於接收方引起的粘包,則可通過優化程式設計、精簡接收程序工作量、提高接收程序優先順序等措施,使其及時接收資料,從而儘量避免出現粘包現象;
         三、由接收方控制,將一包資料按結構欄位,人為控制分多次接收,然後合併,通過這種手段來避免粘包。

相關推薦

面向報文UDP和麵位元組TCP區別

面向報文的傳輸方式是應用層交給UDP多長的報文,UDP就照樣傳送,即一次傳送一個報文。因此,應用程式必須選擇合適大小的報文。若報文太長,則IP層需要分片,降低效率。若太短,會是IP太小。UDP對應用層交下來的報文,既不合並,也不拆分,而是保留這些報文的邊界。這也就是說,應

Spring的控制反轉IoC和麵切面程式設計AOP的概念淺析。

轉自:http://baike.baidu.com/link?url=BhIdxXwp9Xs7PjzebLL8sisJrgh0MiLUB2clkgpf-rpyexxlKTOXDDCxmX1MYe4qenJ9sfcLUw9gQWZJj9oMw_ 控制反轉——Spring通

軟體專案架構的演變傳統架構和麵服務架構的比較

 普通架構 專案部署特點: 1)  專案和資料庫都在同一個伺服器。 2)  專案使用技術:jsp/servlet,ssh,ssm框架。 缺點: 1)  併發量太小:1-10 2)  容錯性差。 思考: 1)  專案程式碼優化。(提高專案效能) 2)  擴充套件伺服器。(提高專案併發能力) 擴充套件架構 特

893C. Rumor#謠言傳播賦權無圖&搜索

ble pan 要求 amp color nbsp style n) def 題目出處:http://codeforces.com/problemset/problem/893/C 題目大意:一個城中有一些關系圈,圈內會傳播謠言,求使每個人都知道謠言的最小花費 #incl

封裝位元組byte[]操作類 c#

在網路通訊中,資料在網路傳輸的格式必須以位元組流的形式進行,因此需要我們對位元組流進行寫入和讀出的操作,下面將會封裝兩個類,用來將各種型別的資料寫入位元組流,和從位元組流中讀取各種型別的資料。如下讀取類:NetBufferReaderusing System; using S

淺談JAVA位元組讀寫檔案

InputStream  此抽象類是表示位元組輸入流的所有類的超類。需要定義 InputStream 的子類的應用程式必須始終提供返回下一個輸入位元組的方法。  int available()  返回此輸入流方法的下一個呼叫方可以不受阻塞地從此輸入流讀取(或跳過)的位

File型別、javaBean規範、IO位元組4種、Serializable序列化介面、transient

*File型別:          java.io.File型別,可以對硬碟上的檔案/目錄,進行操作。                                   如檢視檔案/目錄的屬性資訊,                                   建立,

JAVA輸入/輸出程式例題檔案和目錄、位元組、字元

一.檔案和目錄 1.顯示檔案的基本資訊。 2.顯示目錄的基本資訊。 3.在指定目錄下建立單個檔案。 4.指定目錄下建立多個臨時檔案。 二、位元組流 1.生成ZIP壓縮檔案 2.解壓縮zip檔案 3.生成Excel檔案 4.讀取excel檔案 5.生成PDF檔案 6.讀取P

如何檢測或判斷一個檔案或位元組無BOM是什麼編碼型別

前言: 不小心看到一條留言: 然後就去該地址看了一下,這一看,順帶折騰了一天。 今天,就和大夥分享下折騰的感覺。 在該開源地址中,程式碼有C++和C#兩個版本,編碼的整體風格傾向與於C++。 主要的時間,花了在對於檢測無BOM的部分,順帶重溫了各種編碼的基礎。 建議在看此文之前,先了解下編

字元位元組部分圖無法貼上,詳見日記本2016.7.27

字元流reader write 位元組流outputstream 在讀寫檔案需要對內容按行處理,比如比較特定字元,處理某一行資料的時候一般會選擇字元流。 只是讀寫檔案,和檔案內容無關的,一般選擇位元組流。 實際上位元組流在操作時本身不會用到緩衝區(記憶體),是檔案本身直接操

複製圖片的4種方式copy圖片只能用位元組物件

package cn.itcast_01; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileI

C# 16進位制hex字串到位元組的轉換 示例

在工程實踐中,經常會將一些位元組資訊轉換為16進位制字串,以便傳遞和分享,比如加密金鑰資訊。在這裡提供一段轉化示例, 以供交流學習。 將16進位制字串轉化為 位元組流 publi

Java 檔案一:位元組FileInputStream 和 FileOutputStream

   Java檔案流操作是一個非常重要的內容。下圖列舉了關於Java基本的檔案流操作,當然目前還有NIO,這個後來會進行討論,先看基本的檔案流操作。我們主要使用的是訪問檔案的流和緩衝流。   檔案的流操作一般包含字元流和位元組流,兩者區別在於,字元流每次傳播16bit資

學習筆記之java.io包中的位元組—— 基本的InputStream和OutputStream

先看下類的宣告: 1 2 public abstract class InputStream implements Closeable public abstract class

C# 16進位制hex字串到位元組的轉換 示例

在工程實踐中,經常會將一些位元組資訊轉換為16進位制字串,以便傳遞和分享,比如加密金鑰資訊。在這裡提供一段轉化示例, 以供交流學習。 將16進位制字串轉化為 位元組流 public static byte[] HexStringToBytes(string

springboot2.0 整合WebSocket服務端實時客戶端傳送資訊

     WebSocket為瀏覽器和服務端提供了雙工非同步通訊功能。即瀏覽器可以向服務端傳送訊息,服務端也可以向瀏覽器傳送訊息。    應用於web專案中,多數情況前端需要實時的資料獲取。即服務端向客戶端實時的傳送訊息。操作步驟如下:專案目錄如下:1、運用IDE新建一個sp

21 Java學習之位元組InputStream和OutPutStream)

  一.流的分類   1、從功能上:輸入流、輸出流 2、從結構上:位元組流、字元流 3、從來源上:節點流、過濾流   其中InputStream/OutputStream是為位元組流而設計的,Reader/Writer是為字元流而設計的。處理位元組或者二進位制物件使用位元組

BZOJ1001:狼抓兔子最小割最大+vector模板

cout 地形 ++ 能夠 can 圖片 jpg http img 1001: [BeiJing2006]狼抓兔子 Description 現在小朋友們最喜歡的"喜羊羊與灰太狼",話說灰太狼抓羊不到,但抓兔子還是比較在行的,而且現在的兔子還比較笨,它們只有兩個窩,現在

網路最小割最大記錄路徑【POJ1815】

  【POJ1815】 出處:原帖 題意:就是求s點到t點,最少去掉幾個點使得他們不連通。如果無解輸出NO ANSWER!    解題思路 因為最小割只能求割掉幾條邊的解,我們要求的是割掉幾個點。那麼我們可以這樣考慮:把每個點拆成入點和出點。入點->出點權值為1。那麼

POJ2135 Farm Tour最小費用最大裸題

Source Code #include<queue> #include<cstdio> #include<string> #include<cstring> #include<iostream> #include