什么是 TCP 粘包/拆包以及TCP 粘包/拆包的解決辦法
TCP 粘包/拆包
1、要發(fā)送的數(shù)據(jù)大于 TCP 發(fā)送緩沖區(qū)剩余空間大小,將會發(fā)生拆包。
2、待發(fā)送數(shù)據(jù)大于 MSS(最大報文長度),TCP 在傳輸前將進(jìn)行拆包。
3、要發(fā)送的數(shù)據(jù)小于 TCP 發(fā)送緩沖區(qū)的大小,TCP 將多次寫入緩沖區(qū)的數(shù)據(jù)一次發(fā)送出
去,將會發(fā)生粘包。
4、接收數(shù)據(jù)端的應(yīng)用層沒有及時讀取接收緩沖區(qū)中的數(shù)據(jù),將發(fā)生粘包。
TCP 粘包/拆包的解決辦法
1、發(fā)送端給每個數(shù)據(jù)包添加包首部,首部中應(yīng)該至少包含數(shù)據(jù)包的長度,這樣接收端在接收到數(shù)據(jù)后,通過讀取包首部的長度字段,便知道每一個數(shù)據(jù)包的實際長度了。
2、發(fā)送端將每個數(shù)據(jù)包封裝為固定長度(不夠的可以通過補(bǔ) 0 填充),這樣接收端每次從接收緩沖區(qū)中讀取固定長度的數(shù)據(jù)就自然而然的把每個數(shù)據(jù)包拆分開來。
3、可以在數(shù)據(jù)包之間設(shè)置邊界,如添加特殊符號,這樣,接收端通過這個邊界就可以將不同的數(shù)據(jù)包拆分開。