20200923 關於tcp的粘包問題

2021-10-09 17:24:05 字數 942 閱讀 1963

只有tcp有粘包現象,udp永遠不會粘包,因為tcp是面向位元組流,而udp是面向資料報的協議。

傳送端可能是1k1k的傳送資料,接收端可能是2k2k的提取資料,當然也有可能3k或者6k的提取資料,或者一次只提取幾個位元組的資料。

應用程式看到的資料是乙個整體,是乙個流(stream),一條訊息有多少位元組對應用程式是看不見的,因為tcp協議是面向流的協議,這也是容易出現粘包的問題的原因。而udp是面向報文,每個udp段,都相當於乙個報文。應用程式必須以訊息為單位提取資料,不能任意提取位元組的資料。

例如基於tcp的套接字客戶端往伺服器端上傳檔案,傳送時檔案內容是按照一段一段的位元組流傳送的,在接收方端,卻不知道檔案的位元組流從何處開始,從何處結束。

傳送方引發的粘包都是由tcp協議本身造成,tcp為了提高傳輸效率,傳送方往往要到收集足夠多的資料才傳送下乙個tcp段。如果連續幾次需要send的資料很少,通常tcp會根據negal優化演算法,將這些資料合併成乙個tcp段後一次傳送出去,這樣接收方就收到了粘包資料。

negal優化演算法:會將資料量小的,且時間間隔較短的資料一次性發給對方

1)傳送方引起的粘包是由tcp協議本身造成的,tcp為提高傳輸效率,傳送方往往要收集到足夠多的資料後才傳送一包資料。若連續幾次傳送的資料都很少,通常tcp會根據優化演算法把這些資料合成一包後一次傳送出去,這樣接收方就收到了粘包資料。

2)接收方引起的粘包是由於接收方使用者程序不及時接收資料,從而導致粘包現象。這是因為接收方先把收到的資料放在系統接收緩衝區,使用者程序從該緩衝區取資料,若下一包資料到達時前一包資料尚未被使用者程序取走,則下一包資料放到系統接收緩衝區時就接到前一包資料之後,而使用者程序根據預先設定的緩衝區大小從系統接收緩衝區取資料,這樣就一次取到了多包資料。

(1)傳送固定長度的訊息

(2)把訊息的尺寸與訊息一塊傳送

(3)使用特殊標記來區分訊息間隔

參考

TCP的粘包現象

1 什麼是粘包現象 tcp粘包是指傳送方傳送的若干包資料到接收方接收時粘成一包,從接收緩衝區看,後一包資料的頭緊接著前一包資料的尾。2 為什麼出現粘包現象 1 傳送方原因 我們知道,tcp缺省會使用nagle演算法。而nagle演算法主要做兩件事 1 只有上乙個分組得到確認,才會傳送下乙個分組 2 ...

TCP的粘包現象

原文 看面經時,看到有面試官問tcp的粘包問題。想起來研一做購物車處理資料更新時遇到粘包問題,就總結一下吧。1 什麼是粘包現象 tcp粘包是指傳送方傳送的若干包資料到接收方接收時粘成一包,從接收緩衝區看,後一包資料的頭緊接著前一包資料的尾。2 為什麼出現粘包現象 1 傳送方原因 所以,正是nagle...

TCP的粘包現象

原文 看面經時,看到有面試官問tcp的粘包問題。想起來研一做購物車處理資料更新時遇到粘包問題,就總結一下吧。1 什麼是粘包現象 tcp粘包是指傳送方傳送的若干包資料到接收方接收時粘成一包,從接收緩衝區看,後一包資料的頭緊接著前一包資料的尾。2 為什麼出現粘包現象 1 傳送方原因 所以,正是nagle...