天天看點

粘包和半包

首先得知道什麼是粘包和半包

粘包就是我們用戶端向伺服器發送資料是出現的一種現象

比如 發送的是 ab cd,  接收的卻是abcd

這種就叫粘包

粘包的原因就是我們的tcp協定有一種叫做滑動視窗,那什麼是滑動視窗呢,下面先來解釋滑動視窗

最初的TCP協定是,如圖

粘包和半包

這種一問一答的形式,大家可想到這樣效率太低了,是以就引入了新的,如下圖

粘包和半包

 設定一個視窗,打個比方視窗大小為4一次能發送4次請求,如果要發第五個請求則需等待,等伺服器傳回第一個請求的響應,我們的視窗就會往下滑動,這是我們的第五個請求就可以發送了,這就叫滑動視窗

大家想想如果一次發送四個請求,伺服器一般會有一個緩沖區,資料夠了才會寫入伺服器,如果四次請求才發送的資料才剛剛好達到緩沖區的大小,那麼就會出現粘包的現象

還有一個就是TPC自身優化的Nagle算法,什麼是Nagle算法呢,大概就是假如我們發送一個位元組的請求,會經過IP層、傳輸層加入報頭,IP層加入20個位元組報頭,傳輸層加入20個位元組報頭,那麼就成了41個位元組的請求,這樣就會感覺到特别不劃算,是以就出現了Nagle算法,意思就是盡可能多的資料再一起發送,是以也會造成粘包的現象.

半包就是我們發送 abcd,結果接受到的是ab cd

原因就是因為假如我們的又一次請求資料量太大,超過了當時滑動視窗的大小,那麼就隻能先發送前一半資料,後一半資料就隻能等收到響應後,滑動視窗有足夠大小再發送,或者是我們的接收方緩沖區剩餘空間也裝不下資料了,一樣的也會出現半包

還一個原因就是在鍊路層中每台機器的網卡也會有限制,不同的網卡接受的資料大小不一樣,如果超過了則會把資料切開,分層兩個資料包

出現粘包和半包的最本質原因是TCP是流式協定,消息無邊界