关注
什么是TCP粘包问题?
TCP粘包就是指发送方发送的若干包数据到达接收方时粘成了一包,从接收缓冲区来看,后一包数据的头紧接着前一包数据的尾,出现粘包的原因是多方面的,可能是来自发送方,也可能是来自接收方。
造成TCP粘包的原因
(1)发送方原因
TCP默认使用Nagle算法(主要作用:减少网络中报文段的数量),而Nagle算法主要做两件事:
只有上一个分组得到确认,才会发送下一个分组
收集多个小分组,在一个确认到来时一起发送
Nagle算法造成了发送方可能会出现粘包问题
(2)接收方原因
TCP接收到数据包时,并不会马上交到应用层进行处理,或者说应用层并不会立即处理。实际上,TCP将接收到的数据包保存在接收缓存里,然后应用程序主动从缓存读取收到的分组。这样一来,如果TCP接收数据包到缓存的速度大于应用程序从缓存中读取数据包的速度,多个包就会被缓存,应用程序就有可能读取到多个首尾相接粘到一起的包。
什么时候需要处理粘包现象?
如果发送方发送的多组数据本来就是同一块数据的不同部分,比如说一个文件被分成多个部分发送,这时当然不需要处理粘包现象
如果多个分组毫不相干,甚至是并列关系,那么这个时候就一定要处理粘包现象了
如何处理粘包现象?
(1)发送方
对于发送方造成的粘包问题,可以通过关闭Nagle算法来解决,使用TCP_NODELAY选项来关闭算法。
(2)接收方
接收方没有办法来处理粘包现象,只能将问题交给应用层来处理。
(2)应用层
应用层的解决办法简单可行,不仅能解决接收方的粘包问题,还可以解决发送方的粘包问题。
解决办法:循环处理,应用程序从接收缓存中读取分组时,读完一条数据,就应该循环读取下一条数据,直到所有数据都被处理完成,但是如何判断每条数据的长度呢?
格式化数据:每条数据有固定的格式(开始符,结束符),这种方法简单易行,但是选择开始符和结束符时一定要确保每条数据的内部不包含开始符和结束符。
发送长度:发送每条数据时,将数据的长度一并发送,例如规定数据的前4位是数据的长度,应用层在处理时可以根据长度来判断每个分组的开始和结束位置。
查看原帖
3 评论
相关推荐
查看22道真题和解析 点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 什么是优秀的实习经历 #
8780次浏览 216人参与
# 实习简历求拷打 #
13920次浏览 163人参与
# 被上班搭子“传染”了哪些习惯 #
5779次浏览 99人参与
# 秋招被挂春招仍然能投的公司 #
7096次浏览 100人参与
# 工作后,你落下了哪些病根 #
13905次浏览 191人参与
# 作业帮求职进展汇总 #
83496次浏览 547人参与
# mt对你说过最有启发的一句话 #
37208次浏览 442人参与
# 外包能不能当跳板? #
54170次浏览 256人参与
# 摸鱼被leader发现了怎么办 #
102245次浏览 650人参与
# 秋招特别不鸣谢 #
16050次浏览 181人参与
# 考研失败就一定是坏事吗? #
201587次浏览 1377人参与
# 选实习,你更看重哪方面? #
14522次浏览 221人参与
# 投格力的你,拿到offer了吗? #
153000次浏览 817人参与
# 一起聊美团 #
307277次浏览 1762人参与
# 京东美团大战,你怎么看? #
158188次浏览 861人参与
# 安克创新求职进展汇总 #
62394次浏览 541人参与
# 京东开奖 #
631715次浏览 3179人参与
# 第一次面试 #
1036621次浏览 13683人参与
# 今年秋招你收到了多少封邮件? #
18144次浏览 220人参与
# 担心入职之后被发现很菜怎么办 #
266441次浏览 1133人参与