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

2022-03-26 08:55:33 字數 1668 閱讀 6300

**:

面向報文(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無邊界,造成對採用tcp協議傳送的資料進行接收比較麻煩,在接收的時候易出現粘包,即傳送方傳送的若干包資料到接收方接收時粘成一包。由於tcp是流協議,對於乙個socket的包,如傳送 10aaaaabbbbb兩次,由於網路原因第一次又分成兩次傳送, 10aaaaab和bbbb,如果接包的時候先讀取10(包長度)再讀入後續資料,當接收得快,傳送的慢時,就會出現先接收了 10aaaaab,會解釋錯誤 ,再接到bbbb10aaaaabbbbb,也解釋錯誤的情況。這就是tcp的粘包。

在網路傳輸應用中,通常需要在網路協議之上再自定義乙個協議封裝一下,簡單做法就是在要傳送的資料前面再加乙個自定義的包頭,包頭中可以包含資料長度和其它一些資訊,接收的時候先收包頭,再根據包頭中描述的資料長度來接收後面的資料。詳細做法是:先接收包頭,在包頭裡指定包體長度來接收。設定包頭包尾的檢查位( 比如以0xaa開頭,0xcc結束來檢查乙個包是否完整)。對於tcp來說:

為了避免粘包現象,可採取以下幾種措施。

一、對於傳送方引起的粘包現象,使用者可通過程式設計設定來避免,tcp提供了強制資料立即傳送的操作指令push,tcp軟體收到該操作指令後,就立即將本段資料傳送出去,而不必等待傳送緩衝區滿;

二、對於接收方引起的粘包,則可通過優化程式設計、精簡接收程序工作量、提高接收程序優先順序等措施,使其及時接收資料,從而盡量避免出現粘包現象;

三、由接收方控制,將一包資料按結構字段,人為控制分多次接收,然後合併,通過這種手段來避免粘包。

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

面向報文 udp 和面向位元組流 tcp 的區別 面向報文的傳輸方式是應用層交給udp多長的報文,udp就照樣傳送,即一次傳送乙個報文。因此,應用程式必須選擇合適大小的報文。若報文太長,則ip層需要分片,降低效率。若太短,會是ip太小。udp對應用層交下來的報文,既不合併,也不拆分,而是保留這些報文...

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

文章目錄 1,tcp是面向連線 connection oriented 的協議,udp是無連線 connection less 協議 2,tcp無界,udp有界 3,tcp可靠,udp不可靠 4,tcp有序,udp無序 5,tcp有流量控制 擁塞控制 udp沒有 6,tcp的頭部比udp大 1,tc...

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

面向報文 udp 和面向位元組流 tcp 的區別 面向報文的傳輸方式是應用層交給udp多長的報文,udp就照樣傳送,即一次傳送乙個報文。因此,應用程式必須選擇合適大小的報文。若報文太長,則ip層需要分片,降低效率。若太短,會是ip太小。udp對應用層交下來的報文,既不合併,也不拆分,而是保留這些報文...