golang 有什么 TCP 框架?

2021-08-17 22:58:27 +08:00
 zyxk
可以管理连接, 心跳包 处理粘包等,
web 方面的很多, tcp 的没找到,大家做 TCP 都用什么呢?
14533 次点击
所在节点    Go 编程语言
118 条回复
YuSheen1024
2021-08-18 10:59:09 +08:00
应用层出问题,非要怪到网络层( TCP )?
msaionyc
2021-08-18 11:03:33 +08:00
@ming159 TCP 协议里明明白白写了:面向流。它把数据以流的形式,可靠地发送给接收方,它的事情就完美地做完了。
你们提出的“粘包”概念是应用层自己该解决的,你们可以说,应用层的粘包问题,但说“TCP 的粘包问题”,是不严谨的
darknoll
2021-08-18 11:03:57 +08:00
@ming159 你不能直接发数据啊,你得在前面加上协议 magic number+数据长度
ming159
2021-08-18 11:04:02 +08:00
@ckdxc 你说的这是一种,我没记错,应该叫做 "定长协议" ,就是一个数据段固定长度,比如 512 个字节.每次固定取这么长度的就可以.
但是还有"可变长度"的协议,就需要在数据段中某个固定位置上指示 本次数据自身的长度,例如: #3abc,#5abcde.
表示 #开头,随后的数字表示后续数据的长度,比如 3,5,分别表示在此之后还有若干个数据才算一段完整的数据集.

还有另外一种,固定以回车换行符为分隔符的,无论多长,只要有回车换行符就切断
ZHanYao
2021-08-18 11:07:35 +08:00
这本来就是应用层的问题,你们非要往网络层扯?

我家鸡蛋孵出来了一只鸡,但是这只鸡不会飞是什么原因?
粘包警察:鸡蛋都没有翅膀,怎么可能会飞!
ming159
2021-08-18 11:14:05 +08:00
“TCP 的粘包问题” 确实不严谨.这点我也承认.

"基于 TCP 传输数据,必然存在应用层数据的 粘包 /拆包问题".

如果写过 TCP 通信(Socket 编程)的懂得自然懂,不懂得说多了也没用, 可以参考 Netty 中的
LineBasedFrameDecoder : 基于回车换行符的解码器
DelimiterBasedFrameDecoder: 分隔符解码器,可以指定消息结束的分隔符
FixedLengthFrameDecoder: 固定长度解码器,它能够按照指定的长度对消息进行自动解码
LengthFieldBasedFrameDecoder :一般协议头中带有长度字段,通过使用 LengthFieldBasedFrameDecoder 传入特定的参数,来解决拆包粘包
ZHanYao
2021-08-18 11:15:04 +08:00
@msaionyc #62 严格来说是这样的,但是人与人沟通没必要这么抠字眼,能理解就行,就像叫人吃饭,难道就真的只吃饭不吃菜?

楼主只是想找个在应用层可以处理粘包问题的框架,并没有将“粘包问题”甩锅给 TCP 的意思,但是为什么要抓住这个点不放呢?
paoqi2048
2021-08-18 11:17:16 +08:00
自己包下 net 库吧
ming159
2021-08-18 11:17:59 +08:00
@darknoll 不是说所有协议都是这种模式"magic number+数据长度". 自己研究去吧
95276
2021-08-18 11:22:18 +08:00
@ZHanYao 因为抓不到其他的点.
tairan2006
2021-08-18 11:22:35 +08:00
不需要框架,直接用 net 包就行

一般用 bufio.Scanner 的 Split 就可以拆分 token 了

如果想简单点可以直接用 websocket
deavorwei
2021-08-18 11:45:52 +08:00
@ming159 您好,请教下粘包的问题。TCP 有重传机制和 ACK 机制,经过 TCP 传输的数据包应该是可靠的。应用层拿到的数据包应该也是完整的、有序的,为何会出现应用层接收到数据包是不完整或者是乱序的情况。---来自没有开发经验的小学生
nowgoo
2021-08-18 12:08:26 +08:00
是个程序员都明白,人家问的就是应用层有没有“从字节流中拆出消息”的轮子。粘包警察纠着“粘包”两个字不放有意思吗?难道楼主不知道 TCP 是流协议,要你教?

楼主明明说了使用“粘包”和“拆包”是因为描述方便。粘包警察会因为老婆饼里没老婆跟老板打一架吗?
darknoll
2021-08-18 12:16:32 +08:00
@ming159 那你得把问题表达出来啊,什么情况下不能用这种模式,问题都不说来别人怎么 show code 啊。
blessingsi
2021-08-18 12:21:35 +08:00
@deavorwei 理解一下[流]协议这个说法。TCP 协议的有序性和完整性保证是针对整个流来说的,并不是代表接受端的每次 read 拿到的恰好是发送端每次 write 的内容。比如,当 TCP 一个包过大的时候,会在实际传输的时候拆开
Lemeng
2021-08-18 12:26:26 +08:00
学习学习来的,绑定一下
mxT52CRuqR6o5
2021-08-18 12:56:49 +08:00
我觉得你需要的并不是裸 TCP
Guidance3204
2021-08-18 13:45:21 +08:00
我前几天正好写了一个序列化,反序列化消息到 struct 的库 https://github.com/lai323/bytecodec
zxCoder
2021-08-18 14:15:03 +08:00
@nowgoo 真的是笑死了,粘包警察和 c++的语言律师简直就是编程界两大 sb
Frytea
2021-08-18 14:16:52 +08:00
ZeroMQ? 之前做 C 开发经常用

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/796420

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX