TCP 中粘包的产生和解决
當(dāng)發(fā)送方的“發(fā)送速度”大于接收方的“處理速度”時(shí),就會(huì)出現(xiàn)問(wèn)題。
比如:接收方一直沒(méi)有處理,發(fā)送方第一次發(fā)送一個(gè)包大小為 100 字節(jié),第二次發(fā)送 200 字節(jié),則緩沖區(qū)內(nèi)有數(shù)據(jù) 300 字節(jié),當(dāng)接收方從緩存區(qū)中取數(shù)據(jù)時(shí),就無(wú)法決定該從何處將 2 個(gè)數(shù)據(jù)包分開(kāi),這種問(wèn)題就是粘包問(wèn)題。
TCP 粘包:發(fā)送方發(fā)送的若干包數(shù)據(jù)到接收方接收時(shí)粘成一包,從接收緩沖區(qū)看,后一包數(shù)據(jù)的頭緊接著前一包數(shù)據(jù)的尾。
為了避免粘包現(xiàn)象,可采取以下幾種措施:
(1)添加結(jié)尾標(biāo)記:比如 \n ,則需要用到 Readline 函數(shù);
(2)數(shù)據(jù)包封裝:數(shù)據(jù)包頭 + 數(shù)據(jù) ,其中數(shù)據(jù)包頭是一個(gè)結(jié)構(gòu)體,這個(gè)結(jié)構(gòu)體中有成員數(shù)據(jù)類(lèi)型和數(shù)據(jù)長(zhǎng)度。每次傳輸數(shù)據(jù)時(shí)候,加包頭,每次解析包,先固定讀取前 4 個(gè)字節(jié),得到長(zhǎng)度,再讀取指定長(zhǎng)度,需要用到Readn 函數(shù)。
(3)數(shù)據(jù)包定長(zhǎng):定長(zhǎng)要足夠,定長(zhǎng) 100,包 50 字節(jié),另 50 字節(jié)填充,接收方定長(zhǎng)解析,顯然適用于數(shù)據(jù)包長(zhǎng)度波動(dòng)不大的條件下,避免流量浪費(fèi)。
上述用到的函數(shù),在我之前的文章“套接字錯(cuò)誤處理函數(shù)的封裝思想及函數(shù)實(shí)現(xiàn)”中講到過(guò)。
總結(jié)
以上是生活随笔為你收集整理的TCP 中粘包的产生和解决的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 半关闭函数:高级版的 close 函数
- 下一篇: 链路层寻址和ARP