免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: lz_fine
打印 上一主题 下一主题

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

论坛徽章:
0
11 [报告]
发表于 2009-07-27 17:15 |只看该作者
原帖由 lz_fine 于 2009-7-27 14:38 发表


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


那你发送端也直接从底层发算了,什么都绕过去了。基于协议栈的话TCP根本没提供这种类似于UDP的功能,只有最新的SCTP才有。

从Linux协议栈的代码看,在tcp.c::tcp_sendmsg中是有可能把当前想发的数据合并到前面已经有的skbuff中的,那么这样到底层它就是一个IP报文件了;Nagle好像只影响发送时判断能否发送,已经在这之后了。

论坛徽章:
0
12 [报告]
发表于 2009-07-27 17:17 |只看该作者
原帖由 cookis 于 2009-7-27 15:35 发表
包个包头,标识每个包的长度,不就行了,<粘包>这个词是你发明的吧,你应该多了解一下TCP,然后正确使用它


现在就是有包头的,但如果两个包合并到一起还是比较麻烦的,最好情况就是一个包一个包发送,这样接收方就可以省很多事。
还有<粘包>不是我发明的,是我在网上搜索这个问题时,很多人都是这么定义这种情况的

论坛徽章:
0
13 [报告]
发表于 2009-07-27 17:19 |只看该作者
原帖由 Cyberman.Wu 于 2009-7-27 17:15 发表


那你发送端也直接从底层发算了,什么都绕过去了。基于协议栈的话TCP根本没提供这种类似于UDP的功能,只有最新的SCTP才有。

从Linux协议栈的代码看,在tcp.c::tcp_sendmsg中是有可能把当前想发的数据合并 ...


但是发送端是visual studio实现的,直接从底层显然要麻烦的多

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

相当于自己实现一遍TCP了,工作量很大的说。用UDP吧,做些简单的超时处理,心跳处理就行了

论坛徽章:
0
15 [报告]
发表于 2009-07-27 18:01 |只看该作者
原帖由 cugb_cat 于 2009-7-27 17:51 发表

相当于自己实现一遍TCP了,工作量很大的说。用UDP吧,做些简单的超时处理,心跳处理就行了


没办法,客户要求的,必须要有TCP的。

论坛徽章:
0
16 [报告]
发表于 2009-07-27 18:14 |只看该作者
如果用TCP,还是不要取巧了,对端老老实实按自定义的应用层协议“缓存+解析"吧。如果不是直连的,还要考虑PMTU,TCP是尽量避免IP Fragmentation的。

还有一点我不太明白,要直接收IP报来支持TCP,你的接收端设计接复杂的,要支持TCP的状态机及许多东西。既然自己实现TCP了,那干脆在Windows上自己实现一个,直接绕过协议栈通过网卡发包。

[ 本帖最后由 Cyberman.Wu 于 2009-7-27 18:18 编辑 ]

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

回复 #15 lz_fine 的帖子

呵呵,给你个链接,你看看用他的这个算了。
http://www.w3china.org/dispbbs.a ... D=131131&skin=1
或者看看tcpip协议三卷那书,有代码,下下来,改吧改吧。
不过任何一个都比用socket麻烦多了,兄台倒霉了。

论坛徽章:
0
18 [报告]
发表于 2009-07-27 18:20 |只看该作者
唉,难道让发送方分包就这么难吗?

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

回复 #18 lz_fine 的帖子

加个简单的包头嘛,自己定义个简单的,发送的时候加上,接收的时候,就按你的包头找数据不就行了。
包头里一般有:总包数,包序号,包数据长度,还可以有包头校验和之类。
你自己用,随便定义,多方便。

论坛徽章:
0
20 [报告]
发表于 2009-07-27 19:39 |只看该作者
在应用程定义自己的ACK就行了, 收到ACK之后再发下一个包,不过影响效率
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP