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