成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一分鐘看懂TCP粘包拆包

網絡 網絡管理
TCP 是一個面向「流」的協議,所謂流就是沒有界限的一長串二進制數據。在實際的傳輸過程中,TCP 會根據網絡情況將數據包進行拆分或者拼裝,如果業務沒有定義一個明確的界限規則,在應用層的業務上就會出現粘包拆包的現象。

平時大家在網絡編程過程中可能會遇到這樣一種現象:客戶端發送了一長串消息,服務端接受的消息揉在一起或者被拆分了,這樣就會造成消息難以被正確理解。

比如說有一天你特別想喝奶茶,看了一下外賣,「一點點」的奶茶看著不錯,(一點點趕緊給我打錢 doge),于是你在群里發了一條消息,想找幾個人拼奶茶:

一點點奶茶有人喝嗎?

結果群里同事回了一句:

現在不是已經三點了嗎?

你覺得莫名其妙,看了一眼同事的手機,他收到的消息是這樣的兩行:

一點

點奶茶有人喝嗎?

哈哈,講了一個冷笑話。用專業的術語來說這種現象就是「拆包」了,我們接著往下講。

TCP 粘包拆包的現象

粘包拆包問題一般是處于應用層下的問題,在數據鏈路層、網絡層以及傳輸層都有可能發生。我們日常的網絡應用開發大多都在傳輸層進行,因此本文著重講解傳輸層粘包拆包問題。

傳輸層有兩個協議我們都很熟悉:UDP 和 TCP,UDP有消息保護邊界,不會發生粘包拆包問題,因此粘包拆包問題只發生在TCP協議中。

下面用一個簡單的例子來講解什么是粘包和拆包。

假設客戶端向服務端連續發送了兩個數據包,用 packet1 和 packet2 來表示,那么服務端收到的數據可能有四種:

(1)第一種情況,服務端按順序正常收到兩個包,即未出現粘包和拆包的現象。

(2)第二種情況,服務端只收到一個數據包,由于 TCP 保證送達的特性,所以這一個數據包包含了客戶端發送的兩個數據包的信息,這種現象就是粘包。除非客戶端發送的數據包有明確的規則,否則服務端不知道兩個包的界限,難以處理數據。

(3)第三種情況,服務端收到了三個數據包,Package1數據包被拆分為兩個數據包:Package1.1和Package1.2,這種現象就是拆包,至于拆包的原因下面會講,服務端收到拆開的數據包也很難處理。

(4)第四種情況,一些大的數據包被拆分為小的數據包,小的數據包與其他數據包粘在一起,這種現象是將上面的粘包和拆包綜合在一塊。

TCP 粘包拆包的原因

TCP 是一個面向「流」的協議,所謂流就是沒有界限的一長串二進制數據。TCP 作為傳輸層協議并不了解上層業務數據的具體含義,它會根據TCP緩沖區的實際情況進行數據包的劃分,所以在業務上認為是一個完整的包,可能會被 TCP 拆分成多個包進行發送,也有可能把多個小的包封裝成一個大的數據包發送,這就會出現粘包拆包的問題。

例如,TCP緩沖區是1024個字節大小,如果應用一次請求發送的數據量比較小,沒達到緩沖區大小,TCP則會將多個請求合并為同一個請求進行發送,站在業務上來看這就是「粘包」;

如果應用一次請求發送的數據量比較大,超過了緩沖區大小,TCP就會將其拆分為多次發送,這就是「拆包」,也就是將一個大的包拆分為多個小包進行發送。

TCP 粘包拆包的解決方法

TCP 是面向流的,會發生粘包和拆包,那作為應用程序,如何從這源源不斷涌來的數據流中拆分出或者合并出有意義的信息呢?通常會有以下一些常用的方法:

(1)發送端給每個數據包添加包首部,首部中應該至少包含數據包的長度,這樣接收端在接收到數據后,通過讀取包首部的長度字段,便知道每一個數據包的實際長度了。

如下圖,在每個包前面加上包的實際長度。

(2)發送端將每個數據包封裝為固定長度(不夠的可以通過補0填充),這樣接收端每次從接收緩沖區中讀取固定長度的數據就自然而然的把每個數據包拆分開來。

下圖每個包的固定長度為 4,接收端很容易進行區分。

(3)可以在數據包之間設置邊界,如添加特殊符號,這樣,接收端通過這個邊界就可以將不同的數據包拆分開。

如下圖,在每個包的后面加上特殊字符:/

Netty 框架如何解決粘包拆包問題

Netty 作為一款高性能的 Java 網絡編程框架,不僅是基于 Java NIO 進行了深度封裝,還在客戶端與服務端之間的數據傳輸上做了有效處理。

前面講過 TCP 傳輸會出現粘包和拆包的現象,Netty 針對這一點內置了多款數據流編解碼器,客戶端服務端按照約定好的規則進行數據傳輸即可解決這個問題。

Netty 提供了多款開箱即用的編解碼器:

(1)FixedLengthFrameDecoder 固定長度解碼器

(2)DelimiterBasedFrameDecoder 指定分隔符解碼器

(3)LengthFieldBasedFrameDecoder 基于數據包長度解碼器

(4)等等……這里不再列舉

小結

TCP 是一個面向「流」的協議,所謂流就是沒有界限的一長串二進制數據。在實際的傳輸過程中,TCP 會根據網絡情況將數據包進行拆分或者拼裝,如果業務沒有定義一個明確的界限規則,在應用層的業務上就會出現粘包拆包的現象。

針對 TCP 粘包拆包的現象,常見的解決思路如下:

(1)發送端給每個數據包添加包首部。

(2)發送端將每個數據包封裝為固定長度。

(3)可以在數據包之間設置邊界。

為了解決粘包拆包,Netty 框架也提供了很多開箱即用的編解碼器,極大簡化網絡編程解決此類問題的難度。

責任編輯:武曉燕 來源: 愛笑的架構師
相關推薦

2020-05-21 19:46:19

區塊鏈數字貨幣比特幣

2020-06-11 08:04:12

WDMDWDMMWDM

2021-08-06 08:50:45

加密貨幣比特幣區塊鏈

2020-10-13 14:55:31

云計算云安全技術

2023-06-12 07:18:26

CPU主頻高頻率

2017-03-30 19:28:26

HBase分布式數據

2024-12-19 11:00:00

TCP網絡通信粘包

2018-06-26 05:23:19

線程安全函數代碼

2017-07-06 08:12:02

索引查詢SQL

2022-07-18 06:16:07

單點登錄系統

2017-02-21 13:00:27

LoadAverage負載Load

2018-07-31 16:10:51

Redo Undo數據庫數據

2011-02-21 17:48:35

vsFTPd

2018-12-12 22:51:24

Java包裝語言

2020-07-17 07:44:25

云計算邊緣計算IT

2016-09-12 17:28:45

云存儲應用軟件存儲設備

2020-07-09 07:37:06

數據庫Redis工具

2019-10-17 11:06:32

TCP粘包通信協議

2020-11-10 09:01:52

DPDK網絡監控

2013-11-15 07:24:50

4G LTE圖解
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 天天天操 | 91精品久久久久久久久久入口 | 久久精品欧美一区二区三区不卡 | 完全免费在线视频 | 亚洲国产精品久久久久秋霞不卡 | 国产美女在线播放 | 成年人视频在线免费观看 | 国产不卡一区 | 亚洲 欧美 另类 综合 偷拍 | 伊人激情综合网 | 国产91九色 | 中文区中文字幕免费看 | 手机在线不卡av | 精品一区久久 | av在线电影网站 | 欧美三级电影在线播放 | 欧美一区二区免费 | 一区二区三区影院 | 性色av一区二区三区 | 国产一区二区久久久 | 国产精品一区一区三区 | 成人久久18免费网站麻豆 | 大象视频一区二区 | 久久精品亚洲欧美日韩久久 | 久久久一区二区三区 | 欧美一级二级在线观看 | 丝袜 亚洲 另类 欧美 综合 | 成人国产精品久久 | 国产日韩电影 | 欧美一级黄色片在线观看 | 欧美一区| 久久精品国产一区老色匹 | 日韩免费一区二区 | 黄视频免费观看 | 国产欧美一区二区三区日本久久久 | 亚洲精品视频在线观看免费 | 麻豆久久久久久久久久 | 亚洲免费婷婷 | 日本中文字幕在线视频 | 国产精品亚洲精品 | 国家aaa的一级看片 h片在线看 |