問題引入?
如何處理和解決「tcp粘包」問題?即客戶端呼叫兩次不同的send試圖傳送兩份不同的資料,但接收端呼叫recv時一次全部取出。
無法分割出原先的兩部分資料。
關於傳輸層的兩個協議其定義如下:
udp:使用者資料報協議
tcp:面向連線的可靠位元組流傳輸協議
tcp粘包是乙個偽問題,需要明確的是:
tcp基於位元組流的可靠傳輸,每乙個tcp分組包含一定的位元組流,該分組序號由首個位元組流指定
接收端在接收到tcp分組後,根據位元組流seq序號,將其合併在快取區。即
tcp只負責將交由的資料按照位元組流順序無差別傳輸到接收端,而具體這些資料如何按照多少分組傳送,每個分組多大,以及最終接受的位元組流如何解析,交由應用層解決。
只是位元組流傳輸採取一部分一部分分組的形式傳輸,所以表面看著像「粘包」。
需要提一點:
tcp為了確保傳輸效率,在連續傳輸多個小分組時,可能會採取nagle演算法,會將它們合併一併傳輸,但在接收端看來仍然是最終的位元組流資料。
TCP位元組流與UDP資料報的區別
tcp是一種流模式的協議,udp是一種資料報模式的協議 但是,流模式 與 資料報 模式在程式設計的時候有什麼區別呢?打個比方比喻tcp,你家裡有個蓄水池,你可以裡面倒水,蓄水池上有個龍頭,你可以通過龍頭將水池裡的水放出來,然後用各種各樣的容器裝 杯子 礦泉水瓶 鍋碗瓢盆 接水。上面的例子中,往水池裡...
位元組流與字元流的區別
位元組流與字元流的區別 位元組流與和字元流的使用非常相似,兩者除了操作 上的不同之外,是否還有其他的不同呢?實際上位元組流在操作時本身不會用到緩衝區 記憶體 是檔案本身直接操作的,而字元流在操作時使用了緩衝區,通過緩衝區再操作檔案,如圖 下面以兩個寫檔案的操作為主進行比較,但是在操作時位元組流和字元...
位元組流與字元流的區別
要把一片二進位制資料資料逐一輸出到某個裝置中,或者從某個裝置中逐一讀取一片二進位制資料,不管輸入輸出裝置是什麼,我們要用統一的方式來完成這些操作,用一種抽象的方式進行描述,這個抽象描述方式起名為io流,對應的抽象類為outputstream和inputstream 不同的實現類就代表不同的輸入和輸出...