免费注册 查看新帖 |

Chinaunix

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

[内核入门] 关于服务端到底是收到ack后变成TCP_SYN_RECV还是发送syn/ack后就变成TCP_SYN_RECV? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-11-29 11:42 |只看该作者 |倒序浏览
代码中tcp_v4_hnd_req在收到ack后才变更状态 newsk->state = TCP_SYN_RECV,是不是说客户端只要不发ack,服务端就不可能有 TCP_SYN_RECV的状态?
这和原来的理解不一样啊,原来都是说服务端收到syn 发送syn/ack后状态就成了TCP_SYN_RECV,接到ack后再变成established状态。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
2 [报告]
发表于 2012-11-29 11:53 |只看该作者
回复 1# ever027
印象中之前翻过代码,收到 ACK 之后才变成 SYN_RECV,然后这个状态好像很短,很快就会变成 ESTABLISHED 的状态


   

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
3 [报告]
发表于 2012-11-29 12:07 |只看该作者
本帖最后由 Godbach 于 2012-11-29 13:53 编辑

回复 1# ever027

这会儿让没看代码,感觉可能是这样的:
(1)这个 SYN_RECV 应该是记录的收到真正要建连的 SYN 包之后的状态,这个状态的判断是需要收到 ACK,才能判断出
(2)然后将状态修改为 SYN_RECV
(3)接着将这个连接从半连接队列中取出,转移到 accept 队列中,完成之后,修改为 ESTABLISHED。

可能说的不是很准确,你可以参考代码看一下。


   

论坛徽章:
0
4 [报告]
发表于 2012-11-29 13:48 |只看该作者
回复 3# Godbach
说的很准确,基本是这个样子。


   

论坛徽章:
0
5 [报告]
发表于 2012-11-29 13:52 |只看该作者
本帖最后由 ever027 于 2012-11-29 13:52 编辑

多谢,有个疑问,我们在遇到syn攻击的时候会有很多syn_recv的状态。那么,natstat -an出来的状态和上面的状态是一致的吗,如果是一致的,那么因为这个状态时间非常短,是说不通的,如果不是一致的,那应该是natstat -an出来的syn_recv状态其实是接到syn,并发送syn/ack后一直到接到ack及变成ESTABLISHED这期间的状态。而不仅仅是收到ack到变成ESTABLISHED这之间的这么短的时间,不知道我这样推测是不是对的?

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
6 [报告]
发表于 2012-11-29 13:55 |只看该作者
回复 5# ever027
你问题看的很准。

个人觉得,netstat 的那个 SYN_RECV 是和 Linux 内核实现中的 SYN_RECV 有区别的。

netstat 的那个应该就是收到 SYN 包了,就标记一个 SYN_RECV。 这个地方,可以看一下 netstat 的手册,手册是是怎么解释 SYN_RECV 的,不行就可以考虑看看代码了。


   

论坛徽章:
0
7 [报告]
发表于 2012-11-29 20:32 |只看该作者
netstat状态是从/proc/net/tcp等proc文件系统读出来的,/proc/net/tcp在输出状态为LISTEN的情况时,会查找半连接队列,如果存在,会置状态为SYN_SENT
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP