免费注册 查看新帖 |

Chinaunix

广告
  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2955 | 回复: 11
打印 上一主题 下一主题

还是协议包的问题,一直搞不清,希望高手给个提示 [复制链接]

论坛徽章:
1
15-16赛季CBA联赛之佛山
日期:2015-12-14 17:57:31
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-09-07 19:43 |只看该作者 |倒序浏览
tcp的socket发了两个包,buffer的内容分别是a和b,接收到的是否可能是ab连在一块的一个包?就是说一端write了两次,另一端read一次就行。
相反,假如一端发了一个包内容是ab,另一端是否有可能得read两次分别是a和b这样的情况。

以上的两种情况是否是正常情况,是否是由协议栈来完成的?谢谢了!

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
2 [报告]
发表于 2010-09-07 19:51 |只看该作者
tcp的socket发了两个包,buffer的内容分别是a和b,接收到的是否可能是ab连在一块的一个包?就是说一端write了两次,另一端read一次就行。
-->如果发送端只是发送这两个包,之前没发送其他数据包,那么不管是否有N算法,都不会把a和b连在一块作为一个包发送,但read可能只读一次

相反,假如一端发了一个包内容是ab,另一端是否有可能得read两次分别是a和b这样的情况。
-->不会

以上的两种情况是否是正常情况,是否是由协议栈来完成的?
-->是的

论坛徽章:
1
15-16赛季CBA联赛之佛山
日期:2015-12-14 17:57:31
3 [报告]
发表于 2010-09-07 20:00 |只看该作者
多谢了!

就是说接收端在read之前协议栈可能会做一些重组操作,但不会做拆分操作。是这样吗?

论坛徽章:
0
4 [报告]
发表于 2010-09-07 20:03 |只看该作者
tcp是面向流的,所以收到的包肯定是连在一起的。。
TCP/UDP简单介绍

   1. UDP基于数据报,而TCP基于流.例如,如果TCP对端发送了三个256字节的数据缓冲区,与之相连的对端应用会依照他们的传送顺序收到768字节数据,但这些数据可能会分布在数目不定的不同块中,块与块的分界不会有任何保证.与之相反,如果UDP对端发送了三个256字节数据报,对端的接收方会收到其中的任意0.1.2.3个数据报.但是,所收到任何一个数据报都是所发送的完整的256字节数据报,一个也不会断开或合并在一起.因此, UDP传送是面向记录的,而使用TCP,你需要通过某种方式正确的提取数据流.
   2. UDP不保证数据的到达或到达顺序.而TCP则保证所收到的任何数据都是正好所发送的数据,并且保持他们按照顺序到达,UDP只尽力进行递送.如前面所示,三个256字节的数据报可能不会全部到达.所收到的任何数据报都将是所发送的完整的\正确的数据报;但是,数据报可能会在传递过程中丢失或改变顺序.因此,尽管UDP减轻了你的负担,是你不必整编和解编字节流的数据,你需要对你的协议和/或应用所要求的可靠性负责。
   3. TCP是两个对端之间的一对一连接,而UDP提供了多种操作模式:单播、广播、多播。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2010-09-07 20:10 |只看该作者
因材施教,针对楼主的问题,我的答复是:
会的;会的。

论坛徽章:
1
15-16赛季CBA联赛之佛山
日期:2015-12-14 17:57:31
6 [报告]
发表于 2010-09-07 20:17 |只看该作者
假如一端发了一个包内容是ab,另一端是否有可能得read两次分别是a和b这样的情况。
==============
这种情况会发生吗?

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
7 [报告]
发表于 2010-09-07 23:39 |只看该作者
多谢了!

就是说接收端在read之前协议栈可能会做一些重组操作,但不会做拆分操作。是这样吗?
ruifengzhangyi 发表于 2010-09-07 20:00



    是的

论坛徽章:
0
8 [报告]
发表于 2010-09-08 01:27 |只看该作者
对四个问题的答复是:会的;会的;会的;会的。

论坛徽章:
1
15-16赛季CBA联赛之佛山
日期:2015-12-14 17:57:31
9 [报告]
发表于 2010-09-08 08:56 |只看该作者
确认一下,假如一端发了一个包内容是ab,另一端是否有可能得read两次分别是a和b这样的情况。
==============
这种情况会发生吗? 怎么有两个观点?

论坛徽章:
0
10 [报告]
发表于 2010-09-08 09:03 |只看该作者
本帖最后由 梅川内依酷 于 2010-09-08 13:44 编辑

回复 1# ruifengzhangyi


    对于面向流的TCP,你不用管底层怎么处理,就是write几次不管,就像你开几个水龙头往河里灌水,他都是按照流来的。你说的read是socket之上,你想read几次都可以。  buffer里有数据,就read上来,buffer里数据不够,就等待一下(阻塞socket),你担心的问题都不会有。就像你从一个水池里取水,取一通还是两桶一次,都可以。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP