免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 18127 | 回复: 21
打印 上一主题 下一主题

TCP分包问题(粘包) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-27 12:19 |只看该作者 |倒序浏览
用visual studio实现的程序使用TCP传输数据,如果保证连续发送的两帧或者多帧数据不合并成一包数据数据发送,或者出现以下情况:需要发送2帧数据,每帧300字节,结果数据被分成2包,第一包数据512字节,第二包数据112字节。
怎样才能让底层TCP协议根据应用层数据分别打包发送?
先谢谢大家了

[ 本帖最后由 lz_fine 于 2009-7-27 15:07 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-07-27 13:19 |只看该作者
TCP是流式协议,没有这种功能;而且就算你把发端修改了,收端如果是用正常的recv而不是直接从底层取IP报,还是会出现类似的现象。

不知道你为啥要这样做?

论坛徽章:
0
3 [报告]
发表于 2009-07-27 13:36 |只看该作者
tcp的分包要上层应用来做的

论坛徽章:
0
4 [报告]
发表于 2009-07-27 14:35 |只看该作者
socket关掉nagle算法可以吗。

论坛徽章:
0
5 [报告]
发表于 2009-07-27 14:38 |只看该作者
原帖由 Cyberman.Wu 于 2009-7-27 13:19 发表
TCP是流式协议,没有这种功能;而且就算你把发端修改了,收端如果是用正常的recv而不是直接从底层取IP报,还是会出现类似的现象。

不知道你为啥要这样做?


接收端是直接从底层取ip报的,只要发送端能够不粘包,接收端就能一帧一帧解析,因为应用层也有协议,同样有报头报尾,所以如果两个包组合成一个包,或者一个完整包被分成两次发送,会给接收方增加很大的解析难度

论坛徽章:
0
6 [报告]
发表于 2009-07-27 14:40 |只看该作者
原帖由 hostname 于 2009-7-27 14:35 发表
socket关掉nagle算法可以吗。


多谢,这个我试试
不过关闭nagle算法看起来并不一定能完全解决这个问题
基本上应该有两种可能性引起这个这个问题
1。应用层将第二帧数据发送给tcp程序,如果此时tcp程序还未将第一帧数据发送出去,这种情况下还是有可能出现我上面所说的情况的
2。应用层将第二帧数据发送给tcp程序,此时第一帧tcp数据已经发送出去了,但未收到收端应答,如果开启了nagle算法的话,就有可能将第二帧数据粘到第一帧数据之后再一起发送,如果关闭nagle算法应该是可以解决此种情况的

[ 本帖最后由 lz_fine 于 2009-7-27 14:54 编辑 ]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2009-07-27 15:35 |只看该作者
包个包头,标识每个包的长度,不就行了,<粘包>这个词是你发明的吧,你应该多了解一下TCP,然后正确使用它

论坛徽章:
0
8 [报告]
发表于 2009-07-27 15:50 |只看该作者
接收方直接接收ip包?那tcp的ack fin syc等包,还有拥塞控制等的,接收方也一并处理了?

论坛徽章:
0
9 [报告]
发表于 2009-07-27 15:56 |只看该作者

回复 #7 cookis 的帖子

7楼正解。
一般项目,都是应用软件,你要修改ip层的,或者一个什么底层的算法,就得考虑与其相关的东西。
就像8楼说的。
那样干实在是找罪受。

[ 本帖最后由 urapple 于 2009-7-27 16:02 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2009-07-27 17:14 |只看该作者
回复楼上的各位:
其实接收方是一个单片机程序来着,没有操作系统的,所以没办法,只能自己解析ip,tcp等等,如果是有操作系统的,资源比较丰富,即使不要求发送方分包,处理起来也不会太麻烦。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP