寧波制作網(wǎng)站企業(yè)有哪些廣東百度seo
TCP/IP的分包粘包
- 分包粘包介紹
- 導致分包粘包的原因
- 導致TCP粘包的原因:
- 導致TCP分包的原因:
- 避免分包粘包的措施
分包粘包介紹
因為TCP為了減少額外開銷,采取的是流式傳輸,所以接收端在一次接收的時候有可能一次接收多個包。而TCP粘包就是發(fā)送方的若干個數(shù)據(jù)包到達接收方的時候粘成了一個包。多個包首尾相接,無法區(qū)分。當然還有可能是分包情況,同一個包,兩次才能接收到。
導致分包粘包的原因
導致TCP粘包的原因:
- 發(fā)送端等待緩沖區(qū)滿才進行發(fā)送,造成粘包
- 接收方來不及接收緩沖區(qū)內(nèi)的數(shù)據(jù),造成粘包
- 由于TCP協(xié)議在發(fā)送較小的數(shù)據(jù)包的時候,會將幾個包合成一個包后發(fā)送
導致TCP分包的原因:
- 數(shù)據(jù)幀的有效載荷(payload)比以太網(wǎng)的最大傳輸單元(MTU)大的時候,進行了IP分片
- TCP協(xié)議定義有一個選項叫做最大報文段長度(MSS,Maximum Segment Size),該選項用于在TCP連接建立時,收發(fā)雙方協(xié)商通信時每一個報文段所能承載的最大數(shù)據(jù)長度。但是在復雜的網(wǎng)絡環(huán)境下確定這個長度值非常困難,那么在這樣的情況下在傳輸過程中產(chǎn)生分包,粘包就很常見了
- 數(shù)據(jù)發(fā)送端發(fā)送的數(shù)據(jù)包太大,導致發(fā)送一個完整的數(shù)據(jù)包被分幾次發(fā)送給緩存buffer,然而緩沖buffer等到數(shù)據(jù)滿了以后會自動把數(shù)據(jù)發(fā)送的數(shù)據(jù)鏈路層去,這樣就導致分包了
避免分包粘包的措施
- 在消息的尾部加一些特殊字符,那么在讀取數(shù)據(jù)的時候,只要讀到這個特殊字符,就認為已經(jīng)可以截取一個完整的數(shù)據(jù)包了,這種情況在一定的業(yè)務情況下實用。
- 讀取緩存的數(shù)據(jù)是不定長的,所以我們把讀取到的數(shù)據(jù)添加到我們自己的一個byte[]數(shù)組中,然后根據(jù)我們的業(yè)務邏輯來找到指定的特殊協(xié)議頭部,協(xié)議長度,協(xié)議尾部,然后從我們的byte[]中獲取一個完整的數(shù)據(jù)包,然后再對數(shù)據(jù)包進行業(yè)務解析就可以得到正確結(jié)果。