关注
什么是TCP粘包问题?
TCP粘包就是指发送方发送的若干包数据到达接收方时粘成了一包,从接收缓冲区来看,后一包数据的头紧接着前一包数据的尾,出现粘包的原因是多方面的,可能是来自发送方,也可能是来自接收方。
造成TCP粘包的原因
(1)发送方原因
TCP默认使用Nagle算法(主要作用:减少网络中报文段的数量),而Nagle算法主要做两件事:
只有上一个分组得到确认,才会发送下一个分组
收集多个小分组,在一个确认到来时一起发送
Nagle算法造成了发送方可能会出现粘包问题
(2)接收方原因
TCP接收到数据包时,并不会马上交到应用层进行处理,或者说应用层并不会立即处理。实际上,TCP将接收到的数据包保存在接收缓存里,然后应用程序主动从缓存读取收到的分组。这样一来,如果TCP接收数据包到缓存的速度大于应用程序从缓存中读取数据包的速度,多个包就会被缓存,应用程序就有可能读取到多个首尾相接粘到一起的包。
什么时候需要处理粘包现象?
如果发送方发送的多组数据本来就是同一块数据的不同部分,比如说一个文件被分成多个部分发送,这时当然不需要处理粘包现象
如果多个分组毫不相干,甚至是并列关系,那么这个时候就一定要处理粘包现象了
如何处理粘包现象?
(1)发送方
对于发送方造成的粘包问题,可以通过关闭Nagle算法来解决,使用TCP_NODELAY选项来关闭算法。
(2)接收方
接收方没有办法来处理粘包现象,只能将问题交给应用层来处理。
(2)应用层
应用层的解决办法简单可行,不仅能解决接收方的粘包问题,还可以解决发送方的粘包问题。
解决办法:循环处理,应用程序从接收缓存中读取分组时,读完一条数据,就应该循环读取下一条数据,直到所有数据都被处理完成,但是如何判断每条数据的长度呢?
格式化数据:每条数据有固定的格式(开始符,结束符),这种方法简单易行,但是选择开始符和结束符时一定要确保每条数据的内部不包含开始符和结束符。
发送长度:发送每条数据时,将数据的长度一并发送,例如规定数据的前4位是数据的长度,应用层在处理时可以根据长度来判断每个分组的开始和结束位置。
查看原帖
3 评论
相关推荐
书海为家:我来给一点点小建议,因为毕竟还在学校不像工作几年的老鸟有丰富的项目经验,面试官在面试在校生的时候更关注咱们同学的做事逻辑和思路,所以最好在简历中描述下自己做过项目的完整过程,比如需求怎么来的,你对需求的解读,你想到的解决办法,遇到困难如何找人求助,最终项目做成了什么程度,你从中收获了哪些技能,你有什么感悟。 点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 面试被问到不会的问题,你怎么应对? #
21220次浏览 522人参与
# 学历VS实习,哪个更重要? #
857次浏览 31人参与
# 招商银行数字金融训练营 #
106154次浏览 916人参与
# 你见过哪些招聘隐形歧视? #
21790次浏览 186人参与
# 设计人的面试记录 #
205009次浏览 1630人参与
# 你觉得大几开始实习最合适? #
24637次浏览 245人参与
# 厦门银行科技岗值不值得投 #
15262次浏览 352人参与
# uu们,春招你还来吗? #
59802次浏览 640人参与
# 面试中,你被问过哪些奇葩问题? #
94668次浏览 1178人参与
# 哔哩哔哩笔试 #
34709次浏览 140人参与
# 影石Insta360求职进展汇总 #
183991次浏览 1377人参与
# 国企/银行/研究所公司爆料 #
203379次浏览 913人参与
# 你都用vibe coding做过什么? #
18241次浏览 725人参与
# 供应链/物流校招攻略 #
12400次浏览 218人参与
# 虹软科技求职进展汇总 #
16623次浏览 138人参与
# AI Coding实战技巧 #
13037次浏览 276人参与
# 机械人还在等华为开奖吗? #
325193次浏览 1599人参与
# 做完笔试后你收到面试了吗? #
23949次浏览 210人参与
# 恒生电子笔试 #
19942次浏览 156人参与
# 你现在一天AI几次? #
11096次浏览 118人参与
# Vibe Coding 会干掉初级岗位吗? #
19987次浏览 211人参与
# 如果人生可以debug你会改哪一行? #
9721次浏览 140人参与
查看18道真题和解析