免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6355 | 回复: 17

考考大家,有关send,recv [复制链接]

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
发表于 2011-08-18 10:45 |显示全部楼层
5可用积分
本帖最后由 chenzhanyiczy 于 2011-08-18 13:56 编辑

很简单的问题。

如果在write()的时候发生超时错误,此时close()还会经历这些状态吗(即FIN_WIAT_1->FIN_WAIT_2->TIME_WAIT->CLOSED)? 理由?

论坛徽章:
0
发表于 2011-08-18 10:48 |显示全部楼层
本帖最后由 jiayanfu 于 2011-08-18 10:53 编辑

我日。。。一考就挂。。。分析中。。。

论坛徽章:
0
发表于 2011-08-18 10:49 |显示全部楼层
感觉这两者之间没有必然联系吧

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
发表于 2011-08-18 11:06 |显示全部楼层
写超时是什么概念呢?
阻塞模式返回写超时应该是一个操作系统bug
非阻塞模式只会返回EAGAIN 或者 EWOULDBLOCK 之类, 所以也应该是bug
而且, 所谓超时, 自然要有时可以超, write 不带最大超时值, 超时从何说起?
如果是非阻塞, 返回EAGIN 之类, 只是发送缓冲无法在接收新的数据, 连接没有任何问题

TIME_WAIT 发生于主动关闭时, 是为了防止另一端收不到最后一个ACK, 只要之前连接是好的, 也就是说, 不是被动关闭, 那就会进入这个状态
和write返回所谓超时没什么没关系, 如果它返回 ECONNRESET 这些到不会进入 TIME_WAIT

论坛徽章:
0
发表于 2011-08-18 11:50 |显示全部楼层
回复 4# zylthinking


    求大牛指点,如果本地发送完了FIN以后一直收不到ack呢,会进入time_wait状态吗?

论坛徽章:
0
发表于 2011-08-18 12:13 |显示全部楼层
本帖最后由 jiayanfu 于 2011-08-18 12:17 编辑

不一定。
1、如果close动作时以及以后都能够正常通信的话,进入time_wait我想大家都没有是没意见吧。。。
2、如果close动作以后,没有受到对应的ack,那么可能出现两种状态,首先是fin_wait1,然后还可能出现closing状态,我想到这儿大家也都能同意吧。。。如果一直收不到对应的ack的话,该端口会直接释放掉,不会进入time_wait状态。
FIN_WATI1.JPG
close.JPG

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
发表于 2011-08-18 12:25 |显示全部楼层
不一定。
1、如果close动作时以及以后都能够正常通信的话,进入time_wait我想大家都没有是没意见吧。。。
如果一直收不到对应的ack的话,该端口会直接释放掉,不会进入time_wait状态
jiayanfu 发表于 2011-08-18 12:13


这个没有亲自验证, 不敢保证所说正确, 但一直收不到ack, TCP 本身的 重传定时器 应该会起作用, 因此 FIN 应该会重传。 理论上, 只要不是连接彻底断了, 连续发送的fin总会有某个ack能够回来的, 如果彻底断了, 自然有icmp 回来, 这时候应该是被动关闭了(???) 所以到底进不进time_wait 我不知道

论坛徽章:
0
发表于 2011-08-18 12:51 |显示全部楼层
本帖最后由 jiayanfu 于 2011-08-18 12:55 编辑

回复 7# zylthinking

   前半部分,有道理,应该会有重传,只要收到了,那时本地的socket状态应该会有改变。。。。
   如果认为是彻底断了,一直收不到ack的话,我觉得应该就不会进time_wait了吧,还等待干嘛,继续等待好像也没什么意思了(理论上哈!{:2_169:},貌似我上面的验证结果是这样 )

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
发表于 2011-08-18 13:54 |显示全部楼层
回复 4# zylthinking


    "写超时是什么概念呢?
阻塞模式返回写超时应该是一个操作系统bug
非阻塞模式只会返回EAGAIN 或者 EWOULDBLOCK 之类, 所以也应该是bug
而且, 所谓超时, 自然要有时可以超, write 不带最大超时值, 超时从何说起?
如果是非阻塞, 返回EAGIN 之类, 只是发送缓冲无法在接收新的数据, 连接没有任何问题 "

-->错了。
写是有超时的概念,write()的时候只是将数据copy到内核缓冲区中,接着内核会发出这些数据,这个发出是有时间限制的。一般都是15分钟左右。
而且这个跟阻塞、非阻塞没有关系。


" 这个没有亲自验证, 不敢保证所说正确, 但一直收不到ack, TCP 本身的 重传定时器 应该会起作用, 因此 FIN 应该会重传。
理论上, 只要不是连接彻底断了, 连续发送的fin总会有某个ack能够回来的, 如果彻底断了, 自然有icmp 回来, 这时候应该是被动关闭了(???)
所以到底进不进time_wait 我不知道  "

-->
这个也错了。
不会连续发送fin的。有时间限制的。



当然我问得也妥当,应该为:

如果在write()的时候发生超时错误,此时close()还会经历四次握手的状态吗(即FIN_WIAT_1->FIN_WAIT_2->TIME_WAIT->CLOSED)? 理由?

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
发表于 2011-08-18 14:12 |显示全部楼层
回复  zylthinking

写是有超时的概念,write()的时候只是将数据copy到内核缓冲区中,接着内核会发出这些数据,这个发出是有时间限制的。一般都是15分钟左右。
而且这个跟阻塞、非阻塞没有关系。

chenzhanyiczy 发表于 2011-08-18 13:54


这个有什么资料么? 为什么内核协议栈会15分钟发不出数据呢, 电气接口不至于如此的, 应该就是拥塞的原因吧, 那么协议栈碰到了这样严重的拥塞, 就是简单放弃连接吗?? 以后的read/write 错误是哪一个? ECONNRESET??
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP