1、什么是 tcp 粘包?
發(fā)送方發(fā)送的多個數(shù)據(jù)包,到接收方緩沖區(qū)首尾相連,粘成一包,被接收。
2、原因
發(fā)送端需要等緩沖區(qū)滿才發(fā)送。如 TCP 協(xié)議默認使用 Nagle 算法可能會把多個數(shù)據(jù)包一次發(fā)送到接收方。
接收方不及時接收緩沖區(qū)的包,造成多個包接收。如應(yīng)用程讀取緩存中的數(shù)據(jù)包的速度小于接收數(shù)據(jù)包的速度,緩存中的多個數(shù)據(jù)包會被應(yīng)用程序當成一個包一次讀取。
3、處理方法
發(fā)送方使用 TCP_NODELAY 選項來關(guān)閉 Nagle 算法。
數(shù)據(jù)包增加開始符和結(jié)束,應(yīng)用程序讀取、區(qū)分數(shù)據(jù)包。
在數(shù)據(jù)包的頭部定義整個數(shù)據(jù)包的長度,應(yīng)用程序先讀取數(shù)據(jù)包的長度,然后讀取整個長度的包字節(jié)數(shù)據(jù),保證讀取的是單個包且完整。