免费注册 查看新帖 |

Chinaunix

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

TCP 编程问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-23 11:41 |显示全部楼层 |倒序浏览
最近在看TCP/IP ,有一个问题在书上没有找到答案,感谢高手们帮我解惑!!

通过一个例子来描述我的问题

send(socket, buf, 1000,0 ); 书上说内核将buf的内容全部拷贝到套接口的发送缓冲区,send 就返回 1000 , 在应用层,我们就认为此次发送成功。

然而,此时TCP可能并没有将buf的内容发送到对端。如果TCP(TCP只保证可靠的传输,但并不保证100% 送到)发送失败了,应用层也不会知道,这样岂不会误导应用层???
也就是说应用层如果想要知道对端应用层是否真正的收到了数据,还需要在应用层也做一次确认?????

谢谢指点!

[ 本帖最后由 learntolinux 于 2009-5-23 11:55 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-05-23 11:54 |显示全部楼层
自己顶

论坛徽章:
0
3 [报告]
发表于 2009-05-23 12:37 |显示全部楼层
原帖由 lsupper 于 2009-5-23 12:29 发表
TCP发送失败,就返回结果 -1了,你就再重发吧,关于TCP底层自己的,把缓冲区的发过去,是它自己解决,应用曾只要判断send的返回值吧

关键是当次send 成功后,TCP 有可能 发送失败,也就是说我并不知道当次是不是数据真的发送到对端去了

论坛徽章:
0
4 [报告]
发表于 2009-05-23 12:39 |显示全部楼层
原帖由 lenky0401 于 2009-5-23 12:14 发表
这个不是应用程序层应该考虑的事情,TCP协议的可靠性会保证将这1000字节数据发送到对端。

只保证可靠发送,但是并不保证送达

[ 本帖最后由 learntolinux 于 2009-5-23 12:40 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2009-05-23 15:04 |显示全部楼层
原帖由 吃烤鱼 于 2009-5-23 14:12 发表



tcp会重新发送,直到送达

好像不是吧 , 重试的时间是有限制的 好像是4~10分钟吧

论坛徽章:
0
6 [报告]
发表于 2009-05-23 15:06 |显示全部楼层
原帖由 benjiam 于 2009-5-23 13:48 发表
红蓝军问题。 最后一次确认永远没办法确认是否成功送达

解决方案
1 应用层要自己设计协议来确认消息发送成功。
2 1问1答 1确认就可以了

我也是这么想的,这也是我最不想看到的结果 !!!

论坛徽章:
0
7 [报告]
发表于 2009-05-25 09:11 |显示全部楼层
原帖由 benjiam 于 2009-5-24 22:46 发表
其实 还是有很多细节没有仔细研究过

a b 建立连接 3步握手完成

非阻塞模式
a send 100 字节

如果b 没有返回ack 包, 也不返回rst . a 机器的反应。 是返回100 还是阻塞?

返回是等待b 返回ack, 还 ...


我看了一些资料,我理解的是 : 无论阻塞还是非阻塞,a send 100 字节, 压入栈就返回(资料上说拷贝到TCP缓存),这时 100自己有可能还在本端或是发到了对端但是对端还没有返回ack。如不对,请指正!  好像和楼上的观点部分相冲突,呵呵!!

[ 本帖最后由 learntolinux 于 2009-5-25 09:14 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP