问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Golang 解决TCP“粘包“问题

发布网友 发布时间:2023-07-05 21:15

我来回答

1个回答

热心网友 时间:2023-11-02 15:59

TCP 协议是面向连接,可靠的流式协议,当 Server 去 Read 的时候,每次读到的数据都不一定是完整的,该方法会返回读到的字节数,因此,当我们写 Server 的时候,什么时候去回调用户设置的 callback ?也就是怎么样保证每次都能拿到一个完整的包数据,这个就是”粘包“问题的由来。

传统的,有两种方法解决。一是分隔符协议,即每条消息结尾设置固定分隔符,Server 读到分隔符就认为读到了完整的包数据;二是长度协议,即在每个消息头部设置固定长度的字段,表征消息长度,再往后读取该长度的消息即可。

目前长度协议用的较多,因为分隔符协议需要 Server 不停的检测,很耗费性能。长度协议实现中比较重要的点是头部的长度以及字节序,2个字节可表示 2^16-1个字节的内容,如果不够,那就上4字节,字节序相关的只是可以参考: ”字节序“是什么鬼?

先来个没处理粘包的:

common/server.go:

测试一下:

因为每次只读5个字节,可以明显看到消息”乱了“,但就算把这个值增大,你只要是设置了,就会存在这个问题。

delimeter/server.go:

还是拿上个测试脚本跑,结果:

这次看到每个消息长度不一样,但是都是”完整的“。

length/server.go:

client 也得相应调整:

测试结果:

效果跟分隔符协议一样,都可以解决”粘包“问题。

只要是 TCP 协议,任何语言都需要处理 ”粘包“ 问题,我们用 PHP 写一个客户端测试一下:

完美!

只有在直接使用 TCP 协议才存在 "粘包" 问题,其上层应用层协议比如 HTTP ,已经帮我们处理好了,无需关注这些底层,但是我们自己实现一个自定义协议,就必须考虑这些细节了。

2021-03-08

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
现在思科的CCNA,CCNE,CCIP的考证费分别是多少啊,通过率怎样 长春小飞没有车没有房 碳钢的多久生锈 碳钢多久会生锈 碳钢多长时间会开始生锈 碳钢和铝哪个容易生锈 梦见天宫图是什么意思 光遇2023好友树解锁图鉴 光遇二级节点多少个 ...火柴小女孩》《词语手册》里有很多词语的意思的,求告知 暖融融解释 丑女大翻身的问题 golang和java处理tcp效率 Golang 建立TCP时使用连接池 《老千》 锦绣未央贴身侍卫演员 就是冬天被冻住的玻璃容不容易碎呢? 想要在院子里铺上大理石玻璃地板,请问冬天会冻裂吗? 成都世界乐园有什么交通工具 亚洲成都世界中国四川 范围由大到小___? 山西省公务员是联考吗 山西公务员考试是联考吗 云南省土地使用税实施细则 山西是不是联考省份 昆明土地使用税征收标准 昆明市西山区土地使用税的税率是多少? 山西省省考是联考么 原木色的装修风格为什么这么受欢迎? 梦幻西游手游花果山什么角色可以玩 梦幻西游手游玲珑姝怎么样 营业执照指定或委托代理人怎么填? 真情电波的电影剧情 英雄无敌之国战最新章节谁有啊? 姐姐进新房子舅舅是不是一定要去还是不用去? 姐姐房子刚刚入伙,妹妹想借来当娘家的出嫁房来用,对姐姐有影响吗?谢谢解答! 姐姐家进新房子办了酒席,喝酒的时候我作为外公外婆方面要跟嘉宾说几句好话,应该怎么说,把握哪几个方面 27岁的女孩子和20岁的女孩子差别大吗? 200兆瓦光伏发电站大吗 青春期多少岁到多少岁 毫无违和感是什么意思 毫无违和感是什么梗 李连杰电影的问题 找一张图片,差不多是一个人闭着眼,双手搂着某个东西,闭着眼。大致这样的图片。 法律规定结婚不许离婚的国家是哪个国家啊!我记得是一个岛国 印度洋的好像!不是爱尔兰哦! 出版书需要epub格式排版吗 哪几个欧洲国家不允许离婚? 人活着是不是要以享受生活为目的? 2017款丰田塞纳XLE四驱报价 丰田塞纳LE最低多少钱 七个半月生的双胞胎以后大脑发育正常吗? 诗词大杂烩 小米摄像头远程连接 如何从生辰八字看五行,怎么通过一个人生辰八字 看五行缺什么。